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
相关产品推荐
相关产品推荐

