Nginx配置proxy_pass转发/路径问题

时间:2020-12-11 15:00:50

proxy_ignore_client_abort on; #不允许代理端主动关闭连接

upstream的负载均衡,四种调度算法


#调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
upstream webhost {
server 192.168.0.5: ;
server 192.168.0.7: ;
}
#调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
upstream webhost {
server 192.168.0.5: weight=;
server 192.168.0.7: weight=;
}
#调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
upstream webhost {
ip_hash;
server 192.168.0.5: ;
server 192.168.0.7: ;
}
#调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
upstream webhost {
server 192.168.0.5: ;
server 192.168.0.7: ;
hash $request_uri;
}
#调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块

在nginx中配置proxy_pass时,如果是按照 ^~ 正则匹配路径时,要注意proxy_pass后的url最后的 /

如果加上了/,则会把匹配的路径部分也给代理走;

如果没有/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走。

(注意:这里说的是proxy_pass的url后面的"/",不是指location 后面的"/")

假如已有站点:http://js.test.com/test.html

location  /static_js/   { 
    proxy_pass http://js.test.com/; (这里的最后面的"/")
}

如上面的配置,如果请求的url是http://servername/static_js/test.html,会被代理成http://js.test.com/test.html

而如果这么配置

location  /static_js/  { 
    proxy_pass http://js.test.com; 
}

则会被代理到http://js.test.com/static_js/test.htm,产生无法访问从而报错

如果换成下面这样,也会报错:
location ^~ /static_js/ {
    proxy_pass http://js.test.com; 
}

但是,这样就没问题了:
location ^~ /static_js/ {
    proxy_pass http://js.test.com/
}

当然,我们可以用如下的rewrite来实现/的功能

location ^~ /static_js/ { 
    rewrite /static_js/(.+)$ /$1 break; 
    proxy_pass http://js.test.com; 
}


下面四种情况分别用http://192.168.1.4/proxy/test.html 进行访问。

第一种:

location  /proxy/ {

proxy_pass http://127.0.0.1:81/;

}

会被代理到http://127.0.0.1:81/test.html 这个url

第二咱(相对于第一种,最后少一个 /)

location  /proxy/ {

proxy_pass http://127.0.0.1:81;

}

会被代理到http://127.0.0.1:81/proxy/test.html 这个url

第三种:

location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx/;

}

会被代理到http://127.0.0.1:81/ftlynx/test.html 这个url。

第四种情况(相对于第三种,最后少一个 / ):

location  /proxy/ {

proxy_pass http://127.0.0.1:81/ftlynx;

}

会被代理到http://127.0.0.1:81/ftlynxtest.html 这个url