Nginx upstream配置后为什么请求没被转发到后端服务?

设计师朝阳 阅读 39

我用 Nginx 做反向代理,配了 upstream,但访问时一直报 502 Bad Gateway。本地后端服务明明是开着的,端口也监听正常。

我试过直接 curl 后端地址能拿到响应,但通过 Nginx 就不行。是不是 upstream 配错了?我的配置如下:

upstream backend {
    server 127.0.0.1:3000;
}

server {
    listen 80;
    location /api/ {
        proxy_pass http://backend/;
    }
}
我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
宝娥
宝娥 Lv1
502错误通常是Nginx和后端服务通信问题。你的配置看起来没问题,但可能有几个坑要排查:

1. 检查proxy_pass后面的斜杠:你的配置proxy_pass http://backend/;会把/api/转发到后端根路径,比如/api/user会变成/user。如果后端路由需要保留/api前缀,应该去掉末尾斜杠改成http://backend

2. 看Nginx error log,一般位置在/var/log/nginx/error.log,会有更详细的错误信息。推荐的做法是先用tail -f实时看日志,再复现问题。

3. 检查权限问题,有时候Nginx用户(通常是www-data或nginx)没有权限访问本地端口。可以临时测试下:
sudo -u www-data curl http://127.0.0.1:3000


4. 加上基础的健康检查配置试试:
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}


最可能的原因是路径转发问题或者权限问题,先看日志最直接。大半夜配Nginx经常遇到这种玄学问题,懂的都懂。
点赞 1
2026-03-10 07:01
常青酱~
502一般是Nginx连不上后端服务,你试试这个配置,改了两个地方:

upstream backend {
server 127.0.0.1:3000;
}

server {
listen 80;
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}


主要问题:
1. 去掉proxy_pass最后的斜杠,否则路径会被改写
2. 加上必要的header转发,有些后端服务需要这些头

如果还不行,看下Nginx错误日志:
tail -f /var/log/nginx/error.log

顺便吐槽下Nginx这个斜杠的坑,每次都要踩一次才记得住...
点赞 2
2026-03-06 14:04