Docker环境下Django+Nginx静态文件访问配置及连接异常排查
问题排查步骤
1. 容器网络连通性验证
- 进入Nginx容器,执行命令测试与Django容器的连通性:
curl http://<django-service-name>:<django-port>/admin(替换成你docker-compose里Django服务的名称和端口,比如curl http://django:8000/admin)。如果请求失败,说明容器间网络不通:- 检查docker-compose.yml中两个服务是否属于同一个自定义网络(默认的bridge网络也可,但自定义网络更稳定);
- 确认Django服务的
expose或ports配置是否正确暴露了服务端口(容器间通信不需要映射到宿主机,只要容器内端口监听0.0.0.0)。
2. 静态文件配置核对
- 检查Django的
settings.py:- 确认
STATIC_ROOT设置了静态文件收集路径(比如STATIC_ROOT = '/usr/src/app/staticfiles'); - 确认
STATIC_URL配置正确(比如STATIC_URL = '/static/'); - 确保Django容器启动时执行了
collectstatic命令,可在docker-compose的Django服务中添加:command: sh -c "python manage.py collectstatic --noinput && python manage.py runserver 0.0.0.0:8000"
- 确认
- 检查docker-compose的卷挂载配置:
- 需将Django的静态文件目录挂载到Nginx容器的对应目录,示例:
volumes: - static_volume:/usr/src/app/staticfiles # Django侧 nginx: volumes: - static_volume:/usr/share/nginx/html/static # Nginx侧
- 需将Django的静态文件目录挂载到Nginx容器的对应目录,示例:
- 检查Nginx配置文件:
- 静态文件的location块需指向挂载路径:
location /static/ { root /usr/share/nginx/html; expires 30d; } - 反向代理Django的location块需正确指向服务地址:
location / { proxy_pass http://<django-service-name>:<django-port>; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
- 静态文件的location块需指向挂载路径:
3. 文件权限排查
- 进入Nginx容器,执行
ls -l /usr/share/nginx/html/static,确认静态文件对Nginx运行用户(通常是www-data)有可读权限; - 若权限不足,可在Django容器启动时添加权限设置命令:
chmod -R 755 /usr/src/app/staticfiles; - 确认Django容器运行用户有
STATIC_ROOT目录的写入权限,避免collectstatic执行失败。
4. 端口与访问路径检查
- 检查docker-compose中Nginx服务的端口映射,确保宿主机端口正确映射(比如
ports: - "80:80"),若宿主机80端口被占用,需更换端口(如8080:80),访问时对应使用http://127.0.0.1:8080/kurai/login; - 核对Django的URL配置,确认
/kurai/login路径在路由中存在,且Nginx未对路径进行错误截断(proxy_pass后不要额外添加路径,除非Django配置了子路径服务)。
内容的提问来源于stack exchange,提问作者FabriPostRock
相关产品推荐
相关产品推荐

