出现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
相关产品推荐
相关产品推荐

