Nginx反向代理后端接口时为什么一直返回502?

Code°玉萱 阅读 3

我用Nginx给本地开发的Node.js服务做反向代理,前端请求一发就报502 Bad Gateway,但直接访问后端端口是通的。是不是proxy_pass配置有问题?

我的Nginx配置里写了proxy_pass http://localhost:3000;,后端确实在3000端口跑着,也试过换成127.0.0.1还是不行。

server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://localhost:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
Mr-文科
Mr-文科 Lv1
502基本就是Nginx连不上你的后端服务,问题可能出在这几个地方。

先看一眼Nginx错误日志,路径一般在 /var/log/nginx/error.log,里面会告诉你具体报啥错。

最常见的一个坑是IPv6的问题。你写 localhost 的时候,系统可能把它解析成 ::1(IPv6),但Node.js默认只监听 127.0.0.1(IPv4),所以Nginx连不上。你直接用curl测一下后端接口能通,是因为curl可能走了IPv4。

解决办法很简单,把localhost换成 127.0.0.1,同时确认你的Node.js启动时host要设成 0.0.0.0 或者 127.0.0.1,别让它只监听某个特定IP。

代码放这了:

server {
listen 80;
server_name localhost;

location /api/ {
proxy_pass http://127.0.0.1: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;
}
}


改完记得重启Nginx:nginx -s reload

如果你用的是CentOS或者RedHat,还有个可能是SELinux拦住了,Nginx默认没权限做网络代理。跑一下这个命令:setsebool -P httpd_can_network_connect 1

实在不行就把错误日志贴出来,看具体报啥。
点赞
2026-03-02 20:38