Django部署在DigitalOcean Droplet后访问media文件返回403 forbidden错误
媒体文件403错误排查与解决方案
第一步:排查文件系统权限问题
该问题90%以上由文件权限不匹配导致
- 先确认Nginx运行用户:执行
ps aux | grep nginx,输出第一列即为Nginx运行用户,Ubuntu环境默认是www-data - 再查看media目录及内部文件的属主、权限:执行
ls -l /path/to/your/media/,替换为你实际的media目录绝对路径 - 权限修复操作:
- 递归修改media目录属主为应用运行用户+Nginx用户组,例如你的Gunicorn用
appuser用户运行,命令为sudo chown -R appuser:www-data /path/to/your/media/ - 递归设置目录和文件的权限阈值:
sudo find /path/to/your/media/ -type d -exec chmod 750 {} \; sudo find /path/to/your/media/ -type f -exec chmod 640 {} \;
- 递归修改media目录属主为应用运行用户+Nginx用户组,例如你的Gunicorn用
第二步:排查Nginx配置问题
- 检查站点配置中media路径的location规则,确认没有配置IP限制、路径错误等问题,参考正确配置如下:
location /media/ { alias /path/to/your/actual/media/; expires 30d; add_header Cache-Control "public, immutable"; } - 验证配置合法性:执行
sudo nginx -t,返回success后执行重载生效sudo systemctl reload nginx
第三步:排查系统安全模块限制
Ubuntu默认开启AppArmor,可能会限制Nginx读取非默认站点目录的文件
- 执行
sudo aa-status | grep nginx,如果返回enforcing状态,可临时切换为宽松模式验证:sudo aa-complain /usr/sbin/nginx - 若使用自定义开启了SELinux的镜像,执行
sudo setenforce 0临时关闭验证,确认是该问题后再添加对应目录的访问规则即可
第四步:排查应用层权限拦截
如果上述步骤都无问题,检查应用是否对media路径做了权限校验,例如Django如果配置了全局登录拦截、或者自定义了media路径的访问中间件,会拦截未登录用户的访问,修改应用路由规则放开media路径的公开访问权限即可。
内容的提问来源于stack exchange,提问作者qwerty000
相关产品推荐
相关产品推荐

