非标准端口的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]