关于NGINX配置了端口转发, 却又跳转回80端口的奇怪问题

/ 0评 / 0

今天在使用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

就好了!

其实是个简单的小问题, 但是挺有趣的, 就记录一下~

发表评论

电子邮件地址不会被公开。 必填项已用*标注