Nginx从入门到放弃(二)
Ngnix反向代理
Nginx的方向代理,用户请求来的时候经过了nginx,回去也经过nginx,我们称之为隧道模式
这种模式nginx很容易成为瓶颈
如果要做成来的时候经过ngixn,回去的时候,后端服务器直接返回给用户,不再经过nginx,这叫DR模式
LVS就是这种
LVS直接被集成到Linux内核了
nginx在企业应用中的常见应用,是作为方向代理服务器
反向代理配置关键字:proxy_pass
反向代理群组配置upstream,weight, down,backup
反向代理常见的算法:
1)轮询,无法保持会话(用户session)
2)ip_hash,IP哈希,相同的来源IP,指向相同的后端服务器,很可能会有流量倾斜的问题,而且移动的用户session很可能无法保持
3)least_conn,最少连接数
4)url_hash,根据用户访问的url来转发流量到后端(同样会存在用户session的问题),适用于不需要维持会话连接,访问固定资源的时候
5)fair,根据后端响应时间来转发请求
session问题一般:
1)JAVA的SpringSession框架,可以使用redis解决这个问题
2)下发token,使用专门的服务器做权限认证,无状态会话保持
动静分离
静态资源不用去后端机器找,直接放在前面nginx的服务器,减少数据请求和网络传输的时间
比如,我们把js, img, css这些静态资源都放在html下面,然后写一个location的匹配规则就行,请求到nginx的时候,就直接放回这些静态资源了
location 后面的:
~* 开头表示不区分大小写的正则匹配
~ 开头表示区分大小写的正则匹配
/ 通用匹配,任何请求都会匹配到
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,
可以被规则^~ /static/ /aa匹配到(注意是空格)
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
匹配的优先级是,约精确的优先匹配
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求
rewrite
上面截图的rewirte规则写死了,重定向到一个页面
我们在浏览器输入http://abc.com/2.html ,访问到的实际是http://abc.com/index.jsp?pageNum=2,并且在浏览器显示的是2.html
换成写成一个正则的匹配是location ^/([0-9]+).hmtl$ /index.jsp?pageNum=$1 break;
break表示匹配到了就直接返回,不再往下匹配
rewrite规则后面,除了break,还有last, redirect,permanent这几个参数
如果是last就会继续往下匹配,匹配到最新的那个再返回
redirect ,临时重定向,会把真实的地址给带出来,用户访问2.html会在浏览器地址栏看到index.jsp?pageNum=2
这样可以对用户隐藏我们的的后端参数
permanent 永久重定向,效果跟redirect一样
nginx防盗链
对Nginx下所有项目的指定资源不同文件类型进行防盗链
比如对jpg、png、mp4等资源进行防盗链
location ~* \.(jpg|png|pm4)$ { #需要防盗链资源的文件类型
valid_referers none blocked abc.com; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou,soso,bing,feedsky,zhuaxia,photozero等域名放进来
if ($invalid_referer) {
#这样设置能够防盗链,不断地302重定向很多次,可能会加重服务器的负担,所以不建议这么做,除非有单独的图片服务器支持
#rewrite ^/ https://www.abc.com:90/picture/images/details-image-1.jpg; #如果有人非法盗链资源,则返回一张防盗链的图片, ^/匹配所有盗链请求
return 403; #或者返回403错误代码
}
}
对指定目录或者指定项目目录进行防盗链
比如Nginx下有3个项目,A、B、C,可以对A目录下的images进行防盗链,也可以对B目录下的images进行防盗链,也就是说,对指定目录进行防盗链。
location /picture/images/{ #在html目录下的picture项目下的images目录进行防盗链
valid_referers none blocked server_names abc.com;#允许访问目录的域名或IP
if ($invalid_referer){
return 403;
} #不允许访问返回403
}