第三十六节、Nginx动静分离/upstream/rewrite/location匹配优先级

动静分离

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat、Resin出来动态页面。
动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。通过location指定不同的后缀名实现不同的请求转发。
通过在server段代码配置不同的location实现动静分离

####优先级最小,所有没匹配到的走根
 location /
    {
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://jvm_web1;
    }
####所有php/jsp之类结尾的动态页面走后端动态模块处理,波浪线~表示匹配
    location ~ .*\.(php|jsp|cgi|shtml)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass http://jvm_web1;
    }
####所有html/gif结尾的静态页面nginx本机直接处理
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
        root /data/webapps/wugk1;
        expires      30d;#expires 定义用户浏览器缓存时间30天,静态页面不经常更新的话可以节省贷款缓解服务器压力,第一次访问下载新文件状态200,以后直接访问本地缓存状态304,知道受访问文件发生变化或者时间到期
    }
参数讲解

Nginx常用配置参数有upstream,主要用于均衡后端多个实例:
Nginx 的upstream目前支持5种算法分配方式:
1)轮询(默认rr)
每个请求按时间顺序逐一分配到后端不同的服务器,如果后端某台服务器down掉,自动剔除,待恢复自动添加上。
2)Weight权重
指定轮询权重,权重越高,处理的请求就越多,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)ip_hash
每个请求根据访问的IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,一般用于登录会话。
4)fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5)url_hash(第三方)
upstream的 fail_timeout和max_fails参数是用来判断负载均衡upstream中的某个server是否失效。
在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。
例如在nginx.conf里面配置如下的tdt_app均衡:

upstream tdt_app {
    ip_hash;   #配置ip_hash算法保证每个用户只固定访问一个后端服务器
    server   10.10.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
    server   10.10.1.12:8080 weight=1 max_fails=2 fail_timeout=30s;
}

Tdt_app均衡两台后端JAVA服务,在30秒内nginx会与后端的某个server通信检测,如果检测连接失败2次,则Nginx会认为该server已经失效,然后踢出转发列表,然后在接下来的30s内,nginx不再讲请求转发给失效的server。
另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用proxy_connect_timeout和proxy_read_timeout来控制的。
proxy_connect_timeout : Nginx与后端服务器连接的超时时间,发起握手等候响应超时时间。
proxy_read_timeout:连接成功后_等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)。
proxy_send_timeout :后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据。
keepalive_timout:一个http产生的tcp连接在传送完最后一个响应后,还需要等待多少秒后,才关闭这个连接。

rewrite规则

Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等。
Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种:
1)last :相当于Apache里的(L)标记,表示完成rewrite;
2)break;本条规则匹配完成后,终止匹配,不再匹配后面的规则
3)redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
4)permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
5)last和break用来实现URL重写,浏览器地址栏URL地址不变。
如在sever段代码的location段上面插入rewrite规则

rewrite  ^/$  /index01.html  last;
#将默认网站根页面强制跳转到index01.html并且不现实跳转后的URL地址
*代表前面0或更多个字符
+代表前面1或更多个字符
?代表前面0或1个字符
^代表字符串的开始位置
$代表字符串结束的位置
.为通配符,代表任何字符
rewrite  ^/(.*)$  /index01.html  last;
#将网站根后缀的所有页面都跳转
rewrite  ^/test/(.*)$  /index01.html  last;
#只针对test二级目录以下的网页做跳转
#多个页面跳转
if ($host != ‘www.wugk.com’ ) {
rewrite ^/(.*)$  http://www.wugk.com/$1  permanent;
}
··· 
######location匹配优先级
匹配优先级由上到下依次递减
- location=               #location=/test/abc.html
- location完整路径  #location /test/abc.html
- location^~路径   
- location~*正则
- location路径

你可能感兴趣的:(第三十六节、Nginx动静分离/upstream/rewrite/location匹配优先级)