You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu服务器Django媒体文件加载403 Forbidden问题求助

彻底解决Nginx 403 Forbidden(媒体文件加载失败)问题

嘿,咱们一次性把这个Nginx 403的问题搞定!核心原因是你上传的媒体文件权限是rw--------——只有文件所有者能读写,但Nginx(通常以www-data这类用户运行)根本读不了这些文件。你临时改权限能解决现有文件的问题,但新上传的文件还是会用默认的严格权限,所以过段时间又会出问题。下面是永久解决的步骤:

1. 先搞清楚谁在运行Nginx和Django

这一步很关键,得确认两个服务的运行用户:

  • 查看Nginx的运行用户:
    ps aux | grep nginx
    
    输出里第一列就是用户,绝大多数情况下是www-data。
  • 查看Django进程的运行用户(比如用gunicorn/uwsgi部署的话):
    ps aux | grep gunicorn  # 如果是uwsgi就替换成uwsgi
    
    找到对应的用户,可能是你的登录用户、django或者也是www-data。

2. 调整文件/目录的所属关系,让Nginx有权访问

把媒体目录的所属组改成Nginx的运行用户组(一般也是www-data),同时让Django的运行用户加入这个组:

  • 修改媒体目录的所有者和组:
    sudo chown -R 你的Django运行用户:www-data /home/django/media/image/
    
    把你的Django运行用户替换成刚才查到的Django进程用户。
  • 如果Django用户不在www-data组里,把它加进去:
    sudo usermod -aG www-data 你的Django运行用户
    
    执行完后记得重启Django进程(比如重启gunicorn/uwsgi服务),这个修改才会生效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:49