You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Nginx与Docker部署3副本负载均衡时出现502 Bad Gateway报错求助

问题原因
  • 端口不匹配:你的docker-compose配置中tienda(Flask API服务)声明暴露的端口是8080,但nginx配置的upstream规则里将请求转发到了上游的3050端口,两个端口不一致导致连接被拒绝。
  • Flask监听地址配置错误:如果你的Flask启动代码未显式指定监听地址为0.0.0.0,默认只会监听容器本地的127.0.0.1,容器外的nginx服务无法访问到Flask进程。
  • 上游服务名错误:用docker-compose deploy replicas模式部署多副本时,docker内置DNS会自动将服务名tienda解析到所有可用的副本实例,你配置的sist3-tienda-1这类固定容器名依赖你的docker-compose项目前缀,如果项目名不是sist3就会解析失败,同时硬编码副本名也不符合多副本动态扩缩容的设计。
  • 启动顺序逻辑缺陷:你配置的depends_on仅会保证postgresql、tienda在nginx之前启动,但不会等待Flask服务完全启动完成接收请求就会启动nginx,刚启动时也可能出现短暂的502错误。
修复步骤
  1. 修正nginx.conf配置,把upstream段改为如下配置,直接用服务名,端口改为Flask实际监听的端口,不需要硬编码三个副本地址,docker内置DNS会自动做负载均衡:
upstream loadbalancer {
    server tienda:8080 weight=3 max_fails=0 fail_timeout=5s;
}
server {
    location / {
    proxy_pass http://loadbalancer;
    proxy_read_timeout 5m;
}}
  1. 修改Flask启动代码,显式绑定0.0.0.0,确保监听端口和docker-compose暴露的端口、nginx转发的端口一致,示例:
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)
  1. 可选优化:在tienda服务的docker-compose配置中添加healthcheck字段,检测Flask服务是否就绪,确保服务完全启动后再接收流量,避免启动初期的502错误。

内容的提问来源于stack exchange,提问作者myge32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:36:04