Django搭配Nginx访问域名返回404、gunicorn启动正常问题排查
故障排查结论
首先,大概率不是.env文件直接导致的故障,仅两种特殊场景可能和.env有关,后文会说明。目前从你给出的配置可以明确看到3个核心配置错误,是导致404的主要原因:
Nginx server_name配置不匹配域名
你当前配置的server_name仅绑定了IP65.1.254.234,如果用域名访问,请求无法匹配到该server块,会被Nginx默认的其他server块处理,直接返回404。
修复:把你的访问域名加到server_name后面,示例:server_name 65.1.254.234 yourdomain.com www.yourdomain.com;location / 块的try_files逻辑错误
你当前配置的try_files $uri $uri/ =404优先级远高于proxy_pass,Nginx会优先查找本地静态文件,找不到就直接返回404,根本不会把请求转发给后端的Gunicorn服务,所有动态请求都会直接404。
修复:修改请求转发逻辑,示例:
location / { try_files $uri $uri/ @django_proxy; } location @django_proxy { include proxy_params; proxy_pass http://unix:/home/ubuntu/Application_Code/app.sock; }
- 静态资源alias配置错误
你Django配置的STATIC_ROOT = '/var/www/html/static',意味着执行collectstatic后所有静态文件都会存在这个目录下,但你Nginx中location /static的alias配置为/var/www/html,会导致请求/static/xxx.css时,Nginx去/var/www/html/xxx.css找文件,路径不匹配自然返回404。
修复:修改static块配置
location /static { autoindex off; # 生产环境建议关闭自动索引 alias /var/www/html/static/; }
可能和.env相关的边缘场景
只有以下两种情况故障会和.env有关:
.env中配置的ALLOWED_HOSTS没有添加你访问用的域名,Django会拦截非法域名请求,部分场景下会返回404(通常返回400错误).env中DEBUG=False,且你未执行python manage.py collectstatic同步静态文件到STATIC_ROOT目录,会导致静态资源404(但你说直接启动Gunicorn时静态文件正常,说明你大概率开了DEBUG模式,Django临时处理了静态资源请求,该场景概率较低)
配置修改完成后,执行nginx -t检查配置语法是否正确,确认无误后执行systemctl reload nginx重载配置即可。
内容的提问来源于stack exchange,提问作者Tech- ARM
相关产品推荐
相关产品推荐

