生产环境Nginx搭配whitenoise无法服务静态文件全部返回404错误
静态资源全404的排查点与解决方案
1. Nginx location 匹配规则错误(最常见原因)
你当前nginx配置的location /static没有加后缀斜杠,而Django的STATIC_URL = '/static/'生成的静态资源路径都是以/static/开头的,存在路径匹配后的拼接异常:
- 当请求
/static/css/main.css时,nginx会将匹配到的/static前缀替换为alias路径/myapp/collectedstatic/,最终拼接出的访问路径是/myapp/collectedstatic//css/main.css(多了多余的斜杠),部分系统/nginx版本会无法识别该路径返回404。 - 修正方案:将nginx配置的static location修改为带斜杠的格式,和STATIC_URL保持一致:
location /static/ { autoindex on; alias /myapp/collectedstatic/; }
2. 未执行静态文件收集命令
Django部署时不会自动把各app、STATICFILES_DIRS下的静态文件聚合到STATIC_ROOT目录,需要手动执行收集命令:
python manage.py collectstatic
执行后检查/myapp/collectedstatic/目录下是否存在对应的css、js等静态文件,没有的话就是收集失败,需要排查collectstatic的报错信息。
3. 目录权限不足
nginx运行用户(通常是www-data或者nginx)没有/myapp/collectedstatic/、/myapp/media/目录的读权限,也会返回404/403错误:
- 可以执行以下命令修正权限(根据实际运行用户调整):
chown -R www-data:www-data /myapp/collectedstatic/ /myapp/media/ chmod -R 755 /myapp/collectedstatic/ /myapp/media/
4. 路径映射不匹配
确认Django的BASE_DIR对应的实际路径是否是/myapp,如果STATIC_ROOT实际生成的路径不是/myapp/collectedstatic/,和nginx alias的路径不一致,也会出现404。
可以查看nginx错误日志(默认路径/var/log/nginx/error.log),里面会明确打印找不到的文件路径,对比实际文件存放路径即可验证是否匹配。
5. Whitenoise与nginx配置冲突
你同时配置了Whitenoise中间件和nginx静态资源代理,正常情况二者选其一即可:
- 如果要保留nginx处理静态资源,可以注释掉settings.py里的Whitenoise中间件和对应的STATICFILES_STORAGE配置,避免不必要的逻辑冲突。
- 如果要使用Whitenoise处理,可以删掉nginx里的
/static/和/media/location配置,所有请求都转发给Django处理即可。
内容的提问来源于stack exchange,提问作者Super Retarded Dog
相关产品推荐
相关产品推荐

