非标准端口的Nginx反向代理配置

问题说明

在使用Nginx反向代理一个Web应用的时候碰到的一个情况:

后端程序需要取得当前请求的的URL全路径,但是这个请求本身是通过Nginx做了反向代理,所以如果不加处理的话,后端程序取得的将是类似http://localhost:1234/xxxx这样的。

所以需要在Nginx的反向代理配置中加一些参数。

解决方案

比如把http://yourdomain.com/xxxx反向代理到后端,简单的配置如下:

# 在yourdomain.com的server段里配置
    location /xxxx {
        proxy_pass http://localhost:1234;

        proxy_set_header X-Real-IP $remote_addr;  # 实际的用户地址
        proxy_set_header Host $http_host;  # 设置Host为yourdomain.com
        proxy_set_header X-Forwarded-Host $host;  # 类似Host,不同的后端程序可能取不同的参数
        proxy_set_header X-Forwarded-Server $host;  # 同上
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录转发中间IP,每多一层自动加一个IP,以逗号分隔
    }

其中的关键在于不同的后端应用实现会取不同的参数,比如bottle的request.urlparts会取X-Forwarded-Host。另外,有些时候$host和$http_host取值会不同,需要实际测试选择。

高级问题

如果Nginx使用https,则还需要多传一个参数:

proxy_set_header X-Forwarded-Proto $scheme;

告诉后端使用了不同的scheme。

如果Nginx使用了非标准端口,则还需要修改参数(以bottle应用后端为例,其它应用可尝试另外两个参数):

proxy_set_header X-Forwarded-Host $host:$server_port;

当然,如果前面还有防火墙的端口映射,那么就把server_port改成实际的端口号(比如$host:81)即可。

推送到[go4pro.org]