Nginx 容器反向代理报 502 怎么处理?

Nginx 在容器里时,localhost 指向它自己。检查 proxy_pass、共享网络及内部端口,再从代理容器请求后端。

宿主机访问 127.0.0.1:8080 正常,Nginx 容器却返回 502,先查代理的上游地址。普通桥接网络中,容器的 127.0.0.1 是它自己,不能照搬宿主机访问后端的地址。

Nginx 在哪里,后端就该填什么地址

代理位置后端位置典型上游地址
宿主机进程容器发布 127.0.0.1:8080:80127.0.0.1:8080
普通桥接容器同网络、服务名为 app 的容器app:80
普通桥接容器宿主机进程按平台配置宿主机可达地址

这里假设应用内部监听 80;host 网络、共享网络命名空间需要按实际拓扑判断。不要将 Docker 网关 IP 写成所有服务器通用的固定值。

用日志判断是解析失败还是拒绝连接

docker compose logs --tail=100 nginx
docker compose ps
docker compose exec nginx nginx -T
docker inspect --format '{{json .NetworkSettings.Networks}}' \
  "$(docker compose ps -q nginx)"
docker inspect --format '{{json .NetworkSettings.Networks}}' \
  "$(docker compose ps -q app)"

检查真实加载的 proxy_pass,两个容器应有共同网络。nginx -T 可能打印内部配置,分享前脱敏。host not found 先查服务名与网络;解析后连接被拒绝,查内部端口与监听;超时则继续看网络或应用处理时间。

代理镜像已有 curl 时,可以从其中请求 http://app:80/。没有工具时使用已有诊断环境,不临时修改生产容器后误以为修改能随重建保留。

同网容器使用服务名

同一个 Compose 项目的服务通常加入默认网络。不同项目则要显式接入同一个受控网络,确认服务别名。应用监听内部 80 时,Nginx HTTP 代理片段可写为:

location / {
    proxy_pass http://app:80;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这只处理 HTTP 上游路径。HTTPS、WebSocket、可信代理或某个应用的特殊要求,还需按对应文档配置。后端重建会改变容器 IP;某些 Nginx 版本与配置需要重载或重新解析,服务名不是对所有版本的自动恢复保证。

修改前保留原配置,执行 nginx -t 后在维护窗口重载或重建相关服务。若网络已通,应用却返回可信域名或重定向错误,继续查应用层设置;不要把它与原来的连接失败混为同一故障。

修好以后收回临时公开端口

从真实网站域名检查预期内容,同时确认日志没有继续报告同样的连接失败。排查中临时发布了后端端口,应按正式部署方式关闭。

小网站共用一台 VPS 时,先安排共同网络和代理入口,见一台 VPS 部署多个网站。只有资源或隔离要求确实需要拆分,再比较Docker VPS 的选购条件;localhost 地址写错并不需要换机器。

准备分离代理与应用时,先确认它们的受控连接路径、同地域要求和部署权限。小型 Compose 项目可比较 雨云 RCS 的 Linux 与网络;自行维护多个测试实例可看 Evoxt 的地区与配置。新机预算按后端真实负载配置,代理换位置后同步更新上游地址,不能继续照搬原来部署方式中的 localhost。