nginx
1.什么是nginx
nginx是一个高性能的http和反向代理服务器也是一IMAP/POP3/SWTP服务。
2.nginx的优势
1.处理响应请求很快,高并发连接
可大量并行处理。在官方测试结果中能够支持5W个并行连接。在实际的运作中可以支持2W~4W的
并行连接,作为对比tomcat的并行连接只有几百个。
注:并行与并发
并行是指在某一个时刻针对某一台服务器的访问数量,并发是每秒的访问数量(QPS)
QPS = 并行量/响应时间(s)
比如一个接口需要消耗100ms,用户流量平均,并行量为100W,那么qps就是1000w/s
2.很低的内存消耗,具有很高的可靠性、可扩展性
nginx优于apache web
3.支持热部署
master管理进程与worker工作进程的分离设计使nginx具有热部署的功能。可以在不间断服务的前提下升级ngnix的可执行文件,也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。
master进程是管理进程,worker进程是工作进程,worker进程挂了后master进程可以自动重启worker进程,worker进程负责接收请求。
3.ngnix的应用
1.正向代理
ngnix可以代理客户端发出请求。隐藏了客户端信息。
类似vpn,有明确的访问目标。可以通过ngnix代理访问twitter,google等外网。
1.访问原来无法访问的资源
2.可以做缓存加速访问资源
3.对客户端访问授权,上网认证
4.代理可以记录用户访问记录(上网行为管理)对外隐藏用户信息。
2.反向代理
正向代理代理的是客户端,反向代理代理的是服务器,代服务端接收请求,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
3.项目应用
在实际项目中可以使用正向代理代理客户端请求去访问目标服务器,目标服务器是一个反向代理的服务器,反向代理了多台真实的业务处理服务器。
4.配置文件结构
1.main层
影响nginx服务器整体运行的配置指令
可以配置用户组 默认为nobody
配置worker的进程数
2.events层
主要影响nginx服务器与用户的网络连接
网络相关配置 默认是epoll模型
3.http层
http块是nginx服务器配置的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中
4.server层
在使用nginx服武器提供的web服务器,利用虚拟主机的技术可以避免为每一个要运行的网站提供单独的nginx服务器,无需为每个网站对用运行一组nginx进程。
5.location层
基于nginx服务器接收到的请求字符串对除了虚拟主机外的字符串匹配,对待定的请求进行处理,地址定向、数据缓存和应答控制都是在这部分实现,许多第三方模块的配置也是在location层提供功能。
5.nginx的负载均衡
负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求,一个最基本的upstream模块是这样的,模块内的server是服务器列表:
#动态服务器组
upstream dynamicserver {
server 127.0.0.1:9001; #tomcat 1
server 127.0.0.1:9002; #tomcat 2
server 127.0.0.1:9003; #tomcat 3
server 127.0.0.1:9004; #tomcat 4
}
#其他页面反向代理到tomcat容器
location ~.*$ {
index index.jsp index.html;
proxy_pass http://dynamicserver;
}
负载均衡策略:轮询(默认)、权重、ip_hash(以前可以用来处理session共享登陆问题 根据ip的hash计算结果决定访问哪个服务器)、最小连接数(当前用户连接哪台服务器少就分配到哪台服务器)。
Ribbon和Nginx负载均衡的区别
Ribbon属于客户端负载,及在调用服务器以前,客户端自己根据策略,选择调用服务;
Nginx属于服务端负载,服务只管调用负载地址即,负载会自己选择服务端调用
6.nginx常用案例
1.代理静态文件:
server {
listen 8080;
server_name www.test.com
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
}
location /data/ {
alias ‘/usr/local/data/’;
#这里是重点,就是代理这个文件夹
expires 7d;
}
}
比如访问www.test.com/data/1.png 这样就可以访问到服务器中/usr/local/data/的1.png这张图片。
2.反向代理
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm .jsp;
}
}
proxy_pass配置就是这个nginx代理哪台服务器
3.跨域配置
server {
listen 80;
server_name www.test.com;
if ( $host ~ (.*).itcast.com){
set $domain $1;##记录二级域名值
}
#是否允许请求带有验证信息
add_header Access-Control-Allow-Credentials true;
#允许跨域访问的域名,可以是一个域的列表,也可以是通配符*
add_header Access-Control-Allow-Origin *;
#允许脚本访问的返回头
add_header Access-Control-Allow-Headers 'x-requested-with,content
type,Cache-Control,Pragma,Date,x-timestamp’;
#允许使用的请求方法,以逗号隔开
add_header Access-Control-Allow-Methods ‘POST,GET,OPTIONS,PUT,DELETE’;
#允许自定义的头部,以逗号隔开,大小写不敏感
add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server
Authorization’;
#P3P支持跨域cookie操作
add_header P3P 'policyref=“/w3c/p3p.xml”, CP="NOI DSP PSAa OUR BUS IND ONL
UNI COM NAV INT LOC"';
if ($request_method = ‘OPTIONS’) {##OPTIONS类的请求,是跨域先验请求 return 204;##204代表ok
}
}
4.防盗链
# 需要防盗的后缀
location ~* .(jpg|jpeg|png|gif|bmp|swf|rar|zip|doc|xls|pdf|gz|bz2|mp3|mp4|flv)$
#设置过期时间
expires 30d;
# valid_referers 就是白名单的意思
# 支持域名或ip
# 允许ip 192.168.0.1 的请求
# 允许域名 *.google.com 所有子域名
valid_referers none blocked 192.168.0.1 *.google.com;
if ($invalid_referer) {
# return 403;
# 盗链返回的图片,替换盗链网站所有盗链的图片
rewrite ^/ https://site.com/403.jpg;
}
root /usr/share/nginx/img;
}