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

