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

使用Gunicorn/Nginx部署Flask应用时出现Nginx 502 Bad Gateway错误

解决Flask + Gunicorn + Nginx部署时的502 Bad Gateway错误

碰到502 Bad Gateway这种问题,本质都是Nginx没法和后端的Gunicorn建立连接,咱们一步步排查定位:

1. 先确认Gunicorn本身能正常运行

这是最基础的一步,先绕开Nginx,直接测试Gunicorn能不能跑起来:

  • 手动启动Gunicorn,比如执行:
    gunicorn --bind 127.0.0.1:8000 app:app
    
    这里注意app:app的格式:第一个app是你的Flask应用文件名(比如你的主文件是app.py),第二个app是你在代码里创建的Flask实例(比如app = Flask(__name__)里的app)。
  • 启动后访问localhost:8000,如果能正常打开你的Flask应用,说明Gunicorn和Flask本身没问题;如果不行,先解决Gunicorn的问题——比如有没有激活虚拟环境?依赖包有没有装全?实例名是不是写错了?

2. 核对Nginx的反向代理配置

从你给出的nginx.conf片段来看,http块的配置不完整,重点是server块里的反向代理规则必须和Gunicorn的绑定地址完全匹配:

  • 假设Gunicorn绑定的是127.0.0.1:8000,那Nginx的server块应该类似:
    server {
        listen 80;
        server_name localhost; # 或者你的域名
    
        location / {
            proxy_pass http://127.0.0.1:8000; # 这里必须和Gunicorn的绑定地址一致
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  • 如果你用的是Unix套接字(比端口更高效),Gunicorn启动命令是gunicorn --bind unix:/tmp/flask_app.sock app:app,那Nginx的proxy_pass要改成http://unix:/tmp/flask_app.sock;

3. 排查权限问题

权限是502的高发原因,尤其是用Unix套接字的时候:

  • 如果用套接字,Gunicorn创建的.sock文件默认权限可能只有当前用户能访问,而Nginx是用nginx用户运行的,这时候会出现权限拒绝的错误。解决方法:
    • 启动Gunicorn时指定用户组,比如:
      gunicorn --bind unix:/tmp/flask_app.sock --user nginx --group nginx app:app
      
    • 或者修改套接字文件的权限:chmod 777 /tmp/flask_app.sock(不推荐太开放的权限,最好用同组权限)
  • 另外,Flask应用所在的目录,nginx用户要有读取权限——比如如果你的应用放在个人home目录下,nginx用户可能没权限访问,这时候可以把应用移到/var/www/目录,或者调整目录权限为chmod 755 /path/to/your/app

4. 查看日志找具体错误

日志是定位问题的关键,别光靠猜:

  • 查看Nginx错误日志:
    tail -f /var/log/nginx/error.log
    
    常见错误比如:
    • connect() failed (111: Connection refused) while connecting to upstream:说明Gunicorn没启动,或者绑定的地址和Nginx配置的不一样
    • permission denied while connecting to upstream:就是权限问题
  • 如果用systemd管理Gunicorn服务,查看Gunicorn日志:
    journalctl -u gunicorn.service
    
    能看到Gunicorn启动失败的具体原因,比如找不到模块、依赖缺失等

5. 检查端口占用

如果Gunicorn绑定的端口被其他进程占用,也会导致Nginx连不上:

  • 检查端口是否被占用:
    ss -tulpn | grep 8000
    
    如果有其他进程在用8000端口,要么杀掉那个进程,要么给Gunicorn换个端口(比如改成8001),同时更新Nginx的proxy_pass地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:57:32