重启后Django-Nginx配置无法加载静态文件求助
这个问题我碰到过好多次,核心原因是你的Nginx静态文件路由配置和Django的STATIC_URL不匹配,再加上服务器重启后可能静态文件收集或权限出了小问题。咱们一步步来修复:
1. 修正Nginx的静态文件路由配置
你Django设置里的STATIC_URL是/static/,但Nginx配置里写的是location /source/static——这就导致浏览器请求/static/styles.css时,Nginx根本没匹配到这个规则,直接把请求转发给了Gunicorn,而Gunicorn是不处理静态文件的,自然就返回404了。
打开你的Nginx站点配置文件Sites-Available/site.mywebsite.com,修改静态文件的location规则:
server{ listen 80; server_name site.mywebsite.com; location /static/ { alias /home/elspeth/sites/site.mywebsite.com/static/; # 生产环境建议关掉autoindex,避免暴露目录结构 # autoindex on; } location / { proxy_pass http://unix:/tmp/site.mywebsite.com.socket; proxy_set_header Host $host; } }
2. 重新收集静态文件
服务器重启后,有可能之前的静态文件收集状态出了问题(比如虚拟环境路径变化、文件权限重置),咱们重新执行Django的静态文件收集命令:
# 进入项目源码目录 cd /home/elspeth/sites/site.mywebsite.com/source # 激活虚拟环境 source ../virtualenv/bin/activate # 收集静态文件到STATIC_ROOT目录 python manage.py collectstatic --noinput
这个命令会把source/static、blog应用里的静态文件,还有Django admin的静态文件全部复制到../static目录(也就是你配置的STATIC_ROOT),确保目标目录里有你需要的css/styles.css、bootstrap-4.3.1-dist这些文件。
3. 修复静态文件目录的权限
Nginx进程默认是以www-data用户运行的,如果静态文件目录的权限不对,Nginx就没法读取这些文件。执行以下命令修正权限:
# 把静态文件目录的所有者改成www-data sudo chown -R www-data:www-data /home/elspeth/sites/site.mywebsite.com/static # 设置目录和文件的可读权限 sudo chmod -R 755 /home/elspeth/sites/site.mywebsite.com/static
4. 重启Nginx和Gunicorn服务
修改配置后必须重启服务才能生效:
# 重启Nginx sudo systemctl restart nginx # 重启Gunicorn(假设你用systemd管理Gunicorn,服务名根据你的实际情况调整) sudo systemctl restart gunicorn-site.mywebsite.com
如果你的Gunicorn是用Supervisor或者其他工具管理的,记得对应重启相关进程。
额外排查技巧
如果还是有问题,你可以:
- 直接访问静态文件的URL(比如
http://site.mywebsite.com/static/styles.css),看返回的具体错误 - 查看Nginx的错误日志
/var/log/nginx/error.log,里面会记录路径不存在、权限不足等具体问题,帮你快速定位。
内容的提问来源于stack exchange,提问作者RyantheBard




