MENU

解决nginx反向代理监听非80端口造成的端口丢失问题

2016 年 12 月 12 日 • 杂乱文章

最近要在公司内部上一套测试,需要配置外网访问,主要是web形式访问,用到了nginx代理,先是在华为路由器上折腾了一段时间,做了端口映射,外部80映射到内网nginx,搞了好长时间死活不通,最后看了一眼办宽带的合同,结果是运营商把80和8080端口封掉了,签合同时候没有申请开启80和8080端口,如果要开启,还要走备案流程一系列的东西,好麻烦,就想换个端口,用90,但是设置90之后也是死活不通,搞了半天路由器不支持回流,什么是回流?也有可能支持,但是我死活没找到,百度也翻不到,有会的大神请联系我,路由器型号USG2120BSR,既然局域网没办法通过外网访问,只好用机房的server 2008做测试了,但是出现了一个问题。

端口丢失

去访问90口加上项目名,不知为什么会自动跳回80端口,nginx配置文件如下。

    server {
        listen       90;
        server_name  your domain ;
        
        location / {
        proxy_set_header Host $host;
        proxy_pass http://www_server_plool;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
}

又找到了一台linux服务器,使用curl命令看了一下状态码是302,而且Location返回的地址90端口消失了,问题就出在了这里,我80口并没有NAT,所以根本访问不到。

20170905101654.png

原因

在内网80口代理的别的应用服务器,而不是现在要做的这套测试,所以又添加了一个配置文件,内网的nginx配置用的也是90端口,和外部端口一致,然后大概的查了一下,最后发现造成这个问题的原因是如果nginx的监听端口不是默认的80端口,改为其他端口,如90端口,后端服务器中request.getServerPort()无法获得正确的端口,返回的仍然是80,在response.sendRedirect()时,客户端可能无法获得正确的重定向url,而且在内网试了一下也有这个问题。

修改后的配置文件

    server {
        listen       90;
        server_name    your domain ;
        
        location / {
        proxy_pass http://www_server_plool;
        proxy_set_header  Host $host:$server_port;  #添加:$server_port
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
}

平滑重启nginx,最后使用curl命令看一下,返回地址正确。

20170905103511.png

最后编辑于: 2018 年 12 月 10 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码