Digital Ocean部署Django+Nginx时部分静态文件无法加载求助
解决Django部署中部分静态图片无法加载的问题
嘿,我看你在Ubuntu 16.04上用DigitalOcean教程部署Django站点时,遇到了部分静态图片加载失败的问题,结合你给出的日志和配置,咱们一步步来排查解决:
核心问题分析
从Nginx错误日志可以看到,服务器找不到/home/dmckim/myproject/static/images/frac_stack_1.jpg,但你确认文件存在且权限正常。最可能的原因是Django静态文件收集配置缺失,以及Nginx路径指向的逻辑问题。
具体解决步骤
1. 修正Django的settings.py配置
你当前的配置缺少STATIC_ROOT,这是collectstatic命令用来存放所有收集后静态文件的核心目录——没有它的话,静态文件不会被统一整理到Nginx能访问的标准化路径下。更新配置如下:
STATIC_URL = '/static/' # 添加STATIC_ROOT,指定收集后静态文件的存放目录 STATIC_ROOT = '/home/dmckim/myproject/static_collected/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), # 删掉单独的images目录配置,STATICFILES_DIRS只需要指定静态文件的根目录即可 )
2. 调整Nginx配置,指向正确的静态文件目录
Nginx当前指向的是你项目里的源静态目录,但正确的做法是指向collectstatic收集后的统一目录。这里推荐用alias代替root,避免路径拼接错误:
server { listen 80; server_name 206.189.161.104; location = /favicon.ico { access_log off; log_not_found off; } location /static { # 用alias直接映射到收集后的静态文件目录 alias /home/dmckim/myproject/static_collected/; # 可选:添加缓存规则,提升静态文件加载速度 expires 30d; add_header Cache-Control "public, max-age=2592000"; } location / { include proxy_params; proxy_pass http://unix:/home/dmckim/myproject/myproject.sock; } }
小贴士:
root和alias的区别:root会把location的路径拼接到根路径后,而alias会直接替换location的路径,用alias处理静态文件路径更不容易出错。
3. 重新收集静态文件
先清空旧的收集目录(如果有的话),再执行收集命令:
# 清空旧目录 rm -rf /home/dmckim/myproject/static_collected/ # 自动收集所有静态文件到STATIC_ROOT python manage.py collectstatic --noinput
4. 修复权限并重启服务
确保Nginx的运行用户www-data能访问静态文件目录,然后重启服务:
# 设置目录权限 sudo chown -R dmckim:www-data /home/dmckim/myproject/static_collected/ sudo chmod -R 755 /home/dmckim/myproject/static_collected/ # 重启服务 sudo systemctl restart gunicorn sudo nginx -t && sudo systemctl restart nginx
5. 最后验证
登录服务器,确认/home/dmckim/myproject/static_collected/images/frac_stack_1.jpg存在,然后刷新浏览器(记得清除缓存),应该就能加载之前无法显示的图片了。
额外排查点
- 检查文件名大小写:Linux系统是大小写敏感的,确认请求的文件名和服务器上的文件名完全一致(比如是不是
Frac_Stack_1.jpg而不是小写)。 - 确认源静态文件存在:确保
/home/dmckim/myproject/static/images/frac_stack_1.jpg确实存在,collectstatic只会收集源目录里有的文件。
内容的提问来源于stack exchange,提问作者Dmckim
相关产品推荐
相关产品推荐

