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

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
      
  • 确认静态资源已完成收集
    进入项目对应的Python虚拟环境,在项目根目录执行静态资源收集命令,将所有App、STATICFILES_DIRS下的静态文件汇总到STATIC_ROOT指定目录:
    python manage.py collectstatic --noinput
    
  • 校验配置并重载Nginx
    先执行配置校验命令,确认Nginx配置无语法错误:
    sudo nginx -t
    
    校验通过后执行重载命令让配置生效:
    sudo systemctl reload nginx
    
  • SELinux规则适配(仅当手动开启SELinux时需要操作)
    Ubuntu系统默认关闭SELinux,若你手动开启过该安全模块,可先临时关闭测试是否为规则拦截导致:
    sudo setenforce 0
    
    若临时关闭后静态资源可正常访问,无需长期关闭SELinux,执行以下命令为静态目录添加合法访问标签即可:
    sudo 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:03:18