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

Docker容器部署场景下Nginx无法连接运行中的Flask后端服务

Docker容器部署场景下Nginx无法连接运行中的Flask后端服务

嗨,我来帮你搞定这个Nginx 502错误的问题!你遇到的核心问题其实是Docker容器之间的网络通信没配置对,咱们一步步拆解:

为啥会出现502 Bad Gateway?

看你的错误日志里的这句:connect() failed (111: Connection refused) while connecting to upstream,意思是Nginx尝试连接上游服务(也就是你的Flask后端)的时候被拒绝了。

问题出在你Nginx配置里的proxy_pass http://0.0.0.0:5000——在Nginx容器内部,0.0.0.0:5000指向的是Nginx容器自己的5000端口,而你的Flask后端是跑在另一个独立的Docker容器里的,所以Nginx根本找不到这个服务,自然连不上!

解决步骤

1. 让两个容器在同一个Docker网络里

Docker容器默认是隔离的,要让它们互相通信,得把它们放到同一个自定义网络里:

  • 先创建一个自定义网络(名字随便取,比如my-app-net):
    docker network create my-app-net
    
  • 启动Flask容器的时候,把它加入这个网络,同时给容器起个好记的名字(比如flask-backend):
    docker run --name flask-backend --network my-app-net -p 5000:5000 你的flask镜像名
    
  • 启动Nginx容器的时候,同样加入这个网络:
    docker run --network my-app-net -p 80:80 你的nginx镜像名
    

2. 修改Nginx的代理配置

把Nginx配置里的proxy_pass地址改成Flask容器的名字+端口,也就是http://flask-backend:5000(这里的flask-backend就是你刚才给Flask容器起的名字,Docker会自动把这个名字解析成容器的IP)。

修改后的完整Nginx配置如下:

events{}

http{
    client_max_body_size 50M;

    server {
        listen 80;

        location /api {
            proxy_pass http://flask-backend:5000;
            # 可选:添加这几个代理头,让Flask能获取到真实的客户端信息
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location / {
            root /var/www/;
            try_files $uri /index.html;
        }
    }
}

3. 确认Flask服务监听的是0.0.0.0

注意哦!你的Flask服务不能只监听localhost,不然即使在同一个网络里,其他容器也访问不到。启动Flask的时候要加上--host=0.0.0.0:

flask run --host=0.0.0.0

或者在你的Flask代码里直接设置:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

验证修改

重新构建Nginx镜像(或者把修改后的配置文件挂载到容器里),重启Nginx容器,然后访问localhost/api/alive,应该就能正常拿到Flask的响应啦!

备注:内容来源于stack exchange,提问作者BoringPanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:53:03