DigitalOcean部署Django时Nginx访问静态文件返回403 Forbidden
Django部署静态资源403 Forbidden问题排查方案
问题背景
本地完成Django项目开发后参考Django ASGI部署教程完成服务部署,Gunicorn相关配置全部通过测试校验,但通过公网IP访问站点时仅加载纯HTML文本,无样式、图片等静态资源,直接访问静态资源路径返回403 Forbidden错误。
当前配置
Nginx站点配置
server { listen 80; server_name XXX.XX.XXX.XX; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { alias /home/username/projectdir/staticfiles; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
Django静态资源配置
# The absolute path to the directory where collectstatic will collect static files for deployment. STATIC_ROOT = BASE_DIR / 'staticfiles' # The URL to use when referring to static files (where they will be served from) STATIC_URL = '/static/' # extra places to find static filed outside static folder inside installed apps STATICFILES_DIRS = [ BASE_DIR/"static" ] MEDIA_ROOT = BASE_DIR/"media"
修复步骤
按以下顺序操作即可解决问题:
- 修正Nginx静态路径配置的斜杠规则
当前alias配置末尾缺少斜杠,会导致Nginx路径拼接错误,将静态路径location块修改为如下格式,保证location匹配路径和alias目标路径末尾均带斜杠:location /static/ { alias /home/username/projectdir/staticfiles/; } - 配置正确的文件系统权限(该问题占同类故障的90%以上)
Nginx运行进程默认使用www-data用户身份,需要拥有静态文件目录的遍历、读取权限,依次执行以下命令:- 将静态资源目录、媒体资源目录的所有者划归Nginx运行用户:
sudo chown -R www-data:www-data /home/username/projectdir/staticfiles sudo chown -R www-data:www-data /home/username/projectdir/media - 为项目上层目录添加其他用户可执行权限(缺少该权限时Nginx无法穿透上层目录访问到静态文件,是最容易遗漏的配置项):
sudo chmod o+x /home/username/ sudo chmod o+x /home/username/projectdir/ - 为静态资源目录设置通用读取权限:
sudo chmod -R 755 /home/username/projectdir/staticfiles
- 将静态资源目录、媒体资源目录的所有者划归Nginx运行用户:
- 确认静态资源已完成收集
进入项目对应的Python虚拟环境,在项目根目录执行静态资源收集命令,将所有App、STATICFILES_DIRS下的静态文件汇总到STATIC_ROOT指定目录:python manage.py collectstatic --noinput - 校验配置并重载Nginx
先执行配置校验命令,确认Nginx配置无语法错误:
校验通过后执行重载命令让配置生效:sudo nginx -tsudo systemctl reload nginx - SELinux规则适配(仅当手动开启SELinux时需要操作)
Ubuntu系统默认关闭SELinux,若你手动开启过该安全模块,可先临时关闭测试是否为规则拦截导致:
若临时关闭后静态资源可正常访问,无需长期关闭SELinux,执行以下命令为静态目录添加合法访问标签即可:sudo setenforce 0sudo chcon -t httpd_sys_content_t /home/username/projectdir/staticfiles -R sudo chcon -t httpd_sys_content_t /home/username/projectdir/media -R
内容的提问来源于stack exchange,提问作者Brian Obot
相关产品推荐
相关产品推荐

