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

出现502 Bad Gateway(Nginx)错误,单域名适配Flask/Django求排查方案

排查与解决Nginx 502 Bad Gateway(单域名适配Flask+Django场景)

嘿,咱们一步步来拆解这个502错误的排查思路——毕竟502本质上就是Nginx没法成功连接到你的后端应用服务,结合你的单域名分发场景和给出的配置片段,重点从这几个方向入手:

第一步:先确认后端服务是否“活着”

  • 先检查Django的Gunicorn进程状态:执行 ps aux | grep gunicorn,看看有没有关联/home/dir/projects/djangoproject/gunicorn.sock的进程。如果没找到,先重启Gunicorn(比如用systemctl restart your-gunicorn-service,要是你用systemd管理的话),顺便看看Gunicorn的启动日志,排查为啥没起来。
  • 别忘了你的Flask应用!既然是两个独立应用,Flask肯定也有对应的后端服务(比如Gunicorn或uWSGI),同样要确认它在正常运行,端口/socket没被占用。

第二步:验证Unix Socket的权限和路径

你配置里用了Unix socket连接Django的Gunicorn,这部分很容易出权限问题:

  • 先检查socket文件是否存在:ls -l /home/dir/projects/djangoproject/gunicorn.sock,如果文件不存在,直接看Gunicorn日志找启动失败原因。
  • 再查权限:Nginx一般是以www-data用户运行的,所以这个socket文件得让www-data能读写。要么执行chown www-data:www-data /home/dir/projects/djangoproject/gunicorn.sock,要么在Gunicorn启动命令里加上--user www-data --group www-data,从源头确保权限正确。

第三步:补全并修正路由分发的Nginx配置

你提到用索引页做路由分发,但你的配置片段里缺了关键的location规则,这大概率是问题核心。针对单域名下区分两个应用的场景,给你两种常用的配置方案:

方案1:基于URL前缀分发(适配你的索引页需求)

比如让/django/*走Django,/flask/*走Flask,根路径指向你的索引页面:

proxy_cache_path /var/nginx/cache/project keys_zone=djangoproject_cache:60m;
gzip on;
gzip_proxied any;
gzip_types text/plain text/xml text/css application/javascript application/x-javascript;
gzip_vary on;
gzip_disable msie6;

# Django的后端服务配置
upstream django_app {
    server unix:/home/dir/projects/djangoproject/gunicorn.sock fail_timeout=0;
}

# Flask的后端服务配置(根据你的实际情况调整,比如用socket或端口)
upstream flask_app {
    server unix:/home/dir/projects/flaskproject/gunicorn.sock fail_timeout=0;
    # 要是用端口的话就改成:server 127.0.0.1:8001 fail_timeout=0;
}

server {
    listen 80;
    listen [::]:80 default_server;

    # 根路径指向你的索引分发页面
    location / {
        root /path/to/your/index-page-directory;
        index index.html;
    }

    # 转发Django请求
    location /django/ {
        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;

        proxy_pass http://django_app/;  # 注意末尾的斜杠!确保路径映射正确
        proxy_cache djangoproject_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }

    # 转发Flask请求
    location /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;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://flask_app/;  # 同样注意末尾斜杠
    }
}

方案2:基于子域名分发(更清晰,适合支持子域名的场景)

如果你的域名允许,直接用django.yourdomain.com指向Django,flask.yourdomain.com指向Flask,这种方式能避免URL前缀的映射问题,配置起来更省心。

第四步:检查Nginx配置语法并重启

每次改完配置后,一定要先验证语法:nginx -t,如果显示syntax is ok和test is successful,再重启Nginx:systemctl restart nginx。要是语法报错,直接看提示修正就行。

第五步:看日志找精准原因

要是前面的步骤都没解决,就去看Nginx的错误日志(一般在/var/log/nginx/error.log)和Gunicorn/Flask的服务日志,里面会有具体的错误细节——比如连接被拒绝、权限不足、路径不存在之类的,这些日志能帮你快速定位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:16:15