路由虚拟服务器nginx转发400问题
背景:
关于网络和硬件:旧服务基本是在公有云服务器或提供公网IP的服务器操作的。
关于服务:后端jar服务运行,前端vue生成的包并通过nginx转发。
以前的nginx配置文件:
location / {
root /data/project/web/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8895/;
}
现状:
客户提供公网IP地址,但需要自己在路由器上配置。
关于路由器上配置虚拟服务器,主要指定协议,外网端口,内网服务器IP,内网端口等属性。
比如外网端口设为9000,内网IP:192.168.1.100,内网端口:80,则访问外网IP:9000,相当于转发到内网服务器IP80端口上,也就是把80端口提供给外网访问。
然后按之上配置nginx,会报400错误。看日志显示IP:9000:80类似的信息。
解决方案:
从以上日志查看,感觉IP后带两个端口,显示很奇怪,相当做了两次转发,于是把配置修改为:
location / {
root /data/project/web/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8895/;
}
主要去掉转发里的$server_port,重启后一切正常。
延伸:
还有一种方式,就是直接把公网IP设置在服务器,也应该可以访问,就不需要改配置了,但没有测试了。