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

容器化Nginx代理Flask+Gunicorn报502 Bad Gateway故障排查

问题根因

持续返回502 Bad Gateway是两个配置错误共同导致的:

  • 容器间访问端口配置错误
    同一Docker自定义网络内的容器互访,直接走容器内部网络,与ports字段配置的宿主机端口映射无关。当前app服务的端口映射为4000:5000,代表宿主机4000端口转发到app容器内部的5000端口,但Nginx和app同属mynet网络,互访时应该直接访问容器内部监听的端口,你在nginx.conf中配置的proxy_pass http://app:4000指向的端口无任何服务监听,必然连接失败。
  • Gunicorn启动参数缺失,服务未监听可被跨容器访问的地址
    app的Dockerfile中仅配置了CMD gunicorn,无任何启动参数:
    1. Gunicorn默认绑定127.0.0.1:8000,绑定本地回环地址时只有容器内部进程能访问,同网络的Nginx容器无法建立连接
    2. 默认监听的8000端口与配置预期的5000端口不匹配,即使修改绑定地址,端口不匹配也无法连通
修复步骤
  1. 修正Nginx反向代理端口配置
    修改nginx.conf中的代理目标地址,指向app容器内部的正确端口:
server {
    listen 80;
    server_name localhost; 
    
    location / {
        proxy_pass http://app:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 20M;
      } 
    }
  1. 修正Gunicorn启动命令
    修改app目录下Dockerfile的CMD字段,指定Gunicorn绑定0.0.0.0地址(允许跨容器访问)、监听5000端口,同时指定Flask应用入口:
FROM python:3.8-slim-buster
RUN apt-get update \
  && apt-get install -y build-essential netcat\
  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
  && rm -rf /var/lib/apt/lists/*
RUN adduser --home /app --system --group kr1p
WORKDIR /app
COPY --chown=kr1p:kr1p app .
RUN pip install -r requirements.txt 
USER kr1p
ENV PYTHONUNBUFFERED=1
# 替换原有的CMD gunicorn,后面的app:app替换为你实际的Flask实例路径:<入口文件名>:<应用实例名>
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
  1. (可选优化)补全服务就绪检查
    默认的depends_on仅等待app容器启动,不会等待Gunicorn服务完成初始化,可能出现Nginx启动时服务未就绪导致的短暂502,可以修改docker-compose.yml增加健康检查:
---
version: '3.7'
services:
  nginx:
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    restart: always
    ports:
      - 80:80
    depends_on:
      app:
        condition: service_healthy
    networks:
      - mynet
  app:
    container_name: app
    build:
      context: .
      dockerfile: ./app/Dockerfile
    volumes:
      - app:/app
    ports:
      - 4000:5000
    networks:
      - mynet
    healthcheck:
      test: ["CMD", "nc", "-zv", "127.0.0.1", "5000"]
      interval: 3s
      timeout: 2s
      retries: 10

volumes:
  app:
    name: app
networks:
  mynet:

所有配置修改完成后,执行docker compose down -v清理旧容器与网络,再执行docker compose up --build -d重新构建启动服务即可恢复正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:06:28