Nginx跨服务器proxy_pass代理Docker容器返回502 Bad Gateway问题
故障现象
- 服务部署拓扑:
- 服务器
172.16.100.8:启动了监听3000端口的OWASP Juice Shop Docker容器 - 服务器
172.16.100.26:部署Nginx作为反向代理,对接上述Juice Shop服务
- 服务器
- 故障表现:跨主机代理时返回502 Bad Gateway错误,对应Nginx配置如下:
upstream juice_shop { zone http_backend 64k; server 172.16.100.8:3000; } server { listen 80; root /usr/share/nginx/html; access_log /var/log/nginx/access.log combined; location / { proxy_pass http://juice_shop/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
已验证正常场景
- 直接访问
http://172.16.100.8:3000可正常加载网站内容 - 在
172.16.100.8本地部署Nginx,配置upstream指向localhost:3000时代理完全正常,对应配置如下:
upstream juice_shop { zone http_backend 64k; server localhost:3000; } server { listen 80; root /usr/share/nginx/html; access_log /var/log/nginx/access.log combined; location / { proxy_pass http://juice_shop; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
- 故障仅触发于Nginx跨主机转发请求到其他服务器上容器的场景,Nginx与容器同实例部署时无异常。
排查思路与解决方案
按优先级从高到低依次排查:
- 检查Docker端口映射绑定地址
这是同主机访问正常、跨主机访问失败的最常见原因。在172.16.100.8上执行docker ps查看Juice Shop容器的端口映射规则:- 如果映射显示为
127.0.0.1:3000-><容器端口>/tcp,说明服务仅绑定在本地回环地址,仅本机可访问,外部主机请求会被直接拒绝。 - 修复方式:重新创建容器,启动时明确指定绑定所有网卡地址,端口映射参数写为
-p 0.0.0.0:3000:3000。
- 如果映射显示为
- 验证Nginx主机到后端的网络连通性
在172.16.100.26上执行curl -v http://172.16.100.8:3000,确认是否能正常拿到响应:- 如果连接被拒绝:除了上述Docker端口绑定问题,还要检查
172.16.100.8的主机防火墙、云平台安全组规则,是否放通了来自172.16.100.26的3000端口TCP入站流量。 - 如果连接超时:排查两台服务器之间的路由策略、网络ACL规则,确认三层网络连通正常。
- 如果连接被拒绝:除了上述Docker端口绑定问题,还要检查
- 修正Nginx配置差异
对比两份配置可发现,故障配置的proxy_pass地址末尾多了冗余斜杠,会改变Nginx的路径转发逻辑,可能导致后端服务无法识别请求。先将配置修改为proxy_pass http://juice_shop;(去掉末尾斜杠),同时在location块中补充标准反向代理请求头,避免后端服务校验请求异常:
修改完成后执行location / { proxy_pass http://juice_shop; 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 -t校验配置语法,确认无误后执行nginx -s reload重载配置测试。 - 通过错误日志定位根因
若上述步骤未解决问题,直接查看Nginx错误日志获取明确报错信息,默认日志路径为/var/log/nginx/error.log,执行tail -f /var/log/nginx/error.log后复现502请求,根据日志内容定向排查:- 报错为
Connection refused:对应后端端口未对Nginx主机开放、服务监听地址绑定错误 - 报错为
Connection timed out:对应网络链路被拦截、路由不可达 - 报错为
upstream prematurely closed connection:对应后端服务接收请求异常,可同步查看Juice Shop容器的运行日志排查服务侧问题
- 报错为
内容的提问来源于stack exchange,提问作者kushikimi21
相关产品推荐
相关产品推荐

