Ubuntu服务器Django媒体文件加载403 Forbidden问题求助
嘿,咱们一次性把这个Nginx 403的问题搞定!核心原因是你上传的媒体文件权限是rw--------——只有文件所有者能读写,但Nginx(通常以www-data这类用户运行)根本读不了这些文件。你临时改权限能解决现有文件的问题,但新上传的文件还是会用默认的严格权限,所以过段时间又会出问题。下面是永久解决的步骤:
1. 先搞清楚谁在运行Nginx和Django
这一步很关键,得确认两个服务的运行用户:
- 查看Nginx的运行用户:
输出里第一列就是用户,绝大多数情况下是ps aux | grep nginxwww-data。 - 查看Django进程的运行用户(比如用gunicorn/uwsgi部署的话):
找到对应的用户,可能是你的登录用户、ps aux | grep gunicorn # 如果是uwsgi就替换成uwsgidjango或者也是www-data。
2. 调整文件/目录的所属关系,让Nginx有权访问
把媒体目录的所属组改成Nginx的运行用户组(一般也是www-data),同时让Django的运行用户加入这个组:
- 修改媒体目录的所有者和组:
把sudo chown -R 你的Django运行用户:www-data /home/django/media/image/你的Django运行用户替换成刚才查到的Django进程用户。 - 如果Django用户不在
www-data组里,把它加进去:
执行完后记得重启Django进程(比如重启gunicorn/uwsgi服务),这个修改才会生效。sudo usermod -aG www-data 你的Django运行用户
3. 设置默认权限掩码,让新上传的文件自动开放组权限
Django上传文件时,会用进程的umask(权限掩码)来设置新文件的权限。默认的umask可能是0022或0077,导致新文件没有组读权限。我们需要把Django进程的umask改成0002,这样新文件的权限会自动变成rw-rw----,Nginx所在的组就能读取了。
方法一:修改Django的启动服务(推荐,最稳定)
如果是用systemd服务启动Django(比如gunicorn的service文件),编辑服务配置:
sudo nano /etc/systemd/system/gunicorn.service # 替换成你的实际服务文件名
在[Service]区块里添加一行:
UMask=0002
然后重启服务让配置生效:
sudo systemctl daemon-reload sudo systemctl restart gunicorn
方法二:在Django代码里设置(应急用,不如方法一靠谱)
如果暂时没法修改服务配置,可以在Django的settings.py里加一行代码:
import os os.umask(0o002)
不过这种方式需要重启Django进程才会生效,且如果进程意外重启,得确保这个配置还在。
4. 一次性修复现有文件和目录的权限
最后,把现有媒体文件和目录的权限设置正确,确保Nginx能正常访问:
# 给文件设置rw-rw----权限(所有者和组可读写) sudo chmod -R 660 /home/django/media/image/ # 给目录设置rwxrwx---权限(需要执行权限才能遍历目录) sudo chmod -R 770 /home/django/media/image/
你之前用的a+X也能解决目录遍历的问题,但770更明确,只开放给所有者和组用户,安全性更高。
做完这些步骤后,新上传的文件会自动拥有组读权限,Nginx就能正常加载所有媒体内容,不会再出现权限问题复发的情况了。
内容的提问来源于stack exchange,提问作者Akash D

