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

如何配置Nginx以提供Django/DRF的媒体与静态资源?

解决Django DRF项目Nginx配置中Media/Static资源无法访问的问题

首先,你的现有配置存在几个核心问题:多个/media/规则优先级冲突、API请求被错误指向静态HTML目录,以及资源路径映射可能不匹配。下面是针对你的场景优化后的完整Nginx配置,以及关键要点说明:

正确的Nginx配置

server {
    listen 8000;
    server_name 103.20.12.76;

    # 日志配置
    access_log /data/ldl/logs/103.20.12.76.access.log main;
    error_log /data/ldl/logs/103.20.12.76.error.log warn;

    # 处理Media资源:直接返回磁盘上的文件
    location /media/ {
        alias /data/ldl/repo/myProject/media/;  # 指向Django MEDIA_ROOT对应的实际目录
        expires 30d;  # 设置缓存有效期,减轻服务器压力
        access_log off;  # 关闭media资源的访问日志
        add_header Cache-Control "public, max-age=2592000";
    }

    # 处理Static资源:同理直接返回静态文件
    location /static/ {
        alias /data/ldl/repo/myProject/static/;  # 指向Django STATIC_ROOT对应的实际目录
        expires 30d;
        access_log off;
        add_header Cache-Control "public, max-age=2592000";
    }

    # 所有API请求反向代理到Django应用服务器
    location / {
        # 这里替换为你的Django服务实际监听的地址(比如uwsgi/gunicorn的本地端口,示例用8001)
        proxy_pass http://127.0.0.1:8001;
        # 传递必要的请求头,确保Django能正确获取客户端信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

关键配置说明

  1. alias vs root的区别
    这里用alias而不是root是因为:当location路径(比如/media/)和实际目录的后缀一致时,root也能工作,但alias更直观且不易出错——它会直接把/media/xxx映射到/data/ldl/repo/myProject/media/xxx,完全匹配Django的资源路径规则。

  2. 避免端口冲突
    注意:Nginx监听8000端口,所以你的Django应用(不管是用runserver测试还是uwsgi/gunicorn部署)不能再占用8000端口,建议让Django运行在本地端口(比如8001),这样Nginx才能正常接收请求并转发。

  3. 权限与路径验证

    • 确保/data/ldl/repo/myProject/media/和/static/目录存在,且Nginx进程有读取权限:
      chmod -R 755 /data/ldl/repo/myProject/media/
      chmod -R 755 /data/ldl/repo/myProject/static/
      
    • 手动检查目标文件是否存在:
      ls -l /data/ldl/repo/myProject/media/images/qiyun_admin_websitemanage/logo/logo_01_YGE3YKm.png
      
  4. Django项目配置匹配
    确保你的Django settings.py中资源路径配置与Nginx一致:

    # Media配置
    MEDIA_URL = '/media/'
    MEDIA_ROOT = '/data/ldl/repo/myProject/media/'
    
    # Static配置(如果使用collectstatic收集静态文件)
    STATIC_URL = '/static/'
    STATIC_ROOT = '/data/ldl/repo/myProject/static/'
    

配置生效步骤

  1. 检查Nginx配置语法是否正确:
    nginx -t
    
  2. 重载Nginx使配置生效:
    systemctl reload nginx
    

这样配置后,你就可以通过http://103.20.12.76:8000/media/images/qiyun_admin_websitemanage/logo/logo_01_YGE3YKm.png正常访问media资源,API请求也会正确转发到Django服务处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:11