通过Nginx连接树莓派上的Node.js应用时出现502 Bad Gateway错误
Nginx代理/pub路径到Node.js应用返回502 Bad Gateway的解决办法
我之前遇到过完全类似的情况,结合你的配置和测试错误信息,问题其实出在两个关键点上:
问题根源分析
- 监听地址不匹配:你的Node.js应用明确绑定了
192.168.0.178这个局域网IP,但Nginx的proxy_pass却指向了localhost(也就是127.0.0.1回环地址)——Node.js根本没在这个地址上监听请求,所以Nginx找不到后端服务,直接返回502。 - 请求路径不匹配:就算解决了监听地址的问题,当你访问
/pub时,Nginx会把完整的/pub路径转发给Node.js,但你的Node.js代码里只有处理/路径的路由,没有对应/pub的逻辑,请求还是会失败。
最终修复后的配置
我调整后的Nginx配置同时解决了这两个问题,还加上了日志方便后续排查:
events { worker_connections 1024; } http { access_log /data/access_log.log; error_log /data/error_log.log debug; upstream backend { server 192.168.0.178:8081; # 和Node.js监听的IP保持一致,避免地址不匹配 } server { root /data/web; location / { } location /pub { rewrite /pub(.*) /$1 break; # 移除请求路径里的/pub前缀,让Node.js能匹配到/路由 proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } }
另外,也可以简化Node.js的监听配置,让它监听所有可用的网络接口(包括回环地址和局域网IP),这样就不用纠结Nginx用哪个IP转发了:
app.get('/', function(req, res){ res.send("Hello World!"); }); var server = app.listen(8081, '0.0.0.0'); // 监听所有接口
这样修改后,再用wget http://192.168.0.178/pub测试,就能正常返回"Hello World!"了。
内容的提问来源于stack exchange,提问作者Dries
相关产品推荐
相关产品推荐

