如何配置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; } }
关键配置说明
aliasvsroot的区别
这里用alias而不是root是因为:当location路径(比如/media/)和实际目录的后缀一致时,root也能工作,但alias更直观且不易出错——它会直接把/media/xxx映射到/data/ldl/repo/myProject/media/xxx,完全匹配Django的资源路径规则。避免端口冲突
注意:Nginx监听8000端口,所以你的Django应用(不管是用runserver测试还是uwsgi/gunicorn部署)不能再占用8000端口,建议让Django运行在本地端口(比如8001),这样Nginx才能正常接收请求并转发。权限与路径验证
- 确保
/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
- 确保
Django项目配置匹配
确保你的Djangosettings.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/'
配置生效步骤
- 检查Nginx配置语法是否正确:
nginx -t - 重载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
相关产品推荐
相关产品推荐

