nginx location细解

location 有几个坑需要大家踩。

  1. 路由匹配成功后,跳转的新url尾缀,会带上原来的所有子路由。
    比如
server_name ftcrone.com;
location /api/ {
    proxy_pass http://www.baidu.com;
    proxy_set_header Remote_addr $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
}

ftcrone.com/api/user/ 会被代理至 www.baidu.com/api/user/ 而不是 www.baidu.com/user/

  1. 尽管匹配的权序是这样的:
    精准匹配(=) > 前缀匹配(^~) > 正则匹配(~) > 正常匹配()
server_name ftcrone.com;
location ~ / {
}
location ^~ /api/ {
    proxy_pass http://www.baidu.com;
}

前缀匹配会被~ / 匹配断掉当request满足 / 时,解决方法就是location位置反过来。

  1. rewrite使用实例:

假设服务部署在:7567
则输入/tmp/api/a/b/c/, 会匹配到 :7567/a/b/c/

location ~ /tmp/api/ {
   rewrite ^/tmp/api/(.*) /$1 break;
   proxy_pass http://localhost:7567;
}
  1. location共有的header,可以写进server里
server{
    proxy_set_header   Host             $http_host;
    proxy_set_header   Cookie           $http_cookie;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-Proto    $scheme;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    ...
    location ...
}

nginx 均衡上的一些示例

1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…

upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333 backup;  #热备     
    }

2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…

upstream mysvr { 
      server 127.0.0.1:7878;
      server 192.168.10.121:3333;       
}

3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…

 upstream mysvr { 
      server 127.0.0.1:7878 weight=1;
      server 192.168.10.121:3333 weight=2;
}

4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。

upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333;
      ip_hash;
    }

你可能感兴趣的:(nginx location细解)