使用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错误。
修复步骤
- 修正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; }}
- 修改Flask启动代码,显式绑定
0.0.0.0,确保监听端口和docker-compose暴露的端口、nginx转发的端口一致,示例:
if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
- 可选优化:在tienda服务的docker-compose配置中添加healthcheck字段,检测Flask服务是否就绪,确保服务完全启动后再接收流量,避免启动初期的502错误。
内容的提问来源于stack exchange,提问作者myge32
相关产品推荐
相关产品推荐

