Nginx Proxy_Pass和Rewirte的用法
在Nginx
中我们用的比较多的肯定就是server
和loction
模块,在模块中用的比较多的就是proxy_pass
和rewrite
,我们这里就来大概了解一下这二者的常用用法。
Nginx内置的常用变量
1 | $args #请求中的参数值 |
proxy_pass的用法
proxy_pass反向代理,主要用于请求的转发,先来看看常用的转发方式
先配置一个简单的html服务器:
1 | server{ |
1 | location /proxy1/{ |
访问:http://localhost/proxy1/index.html
,代理到 http://localhost:800/index.html
1 | location /proxy2/{ |
访问:http://localhost/proxy2/index.html
,代理到 http://localhost:800/proxy2/index.html
1 | location /proxy3/{ |
访问:http://localhost/proxy3/index.html
,代理到 http://localhost:800/web/index.html
1 | location /proxy4/{ |
访问:http://localhost/proxy4/index.html
,代理到 http://localhost:800/webindex.html
上面演示的只是简单的请求代理,一般我们还会用到较为高级一点的负载均衡,Nginx均衡策略有6种:
轮询:每个请求按顺序逐一分配到不同的后端服务器,如果后端服务器down掉,就不在分配;
1
2
3
4upstream webapi {
server 127.0.0.1:801 max_fails=5 fail_timeout=20;
server 127.0.0.1:802 max_fails=5 fail_timeout=20;
}权重轮询:根据后端服务器性能不通配置轮询的权重比,权重越高访问的比重越高;
1
2
3
4upstream webapi {
server 127.0.0.1:801 weight=2 max_fails=5 fail_timeout=20;
server 127.0.0.1:802 weight=6 max_fails=5 fail_timeout=20;
}ip_hash:根据请求的ip地址hash结果进行分配,同一个IP的请求会落在同一个后端,可以解决Session同步的问题;
1
2
3
4
5upstream webapi {
ip_hash;
server 127.0.0.1:801 max_fails=5 fail_timeout=20;
server 127.0.0.1:802 max_fails=5 fail_timeout=20;
}fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配;
1
2
3
4
5upstream webapi {
fair;
server 127.0.0.1:801 max_fails=5 fail_timeout=20;
server 127.0.0.1:802 max_fails=5 fail_timeout=20;
}url_hash:按访问url的hash结果来分配请求,使每个url落在同一个后端服务器,后端服务器为缓存时才用此种方式较妥。
1 | upstream webapi { |
- least_conn:把请求转发给连接数较少的后端服务器
1
2
3
4
5upstream webapi {
least_conn;
server 127.0.0.1:801 max_fails=5 fail_timeout=20;
server 127.0.0.1:802 max_fails=5 fail_timeout=20;
}说明:在单位周期为
fail_timeout
设置的时间,中达到max_fails
次数,这个周期次数内,如果后端同一个节点不可用,那么接将把节点标记为不可用,并等待下一个周期(同样时常为fail_timeout
)再一次去请求,判断是否连接是否成功。默认:fail_timeout为10s,max_fails为1次。在做请求转发的时候,有时候可能会遇到端口丢失的情况,这时候就需要在location模块做如下配置:1
2
3
4proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port; #这里是重点,这样配置才不会丢失端口Rewrite的用法
Rewrite
顾名思义,就是规则重写,主要功能是实现浏览器访问 Http URL的跳转,语法格式:rewrite <正则表达式> <代替的内容> <重写类型>;
,重写类型有4种:
- last:本条规则匹配完成后,继续向下匹配新的location URI规则;浏览器地址栏URL地址不变;一般写在server和if中;
- break:本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变;一般使用在location中;
- redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址;
- permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址;
示例说明:访问1
rewrite /rewrite.html /index.html last;
/rewrite.html
的时候,页面内容重写到/index.html
中,并继续匹配,浏览器URL地址不变
1 | rewrite /break.html /index.html break; |
访问/break.html
的时候,页面内容重写到/index.html
中,并停止后续匹配,浏览器URL地址不变
1
rewrite /redirect.html /index.html redirect;
访问/redirect.html
的时候,页面直接302重定向到/index.html
中,浏览器URL跳为index.html
1 | rewrite /permanent.html /index.html permanent; |
访问/permanent.html
的时候,页面直接301重定向到/index.html
中,浏览器URL跳为index.html
1
rewrite ^/html/(.+?).html$ /permanent/$1.html permanent;
把/html/*.html
301重定向到/permanent/*.html
1 | rewrite ^/(.*) https://www.baidu.com/$1 permanent; |
把当前域名的请求,重定向到新域名上,URL域名变化,域名后的路径不变,访问:http://localhost/s?wd=nginx%20rewrite%E8%AF%A6%E8%A7%A3&rsv_spt=1&rsv_iqid=0xd27651610002bd69&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_0&oq=nginx%25E4%25BB%25A3%25E7%2590%2586%25E7%25AB%25AF%25E5%258F%25A3%25E4%25B8%25A2%25E5%25A4%25B1&inputT=2230&rsv_t=3e937ZY1a4uEO2TEPB%2BcJfOX%2FgNXA%2B26nrz3bOXnJHZUv6OAhomZhXh74aAaaNCm3897&rsv_pq=b9fe0f2a0000ae48&rsv_sug3=127&rsv_sug1=88&rsv_sug7=100&rsv_sug2=1&prefixsug=nginx%2520Rewrite&rsp=0&rsv_sug4=2409
, 地址会变为:https://www.baidu.com/s?wd=nginx%20rewrite%E8%AF%A6%E8%A7%A3&rsv_spt=1&rsv_iqid=0xd27651610002bd69&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_0&oq=nginx%25E4%25BB%25A3%25E7%2590%2586%25E7%25AB%25AF%25E5%258F%25A3%25E4%25B8%25A2%25E5%25A4%25B1&inputT=2230&rsv_t=3e937ZY1a4uEO2TEPB%2BcJfOX%2FgNXA%2B26nrz3bOXnJHZUv6OAhomZhXh74aAaaNCm3897&rsv_pq=b9fe0f2a0000ae48&rsv_sug3=127&rsv_sug1=88&rsv_sug7=100&rsv_sug2=1&prefixsug=nginx%2520Rewrite&rsp=0&rsv_sug4=2409
Nginx Proxy_Pass和Rewirte的用法