生产环境nginx,主要接收最前端的流量,然后负载均衡或者引流。记录下目前Nginx常用的一些配置与作用说明,通过这篇文章,可以了解到生产上各种nginx的使用方法与基础技巧
常用的一些nginx配置
- 测试环境本地项目调试
- 测试环境多端口调试
- rewrite常用用法
- root&alias用法与区别
- 生产环境切换
测试环境本地项目调试
server {
listen 80;
server_name xxx;
error_page 502 503 504 = @backurl;
location / {
proxy_pass http://$remote_addr:8888;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Real-IP $remote_addr;
}
location @backurl {
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Real-IP $remote_addr;
}
}
请求工作方法: 访问对应server时,首先找location对应的url,url则指向remote_addr(客户端IP,注意这里的remote_addr需要在nginx设置获取真实ip配置),当客户端本地未监听8888时,则重新将location指向服务端的8888,即完成测试环境代理本地项目测试需求
测试环境多端口调试
同一服务在测试环境部署N个,那么如何在浏览器指定port请求对应服务?
通过cookie是一种方法,与测试项目本地调试的配置类似
location / {
if ($cookie_port) {
set $apiport $cookie_port;
}
proxy_pass http://$remote_addr:$apiport;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Real-IP $remote_addr;
}
其实只需要nginx获取到客户端请求时传输的port变量即可,这里将port信息放到cookie中,同样可以放到请求的head中,nginx通过http_x_port来进行反代即可
rewrite常用用法
rewrite为了改写请求url,改变浏览器中的请求地址
有四个标签:
- last 匹配后继续匹配其他规则
- break 匹配后不匹配其他规则
- redirect 临时重定向
- permanent 永久重定向
用法1:location中直接将url第一个根路径以前的url替换成rewrite指定的url,正则有很多,具体参考nginx-rewrite正则相关的文章
rewrite ^/(.*) http://www.taobao.com/$1 permanent;
用法2:例如请求的url是taobao.com/xxx/aa
则rewrite成taobao.com/aa
并执行pass的跳转并且不会继续匹配aa对应的location
location /xxx {
rewrite ^/xxx(.*) $1 break;
proxy_pass http://xx.xx.xx.xx:port;
}
location /aa {
dosomething
}
用法3:在if判断中,例如如下防盗链配置请求资源。除none blocked域名外其他均rewrite掉
server {
listen 8080;
server_name xxx.abc.com
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { ## location /xx/ {
## root /xxx/xx;
valid_referers none blocked www.xxx.com www.yyy.com *.baidu.com *.tabobao.com;
if ($invalid_referer) {
rewrite ^/ http://www.xxx.com/images/forbidden.png;
}
}
}
rewrite使用方面有很多场景官方文档有详细说明:跳转
alias用法与区别
- root处理结果是将url指向location路径+root路径
- alias的处理结果是:使用alias路径替换location路径
alias目录名后面一定要加”/”,alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用,alias只用于location中
location ^~ /t/ {
alias /www/root/xxx/;
}
location = /favicon.ico {
alias /xxx/favicon.ico;
break;
}
location /xxx {
alias /xxx/dist;
index index.html;
生产环境切换
环境切换与端口切换类似,方法可以通过head或者cookie等进行传参,nginx中进行判断,根据不同的变量,进行不同的跳转
- 根据来源ip进行跳转
- 根据cookie是否包含version字段进行跳转
location /xxx/ {
set $xxxpassurl http://xxx-release;
if ($remote_addr ~ '(xx.xx.xx.x1|xx.xx.xx.x2)' ) {
set $xxxpassurl http://xxx-test;
}
if ($http_cookie ~ version\=release) {
set $xxxpassurl http://xxx-release;
}
if ($http_cookie ~ version\=ga) {
set $xxxpassurl http://xxx-test;
}
rewrite ^/xxx(.*)$ $1 break;
proxy_pass $xxxpassurl;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}