为何CSS在python manage.py runserver正常但Gunicorn环境下失效?
Django静态文件在Gunicorn环境下无法加载的解决方法
问题场景
- 执行
python manage.py runserver mywebsite.com:8099时,CSS静态文件可正常加载 - 直接执行
gunicorn demo.wsgi:application或通过systemd+Gunicorn Socket启动应用时,应用能运行但CSS完全失效
现有配置与目录信息
settings.py 配置片段
STATIC_URL = "static/" STATICFILES_DIRS = [ BASE_DIR / "mystaticfiles" ]
Nginx 配置片段
location /static/ { root /root/djdeploy/demo/static; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; }
项目目录结构
- 项目工作根目录:
/root/djdeploy/demo/ - 原始CSS文件存放路径:
/root/djdeploy/demo/mystaticfiles
问题原因及解决步骤
1. 未执行生产环境静态文件收集操作
Django的runserver调试服务器会自动从STATICFILES_DIRS指定的目录中读取静态文件,但Gunicorn作为生产级服务器不会处理这个逻辑,必须手动将分散的静态文件统一收集到指定目录。
操作步骤:
- 在
settings.py中添加STATIC_ROOT配置,指定静态文件收集后的目标路径:STATIC_ROOT = BASE_DIR / "static" - 执行静态文件收集命令:
执行完成后,python manage.py collectstaticmystaticfiles中的所有静态文件会被复制到/root/djdeploy/demo/static目录下。
2. Nginx静态文件路径配置错误
当前Nginx的root配置会导致路径拼接错误:当用户请求/static/css/style.css时,Nginx会尝试在/root/djdeploy/demo/static/static/css/style.css路径下查找文件,而实际文件存放在/root/djdeploy/demo/static/css/style.css,因此无法找到。
修正方案(二选一):
- 方案一:使用
alias指定精确路径location /static/ { alias /root/djdeploy/demo/static/; } - 方案二:调整
root指向项目根目录location /static/ { root /root/djdeploy/demo/; } - 修改完成后重启Nginx服务:
systemctl restart nginx
3. 检查文件权限
确保Nginx进程拥有读取静态文件目录的权限:
chmod -R 755 /root/djdeploy/demo/static chown -R www-data:www-data /root/djdeploy/demo/static
内容的提问来源于stack exchange,提问作者Nadirspam
相关产品推荐
相关产品推荐

