Drcus | 王亚振

Drcus | 王亚振

随便写,记录点东西

Nginx proxy_pass 记录

发布于:  

proxy_pass

  • 不影响浏览器地址栏的url

  • 设置被代理server的协议和地址,URI可选(可以有,也可以没有)

  • 协议可以为http或https

  • 地址可以为域名或者IP,端口可选;

    proxy_pass http://localhost:8000/uri/;

  • 如果一个域名可以解析到多个地址,那么这些地址会被轮流使用,此外,还可以把一个地址指定为 server group(如:nginx的upstream)

    upstream backend {
        server backend1.example.com       weight=5;
        server backend2.example.com:8080;
        server unix:/tmp/backend3;
     
        server backup1.example.com:8080   backup;
        server backup2.example.com:8080   backup;
    }
     
    server {
        location / {
            proxy_pass http://backend;
        }
    }
  • server name, port, URI支持变量的形式 proxy_pass http://$host$uri;

    这种情况下,nginx会在server groups(upstream后端server)里搜索server name,如果没有找到,会用dns解析, 请求的URI会按照下面的规则传给后端服务,下面结合具体的例子来说明URI的传递规则,假设nginx中server部分的配置如下:

    server {
          listen       80;
          server_name example.com;
          proxy_read_timeout 120;
          proxy_send_timeout 120;
          include /etc/nginx/fastcgi_params;
    
          access_log  /var/log/nginx/access.log  main;
          error_log   /var/log/nginx/error.log;
    
          location / {
             ...
          }
    
    }

单独展开 URL 的传递的规则

  1. 如果proxypass的URL定向里包括URI,那么请求中匹配到location中URI的部分会被proxypass后面URL中的URI替换

    location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    请求http://example.com/name/test.html 会被代理到http://127.0.0.1/remote/test.html
  2. 如果proxy_pass的URL定向里不包括URI,那么请求中的URI会保持原样传送给后端server

    location /name/ {
       proxy_pass http://127.0.0.1;
    }
    
    请求http://example/name/test.html 会被代理到http://127.0.0.1/name/test.html
  3. 一些情况下,不能确定替换的URI

location里是正则表达式,这种情况下,proxy_pass里最好不要有URI

在proxypass前面用了rewrite,如下,这种情况下,proxypass是无效的

  location /name/ {
      rewrite    /name/([^/]+) /users?name=$1 break;
      proxy_pass http://127.0.0.1;
  }

记录一下,也方便以后查找。

~^_^~ 一片小花园 ?

赏赐