Nginx配置双location代理两个Docker Flask应用时出现502 Bad Gateway错误
问题排查步骤
- 首先查看Nginx错误日志定位根本原因
你提供的只有访问日志,502错误的具体诱因会记录在/var/log/nginx/error.log中,常见日志关键词包括connect() failed(连接上游失败)、Connection refused(连接被拒绝)、upstream sent invalid response(上游返回无效响应),先拿到错误日志可以大幅缩小排查范围。 - 验证上游容器2本身可正常访问
在Nginx所在的宿主机执行以下命令直接访问容器2的服务,确认服务本身正常:
若该命令无法正常返回响应,说明问题出在容器2本身或者网络层面,和Nginx配置无关:# 测试容器IP+端口可连通 curl -v http://local_ip_of_container_2:8035/xxxx- 检查Flask应用2的启动配置:Flask默认监听
127.0.0.1,只能在容器内部访问,启动时必须指定host="0.0.0.0"才能允许容器外访问。 - 确认容器2的IP未发生变化:Docker容器重启后默认会重新分配IP,执行
docker inspect <容器2的名称或ID> | grep IPAddress核对当前IP和Nginx upstream配置中的local_ip_of_container_2是否一致。 - 检查网络策略与防火墙:确认宿主机的iptables、安全组规则没有限制Nginx访问容器2的8035端口,同时确认Nginx和容器2处于同一个可互通的Docker网络中。
- 检查Flask应用2的启动配置:Flask默认监听
- 修正Nginx路径转发配置(可选,适用于Flask应用2无
/admin前缀路由的场景)
你当前的location /admin/配置中proxy_pass末尾没有加斜杠,会把完整的原始路径转发给上游:比如请求/admin/xxxx会被转发为http://container2_name/admin/xxxx。如果你的Flask应用2的路由没有/admin前缀,需要将配置修改为:
末尾的斜杠会让Nginx把location /admin/ { proxy_pass http://container2_name/; # 建议补充和根路径一样的proxy_set_header配置,避免Flask拿到异常的请求头 proxy_redirect off; 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-Host $server_name; }/admin/前缀替换成/再转发,此时请求/admin/xxxx会被转发为http://container2_name/xxxx,适配没有前缀的Flask路由。 - 查看容器2的运行日志
如果前面的curl命令已经能正常拿到响应,但走Nginx还是502,查看容器2的日志确认请求是否已经进入容器,是否有应用层面的报错导致返回了Nginx无法识别的响应。
内容的提问来源于stack exchange,提问作者erol
相关产品推荐
相关产品推荐

