You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中Flask应用搭配Nginx出现502错误求助

解决Docker中Flask+Nginx的502 Bad Gateway问题

这种502错误本质是Nginx没法成功连接到你的Flask应用容器,结合你给出的错误日志(连接上游被拒绝),咱们一步步排查和解决:

1. 先确认Flask应用的监听地址是否正确

Flask默认会绑定127.0.0.1,但在Docker容器里,这个地址是容器内部的localhost,其他容器(比如Nginx)根本访问不到。你必须让Flask绑定0.0.0.0,这样才能对外提供服务:

  • 如果用flask run启动,命令要改成:flask run --host=0.0.0.0 --port=8000
  • 如果用Gunicorn这类生产服务器,命令应该是:gunicorn --bind 0.0.0.0:8000 app:app

2. 检查Docker Compose的网络与上游配置

不要用固定IP来指向Flask容器(比如你日志里的10.21.50.9),因为容器重启后IP可能会变。Docker Compose会自动为同一网络内的服务创建DNS解析,直接用服务名更可靠:

  • 假设你的Flask服务在docker-compose.yml里叫web,那Nginx配置里的上游地址应该写成http://web:8000
  • 确认两个服务在同一个Docker网络里(默认情况下,docker-compose会创建一个共享网络,只要没手动指定隔离网络就没问题)

3. 测试容器间的连通性

直接进入Nginx容器,测试能不能访问Flask服务:

  1. 进入Nginx容器:docker exec -it <你的Nginx容器名> /bin/bash
  2. 先ping一下Flask服务名,看网络通不通:ping web(把web换成你的Flask服务名)
  3. 再用curl测试实际请求:curl http://web:8000
    • 如果curl能返回Flask的响应,说明网络没问题,问题出在Nginx配置细节;
    • 如果curl也失败,那要么是Flask没正常启动,要么是网络配置有问题。

4. 验证Flask容器的运行状态

有时候docker-compose up看起来没报错,但Flask容器可能启动后立刻崩溃了:

  • 查看Flask容器日志:docker-compose logs <你的Flask服务名>,看有没有代码错误、依赖缺失这类启动失败的信息
  • docker-compose ps检查服务状态,确保Flask服务是Up状态,而不是ExitedRestarting

5. 检查Nginx配置的正确性

最后确认Nginx的代理配置有没有问题,示例配置如下:

server {
    listen 80;
    server_name servername.com;

    location / {
        proxy_pass http://web:8000;  # 这里用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;
    }
}

进入Nginx容器后,用nginx -t检查配置语法是否正确,没问题的话执行nginx -s reload重新加载配置。


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

火山引擎 最新活动