Django 3.2 部署后静态文件 404 通常是因为生产环境关闭了 DEBUG 模式,且未配置 Web 服务器托管静态资源。解决核心是运行 collectstatic 命令并在 Nginx 或 Apache 中映射 STATIC_ROOT 目录。
先说结论:生产环境 Django 不再自动服务静态文件,必须手动收集并由 Web 服务器直接响应。
- 先确认:settings.py 中 DEBUG 是否设为 False 且 STATIC_ROOT 已定义。
- 先处理:执行 python manage.py collectstatic 将文件收集到指定目录。
- 再验证:检查 Nginx 或 Apache 配置是否正确指向 STATIC_ROOT 路径。
命令速用版
若需快速排查,按顺序执行以下命令检查配置与文件状态:
python manage.py collectstatic `--noinput`
ls -l /path/to/your/static/root
curl -I https://your-domain.com/static/css/style.css
为什么会这样
Django 在设计上禁止在生产模式(DEBUG=False)下由应用服务器直接提供静态文件,以避免性能瓶颈和安全风险。当 DEBUG 关闭时,Django 不再拦截/static/请求,若 Web 服务器(如 Nginx)未接管该路径,请求会直接落到 Django 应用并返回 404。此行为在 Django 3.2 文档的生产部署章节中有明确说明。
分步处理
第一步:检查 settings.py 配置
确认项目中 settings.py 文件包含以下配置,且路径为绝对路径:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
若 STATIC_ROOT 未设置,collectstatic 命令将无法执行。确保路径无拼写错误,且不要与 STATICFILES_DIRS 混淆。
第二步:收集静态文件
在服务器项目根目录下运行收集命令,将分散在各 app 中的静态文件汇总到 STATIC_ROOT:
python manage.py collectstatic `--noinput`
观察输出日志,确认没有报错且文件数量符合预期。若提示权限错误,需检查当前用户对该目录的写入权限。
第三步:配置 Web 服务器
以 Nginx 为例,在 server 块中添加 location 配置,直接映射静态目录:
location /static/ {
alias /path/to/your/staticfiles/;
}
注意 alias 路径末尾需与 STATIC_ROOT 一致,且 Nginx 用户有权读取该目录。配置修改后需重载 Nginx 服务。
第四步:检查文件权限
确保 Web 服务器进程用户(如 www-data)对静态文件目录有读取权限:
chown -R www-data:www-data /path/to/your/staticfiles
chmod -R 755 /path/to/your/staticfiles
怎么验证是否生效
使用 curl 命令请求具体静态文件,观察 HTTP 状态码是否为 200:
curl -I https://your-domain.com/static/admin/css/base.css
若返回 200 OK 且 Content-Type 正确,说明配置生效。若仍为 404,检查 Nginx 错误日志 /var/log/nginx/error.log 确认请求是否到达 Web 服务器层。也可在浏览器开发者工具 Network 面板查看具体请求路径是否匹配。
常见坑
STATIC_ROOT 目录不能包含在版本控制中,否则可能导致 collectstatic 冲突。若使用 Docker 部署,需确保静态文件目录通过 Volume 挂载或在构建阶段收集。白噪声(WhiteNoise)中间件虽可让 Django 服务静态文件,但官方文档建议仅用于简单场景,高并发生产环境仍推荐由 Nginx 处理。路径大小写敏感问题在 Linux 服务器上需特别注意,配置路径与实际文件夹名称必须完全一致。
常见问题
DEBUG 设为 True 能解决 404 吗?
能临时解决但不建议生产使用。DEBUG=True 会让 Django 接管静态文件服务,但存在严重安全风险且性能较差,仅适用于本地开发环境。
collectstatic 提示文件已存在怎么办?
这是正常提示,命令会询问是否覆盖。添加 `--noinput` 参数可自动覆盖,确保每次部署都同步最新文件。
为什么 CSS 加载了但图标 404?
检查 CSS 文件内部引用的相对路径是否正确。若使用 ManifestStaticFilesStorage,需确保模板中加载静态文件标签正确。
参考来源
Django 官方文档 - Deploying static files: https://docs.djangoproject.com/en/3.2/howto/static-files/deployment/
Django 官方文档 - settings.py STATIC_ROOT: https://docs.djangoproject.com/en/3.2/ref/settings/#static-root