Nginx生产实践

生产环境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;
        }  

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦