Azure虚拟机中Nginx托管双端口Node.js服务器的访问异常问题
问题分析与解决方法
核心问题
你当前的Nginx配置存在逻辑错误,同时访问public_ip:5000失败的原因可能涉及端口开放或Node服务绑定设置:
- Nginx的两个
server块都监听80端口,且server_name均为_,所有80端口的请求都会被第一个标记为default_server的块处理,第二个块永远不会生效。 - 你尝试直接访问
public_ip:5000时,请求是直接指向Node.js的5000端口,而非经过Nginx转发,因此当前的Nginx配置对这个请求没有作用。
解决步骤
方式一:直接访问Node服务(无需Nginx转发)
如果不需要Nginx的反向代理功能(比如静态资源托管、SSL等),可以直接让Node服务对外开放:
- 检查Node服务绑定地址:确保
app.js中监听的是0.0.0.0而非localhost,否则服务仅能在服务器内部访问。示例代码:app.listen(5000, '0.0.0.0', () => { console.log('Server running on port 5000'); }); - 开放服务器防火墙端口:
- 对于UFW防火墙:
sudo ufw allow 3000/tcp sudo ufw allow 5000/tcp sudo ufw reload - 对于firewalld:
sudo firewall-cmd --add-port=3000/tcp --permanent sudo firewall-cmd --add-port=5000/tcp --permanent sudo firewall-cmd --reload
- 对于UFW防火墙:
- 验证服务运行状态:在服务器上执行
netstat -tulpn | grep node,确认5000端口有Node进程在监听。
方式二:通过Nginx反向代理(用端口区分服务)
如果需要使用Nginx的功能,可修改Nginx配置,让Nginx分别监听3000和5000端口,反向代理到对应的Node服务:
# 处理3000端口请求 server { listen 3000 default_server; listen [::]:3000 default_server; server_name _; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 处理5000端口请求 server { listen 5000; listen [::]:5000; server_name _; location / { proxy_pass http://localhost:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
修改完成后,重启Nginx:
sudo systemctl restart nginx
同时按照方式一中的步骤开放3000和5000端口的防火墙规则。
额外排查点
如果执行上述步骤后仍出现502错误:
- 检查Node服务是否正常运行:执行
ps aux | grep app.js,确认进程存在。 - 测试服务器内部访问:在服务器上执行
curl http://localhost:5000,如果返回正常,说明服务本身没问题,问题出在网络层面(防火墙、云服务商安全组等)。 - 检查云服务商安全组:如果你的服务器是云主机,需要在安全组规则中添加允许3000和5000端口的入站流量。
内容的提问来源于stack exchange,提问作者Cash
相关产品推荐
相关产品推荐

