You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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 collectstatic
    
    执行完成后,mystaticfiles中的所有静态文件会被复制到/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:17:39