今天在使用NGINX给一个服务配置负载均衡的时候, 有这样一个需求: 使用NGINX监听34595端口, 然后转发到本地部署在12345端口的服务上. 看起来很简单, 所以很快编辑了如下的配置文件:
server{
listen 34595;
server_name xxx.xxx.com;
location / {
proxy_pass http://127.0.0.1:12345;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Script-Name /;
}
}
看起来没什么问题, 来测试一下~ 访问xxx.xxx.com:34595
.
由于部署的服务需要登录才能访问, 所以正常来说, 直接访问主页会先跳转到登录页面xxx.xxx.com:34595/auth/login
.
但是这时问题出现了, 为什么访问主页之后直接跳转到xxx.xxx.com/auth/login
了? 我的端口号去哪儿了?
我们来分析一下问题原因.
首先直接访问ip_address:12345
, 测试后发现服务的各功能和跳转都正常, 那自然就排除这个服务的部署问题了. 所以问题一定出在NGINX上.
我们大多数时候, 让NGINX监听的端口默认都是80, 这次监听的端口是34595, 问题会不会出在这儿?
在查阅了NGINX相关的配置文档之后, 我终于找到出问题的配置行:
proxy_set_header Host $host;
在默认的情况下, 不指定端口号的时候, 通过这样的配置, NGINX会把请求自动转发到默认的80端口, 而不是我们现在让它监听的34595. 而我们大多数时候让NGINX监听的端口就是80, 这样并不会出现端口号对不上的问题.
所以为了让NGINX主动把端口号加上, 我们只需要这样稍作修改:
proxy_set_header Host $host:$server_port;
保存之后再
sudo nginx -s reload
就好了!
其实是个简单的小问题, 但是挺有趣的, 就记录一下~