Ubuntu下Django+Nginx部署静态资源/CSS/图片/favicon报403 Forbidden错误
问题根因及修复方案
Nginx返回403的核心原因是Nginx进程无权限读取静态资源文件,叠加几处配置错误共同导致,按以下顺序排查修复即可:
1. 修复配置基础拼写错误
你在settings.py里写的调试开关是debag = False,变量名拼写错误,Django可识别的调试开关为全大写的DEBUG,先修正为:
DEBUG = False
同时确认ALLOWED_HOSTS配置已添加你的服务器公网IP、绑定域名,否则后续动态请求也会触发400错误。
2. 修正Nginx配置错误
你当前Nginx配置里的静态资源路径使用了占位符dbms_template_path,属于相对路径/无效路径,Nginx的root/alias指令必须填写操作系统绝对路径,同时补全缺失的反向代理头配置,修正后的参考配置如下:
server { listen 80; server_name 替换为你的实际公网IP/绑定域名; location /.well-known { root /var/www/html; } location = /favicon.ico { # 替换为项目的真实绝对路径 alias /你的项目实际存放绝对路径/djangowebsite/static/favicon.ico; } location /static/ { # 替换为项目的真实绝对路径,root指向static文件夹的上一级目录 root /你的项目实际存放绝对路径/djangowebsite; autoindex off; } location /media/ { # 替换为项目的真实绝对路径 root /你的项目实际存放绝对路径/djangowebsite; autoindex off; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; add_header Access-Control-Allow-Origin *; } }
配置修改完成后先执行nginx -t校验配置合法性,校验通过后执行systemctl reload nginx重载配置生效。
3. 修复文件系统权限问题
这是触发403的最常见原因:Ubuntu环境下Nginx默认运行用户为www-data,如果项目文件存放在个人用户目录、/root目录下,或目录权限未开放,www-data无读取权限就会返回403,依次执行以下命令修复:
# 替换路径为项目真实绝对路径,将项目目录所有者赋予Nginx运行用户 chown -R www-data:www-data /你的项目实际存放绝对路径/djangowebsite/ # 给静态、媒体目录开放可读可执行权限 chmod -R 755 /你的项目实际存放绝对路径/djangowebsite/static/ chmod -R 755 /你的项目实际存放绝对路径/djangowebsite/media/
注意不要把项目放在/root目录下,该目录默认对其他用户完全禁止访问,即使修改权限也存在安全隐患,建议移动到/var/www/或普通用户家目录下。
4. 执行静态文件收集
关闭DEBUG模式后Django不再自动代理静态资源,必须执行收集命令将项目内静态资源、admin后台静态资源全部汇总到STATIC_ROOT指定的目录:
# 进入项目虚拟环境,在manage.py同级目录下执行 python manage.py collectstatic --noinput
执行完成后确认STATIC_ROOT对应的static目录下存在css、js、图片、admin等静态资源子目录。
5. 特殊情况排查
如果以上操作完成后仍返回403,检查是否手动开启了SElinux,SElinux默认会拦截Nginx访问用户目录的请求,执行setenforce 0临时关闭测试,如果关闭后资源加载正常,给静态资源目录添加SElinux访问白名单即可。
所有操作完成后按Ctrl+F5硬刷新浏览器即可正常加载所有静态资源。
内容的提问来源于stack exchange,提问作者Yaroslav 417
相关产品推荐
相关产品推荐

