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

Django+docker-compose+Nginx部署时Admin静态文件缺失问题排查

问题诊断与修复方案

你的Admin静态文件404问题核心是请求未被Nginx正确拦截处理,同时Docker卷挂载路径与Django静态文件目录存在不一致,导致Nginx无法找到静态文件,请求最终落到Gunicorn(而Gunicorn默认不处理静态文件)。

1. 修复Nginx配置,确保/static/请求被正确拦截

当前Nginx的server_name设置为your_domain.com,如果用IP访问服务器或域名未解析到该服务器,Nginx会匹配默认server块,不会处理你定义的/static/路径,导致请求直接转发到Gunicorn,从而出现404。

修改nginx.conf的server_name:

server_name _;  # 匹配所有请求,适合IP访问或未绑定域名的场景
# 或者改为你的实际IP/域名,比如 server_name 192.168.1.100;

2. 统一Docker卷挂载路径,确保静态文件同步

当前配置存在路径混乱:

  • Web容器WORKDIR为/app,但docker-compose将项目挂载到/newspigeon,且static_files卷挂载到/newspigeon/static
  • Dockerfile中执行collectstatic时,静态文件会被收集到Djangosettings.py中STATIC_ROOT指定的路径(默认未修改时为/app/static)
  • Nginx容器将static_files卷挂载到/app/static,但Web容器的静态文件实际不在该路径

调整步骤:

(1)修改docker-compose.yml中Web服务的卷挂载

将Web容器的项目挂载路径改为与WORKDIR一致,同时确保静态文件卷挂载到collectstatic的目标路径:

web:
  # ...其他配置
  volumes:
    - .:/app  # 把项目挂载到WORKDIR对应的/app目录,而非/newspigeon
    - static_files:/app/static  # 静态文件卷挂载到collectstatic的目标路径

(2)删除Dockerfile中多余的目录创建命令

Dockerfile中RUN mkdir -p /app/newspigeon/static是多余的,collectstatic会自动创建STATIC_ROOT目录,直接删除这一行。

3. 确认Django配置正确

在Django的settings.py中检查以下配置:

DEBUG = False  # 生产环境必须关闭DEBUG,否则Django会自行处理静态文件,效率极低
STATIC_URL = '/static/'
STATIC_ROOT = '/app/static/'  # 必须与Docker中挂载的静态文件路径一致

4. 重新构建并启动服务

执行以下命令重新部署:

docker-compose down
docker-compose build --no-cache
docker-compose up -d

完成后可通过以下命令排查:

  • 检查Nginx容器内静态文件是否存在:
    docker exec -it newspigeon_nginx ls /app/static/admin
    
  • 查看Web容器collectstatic执行日志:
    docker logs newspigeon_web
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:43:13