Nginx部署Django+Gunicorn时静态文件路径static重复报错问题咨询
Nginx静态文件路径重复static的修复方案
问题根因
问题出在Nginx的静态路径拼接规则不匹配。Nginx的root指令会把配置的根路径和完整请求URI做拼接:
当收到请求/static/js/test.js时,如果配置了root /home/tejas/Desktop/cognizance/static,拼接出的查找路径就是:/home/tejas/Desktop/cognizance/static + /static/js/test.js = /home/tejas/Desktop/cognizance/static/static/js/test.js
和你日志里的报错路径完全一致,这就是路径重复static的来源。
具体修复步骤
1. 修正Nginx静态文件块配置
把现有server块下的/static/ location替换为以下任意一种正确配置:
- 方案1:使用
alias指令(最不易出错)
注意alias路径末尾的斜杠不能省略,否则会再次触发路径拼接错误。location /static/ { # 直接指向collectstatic生成的静态文件根目录 alias /home/tejas/Desktop/cognizance/static/; } - 方案2:使用
root指令(和alias效果等价)
该配置下Nginx会自动把请求URI中的location /static/ { # 指向静态文件目录的上级路径 root /home/tejas/Desktop/cognizance; }/static/部分拼到root路径后,最终定位到正确的文件路径。
2. 修正Django的静态文件配置
你当前的settings.py存在配置冲突:STATIC_ROOT和STATICFILES_DIRS指向了同一个目录(项目根下的static/),容易导致静态文件收集混乱。
调整为以下规范配置:
# 开发阶段存放自定义静态文件的源目录 STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ] # 生产环境下,collectstatic集中收集所有静态文件的目标目录 if sys.argv[1] != 'runserver': STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
调整完成后,记得把Nginx配置里的路径同步为新的STATIC_ROOT实际路径。
3. 执行静态文件收集与Nginx重载
- 执行静态文件收集命令,将所有应用内置、自定义的静态资源统一拷贝到
STATIC_ROOT目录:python manage.py collectstatic
执行完成后可进入目标目录确认,静态资源的js、css文件应该直接对应到子目录下,不存在嵌套的第二层static文件夹。 - 校验Nginx配置语法,确认无误后重载服务生效:
sudo nginx -tsudo systemctl reload nginx
注意事项
- 当前
DEBUG = False的生产配置下,Django本身不会响应任何静态文件请求,所有静态资源全部由Nginx直接读取返回,路径匹配错误就会直接触发404。 - 禁止将
STATIC_ROOT和STATICFILES_DIRS配置为同一目录,否则collectstatic过程会出现文件覆盖、收集异常等问题。
内容的提问来源于stack exchange,提问作者Tejas
相关产品推荐
相关产品推荐

