简介

说明

本文介绍Nginx的proxy_pass的使用。

相关网址

nginx官网:Module ngx_http_proxy_module

示例

假设下面四个示例都是访问 http://192.168.1.1/proxy/test.html。

例1:ip带/

location /proxy/ {
    proxy_pass http://127.0.0.1/;
}

代理到URL:http://127.0.0.1/test.html

例2:ip不带/

location /proxy/ {
    proxy_pass http://127.0.0.1;
}

代理到URL:http://127.0.0.1/proxy/test.html

例3:ip+path带/

location /proxy/ {
    proxy_pass http://127.0.0.1/aaa/;
}

代理到URL:http://127.0.0.1/aaa/test.html

例3:ip+path不带/

location /proxy/ {
    proxy_pass http://127.0.0.1/aaa;
}

代理到URL:http://127.0.0.1/aaatest.html

概述

作用

        nginx可以使用proxy_pass配置的url去替换location指定的部分。

        当访问的url匹配location时,实际会被nginx转发到proxy_pass的url(不影响浏览器地址栏的url)。

        建议所有的 proxy_pass 后的url都以“/”结尾。

配置语法

Syntax:	proxy_pass URL;
Default:	—
Context:	location, if in location, limit_except

        url用于设置代理服务器的协议和地址,以及uri。一般表现形式为:protocol://ip:port[uri] 或者 protocol://domain[uri]

        URL末尾是否存在uri的处理逻辑不同,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。

详解

url中带URI

判断方法

如果域名后面带了“/”,则表示url带了URI。比如:

• proxy_pass http://127.0.0.1/
• proxy_pass http://127.0.0.1/aaa
• proxy_pass http://127.0.0.1/aaa/

转发规则

若匹配location路径,则使用proxy_pass配置的url去替换。

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

如下图所示:使用http://127.0.0.1/remote/去替换URI中http://originhost/name/这一段

nginx proxy pass多个地址 nginx的proxy_pass_html

url中不带URI

判断方法

proxy_pass指定url中只有域名,比如http://127.0.0.1,则表示不带URI。

转发规则

location /some/path/ {
    proxy_pass http://127.0.0.1;
}

处理后的url = proxy_pass配置的url+原始url中URI

nginx proxy pass多个地址 nginx的proxy_pass_nginx_02

nginx无法确认url的替换规则

nginx又细分成3类

1.location指定的是正则表达式

        使用正则表达式指定location,而且这个location在locations中时,配置proxy_pass不能带URI。

2. path路径在location中使用rewrite重写了

比如

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

        这种场景,nginx会忽略proxy_pass中配置的URL,会使用替换过的整个请求URL去请求服务器。

3.proxy_pass配置的url中带变量

比如

location /name/ {
    proxy_pass http://127.0.0.1$request_uri;
}

如果proxy_pass配置的url经过变量转换后带path路径,则直接使用该url。

获得真实IP

存在的问题:经过Nginx转发后,应用程序获得的是Nginx所在服务器的ip等信息,无法获得用户的真实ip等信息。

解决方法:在Nginx进行配置,将请求header中用户的ip等信息传递给应用程序,配置示例如下(nginx.conf):

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    keepalive_timeout  65;
    
    upstream myapp {
        server 127.0.0.1:8080;
    }
    
    server {
        # 所有IPV4的地址
        listen       20000;
        # 所有IPV6的地址
        listen       [::]:20000;
        server_name  abc.com;
        client_max_body_size 20m;
        charset utf-8;
      
        location / {
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://myapp;
        }
    }
}

多个proxy_pass