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

Nginx无法加载Django静态/媒体文件,关闭Debug后配置异常如何解决?

问题排查与修正方案

核心问题点

  • 权限问题:静态/媒体文件存放在/root目录下,Nginx默认运行用户(通常为www-data)无权限读取/root目录内的文件,直接导致403/404错误
  • Django配置缺失:settings.py未配置STATIC_ROOT,关闭Debug模式前未执行静态文件收集命令
  • 多余配置:urls.py中添加的媒体文件服务配置仅在Debug=True时生效,关闭Debug后无效,不需要保留
  • Nginx alias配置可优化:当前alias配置未加结尾斜杠,可能出现路径拼接错误,同时缺少静态资源缓存规则会影响加载性能

具体修正步骤

第一步:调整Django配置

修改settings.py,补充STATIC_ROOT配置:

STATIC_URL = '/static/'
# 新增STATIC_ROOT,指定collectstatic命令收集静态文件的输出目录
STATIC_ROOT = os.path.join(BASE_DIR, "static")
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

执行静态文件收集命令,将所有应用的静态文件汇总到STATIC_ROOT目录:

python manage.py collectstatic

移除urls.py末尾的+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)配置,关闭Debug后该配置不会生效,无需保留。

第二步:调整文件存放路径解决权限问题

不要将项目静态/媒体文件放在/root目录下,建议迁移到/var/www/或者普通用户家目录下,比如迁移到/var/www/labelEngine/目录,然后给Nginx运行用户授权:

sudo chown -R www-data:www-data /var/www/labelEngine/
sudo chmod -R 755 /var/www/labelEngine/

第三步:修正Nginx配置

修改静态/媒体路径的location配置,替换为新的目录路径,补充结尾斜杠和缓存规则:

upstream backend {
    server localhost:8000;
}

server {
    server_name wavera.ru www.wavera.ru;
    location / {
        include proxy_params;
        proxy_pass http://backend;
    }
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.wavera.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.wavera.ru/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location /static/ {
        # 替换为新的STATIC_ROOT路径,结尾加斜杠
        alias /var/www/labelEngine/static/;
        # 新增静态资源缓存规则
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        # 替换为新的MEDIA_ROOT路径,结尾加斜杠
        alias /var/www/labelEngine/media/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
    
}

server {
    if ($host = wavera.ru) {
        return 301 https://$host$request_uri;
    }
    if ($host = www.wavera.ru) {
        return 301 https://$host$request_uri;
    }
    listen 80 ;
    server_name wavera.ru www.wavera.ru;
    return 404;
}

修改完成后测试Nginx配置合法性并重载生效:

sudo nginx -t
sudo systemctl reload nginx

内容的提问来源于stack exchange,提问作者movax100movbx20mul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:36:03