Ubuntu系统下Nginx无法加载Django站点静态/媒体文件的权限问题
看起来你已经把静态和媒体目录的所有者设为www-data了,但还是碰到了403权限拒绝的问题,我帮你梳理几个大概率的原因和对应的解决办法:
1. 检查父目录的遍历权限
Nginx的worker进程是以www-data用户运行的,要访问/home/jamelaumn/myproject里的文件,必须让www-data能遍历到这个目录的所有父级路径。你现在只检查了项目目录本身的权限,但/home/jamelaumn这个用户家目录的权限可能没开放给www-data。
先查看家目录的权限:
ls -ld /home/jamelaumn
如果输出是类似drwx------的权限,说明只有jamelaumn用户能访问这个目录,www-data根本进不去,自然读不到里面的静态文件。
解决办法二选一:
- 简单粗暴给其他用户添加执行权限(适合测试或非敏感环境):
chmod o+x /home/jamelaumn - 更安全的方式:把
jamelaumn用户加入www-data组,然后给组添加执行权限:usermod -aG www-data jamelaumn chmod g+x /home/jamelaumn
2. 检查静态文件的实际权限
虽然目录的所有者是www-data,但目录里的文件可能还是其他用户(比如root)所有,这也会导致Nginx无法读取。可以查看单个问题文件的权限验证:
ls -l /home/jamelaumn/myproject/deploystatic/css/general/normalize.css
如果文件所有者不是www-data,递归修改整个静态和媒体目录的所有者即可:
chown -R www-data:www-data /home/jamelaumn/myproject/deploystatic chown -R www-data:www-data /home/jamelaumn/myproject/media
3. 修正Nginx配置中的alias路径格式
你的Nginx配置里,location /static/对应的alias末尾没有加斜杠,这可能导致路径拼接错误。比如访问/static/css/normalize.css时,Nginx会错误地去找/home/jamelaumn/myproject/deploystaticcss/normalize.css,自然会报错。
修改配置文件/etc/nginx/sites-available/myproject,给alias路径加上末尾的斜杠:
location /static/ { alias /home/jamelaumn/myproject/deploystatic/; } location /media/ { alias /home/jamelaumn/myproject/media/; }
修改完成后重启Nginx生效:
sudo systemctl restart nginx
4. 排查SELinux(如果你的系统启用了它)
Ubuntu默认是关闭SELinux的,但如果你的系统手动开启了这个安全模块,它可能会阻止Nginx访问用户家目录下的文件。可以临时关闭SELinux测试:
sudo setenforce 0
如果关闭后静态文件能正常加载了,就需要配置SELinux规则来允许Nginx访问这些目录:
sudo semanage fcontext -a -t httpd_sys_content_t "/home/jamelaumn/myproject/deploystatic(/.*)?" sudo semanage fcontext -a -t httpd_sys_content_t "/home/jamelaumn/myproject/media(/.*)?" sudo restorecon -Rv /home/jamelaumn/myproject/deploystatic sudo restorecon -Rv /home/jamelaumn/myproject/media
额外提醒
你的Gunicorn进程目前是用root用户运行的,虽然这不是静态文件权限问题的直接原因,但生产环境下不推荐这么做,存在安全风险。建议后续改成用www-data用户或者专门的项目用户来运行Gunicorn。
备注:内容来源于stack exchange,提问作者Jamelaumn

