Django+Nginx部署时静态文件加载失败问题求助
根据你提供的信息,页面能正常加载但静态文件返回404,已尝试常规操作未解决,以下是针对性排查步骤:
1. 确认静态文件是否已被正确收集到STATIC_ROOT
首先验证/opt/proj/staticfiles下是否存在缺失的静态文件:
# 检查css目录及文件 ls -l /opt/proj/staticfiles/css/ # 检查js目录及文件 ls -l /opt/proj/staticfiles/js/
如果文件不存在,重新执行collectstatic并观察输出是否有错误:
cd /opt/proj/proj python manage.py collectstatic --noinput
若出现权限错误,确保执行用户(appusr)对/opt/proj/staticfiles有写入权限,必要时可使用sudo执行(注意执行后修正文件归属:sudo chown -R www-data:www-data /opt/proj/staticfiles)。
2. 检查Nginx配置与生效状态
2.1 验证Nginx静态路径配置
你的location /static/配置使用alias,结尾斜杠匹配正确,但需确保Nginx进程能访问该目录。检查Nginx错误日志:
tail -f /var/log/nginx/error.log
若出现permission denied,需确认上级目录权限:/opt/proj权限为drwxrwxr-x,www-data组可正常访问,若仍有问题,检查系统SELinux状态(仅CentOS/RHEL系列):
getenforce
若输出Enforcing,临时关闭测试:
sudo setenforce 0
若静态文件可访问,需永久配置SELinux规则:
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/proj/staticfiles(/.*)?" sudo restorecon -Rv /opt/proj/staticfiles
2.2 确认Nginx配置已生效
修改配置后必须重新加载或重启Nginx:
sudo systemctl reload nginx # 或重启 sudo systemctl restart nginx
使用nginx -T查看完整生效配置,确认pense.ai的server块中/static/规则在/规则之前:
sudo nginx -T
3. 验证Django静态配置与模板引用
3.1 检查STATIC_URL设置
确保settings.py中STATIC_URL与Nginx配置匹配:
STATIC_URL = '/static/'
若此值被修改为其他路径(如/staticfiles/),会导致Nginx无法匹配请求。
3.2 检查模板静态文件引用方式
确保模板中正确使用Django静态标签:
{% load static %} <link rel="stylesheet" href="{% static 'css/login-style.css' %}"> <script src="{% static 'js/login.js' %}"></script>
避免直接硬编码路径(如/static/css/login-style.css),除非完全确认STATIC_URL与路径一致。
4. 验证请求路由是否匹配正确的Nginx Server块
使用curl测试静态文件请求,指定Host头确保匹配到目标server块:
curl -H "Host: pense.ai" http://181.177.55.120/static/css/login-style.css
观察返回结果,同时查看/var/log/nginx/proj.log是否有该请求记录。若无记录,说明请求未匹配到pense.ai的server块,需检查Nginx默认server配置。
内容的提问来源于stack exchange,提问作者Meu nome não é Johnny

