Docker部署Django+Nginx遇静态资源404问题求助
Django + Docker + Nginx 静态资源404问题排查方案
1. 确认Django静态资源收集配置与执行
- 检查
settings.py核心配置:DEBUG = False # 生产环境必须关闭,否则Django会自行处理静态资源,不符合生产规范 STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 静态文件统一收集目录 # 若有自定义静态目录,需添加到STATICFILES_DIRS STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] - 确保Django容器启动时执行了
collectstatic命令,比如在entrypoint.sh中添加:
这一步会把所有app的静态文件归集到python manage.py collectstatic --noinputSTATIC_ROOT目录,是Nginx能访问到静态资源的核心前提。
2. 修正Docker Compose的目录挂载配置
不要手动复制静态文件夹到Nginx容器,用Docker共享卷挂载更稳定可靠:
services: django: build: . volumes: - static_volume:/app/staticfiles # 将Django的STATIC_ROOT挂载到共享卷 nginx: image: nginx:alpine volumes: - static_volume:/usr/share/nginx/html/static # 共享卷挂载到Nginx的静态资源目录 - ./nginx/conf.d:/etc/nginx/conf.d # 挂载自定义Nginx配置 ports: - "80:80" volumes: static_volume: # 定义共享卷
3. 检查Nginx静态资源路由配置
确保Nginx的server块里正确匹配/static/请求:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://django:8000; # 转发动态请求到Django容器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { root /usr/share/nginx/html; # 注意这里是static目录的上级路径 expires 30d; add_header Cache-Control "public, max-age=2592000"; } }
如果使用alias,路径要写成/usr/share/nginx/html/static/,两种配置方式不要混淆。
4. 验证文件权限与存在性
- 进入Nginx容器,检查静态文件是否存在:
若文件不存在,回到Django容器检查docker exec -it <nginx-container-name> ls /usr/share/nginx/html/static/frontendcollectstatic是否执行成功,以及STATIC_ROOT路径是否正确。 - 确保静态文件权限允许Nginx读取,可在Django的
entrypoint.sh添加:chmod -R 755 /app/staticfiles
5. 排查浏览器缓存问题
有时候浏览器会缓存旧的请求路径,可按Ctrl+Shift+R强制刷新页面,或检查网络请求的实际路径是否与配置一致。
内容的提问来源于stack exchange,提问作者Kalpesh Chavan
相关产品推荐
相关产品推荐

