Nginx未在80端口正常提供Django服务,静态文件加载异常求助
Django+Nginx+Docker静态文件访问问题排查与解决
问题说明
通过docker compose build和docker compose up启动Django应用后,直接访问Gunicorn端口http://0.0.0.0:8000时静态文件加载正常,但通过Nginx的80端口访问时静态文件无法显示。
排查与修复方案
1. 确认Django静态文件收集配置
首先检查Django项目的settings.py,确保静态文件收集路径与Docker卷挂载路径完全一致:
STATIC_URL = '/static/' STATIC_ROOT = '/static/' # 必须和容器内挂载的卷路径匹配
collectstatic命令会将静态文件收集到STATIC_ROOT指定的目录,如果此处配置错误,共享卷中不会生成静态文件,导致Nginx无法读取。
2. 修复静态文件权限
Alpine镜像默认权限设置可能导致Nginx无法读取静态文件。在entrypoint.sh中添加权限修改命令,确保Nginx有访问权限:
修改后的entrypoint.sh:
#!/bin/sh python manage.py migrate --no-input python manage.py collectstatic --no-input chmod -R 755 /static/ # 添加此行赋予静态文件可读权限 DJANGO_SUPERUSER_PASSWORD=$SUPER_USER_PASSWORD python manage.py createsuperuser --username $SUPER_USER_NAME --email $SUPER_USER_EMAIL --noinput gunicorn video_app.wsgi:application --bind 0.0.0.0:8000
3. 验证Nginx路径配置正确性
当前Nginx配置的alias语法是正确的,也可以用root指令替代验证,确保路径解析无误:
修改Nginx的default.conf:
upstream django { server django_gunicorn:8000; } server { listen 80; location / { proxy_pass http://django; } location /static/ { root /; # 替换alias,效果等价于alias /static/; } }
4. 验证共享卷内容一致性
分别进入Django和Nginx容器,检查/static/目录下是否存在静态文件:
# 检查Django容器内静态文件 docker exec -it $(docker ps -q -f name=django_gunicorn) ls /static/ # 检查Nginx容器内静态文件 docker exec -it $(docker ps -q -f name=nginx) ls /static/
如果两个容器的/static/目录内容不一致,说明卷挂载或collectstatic执行逻辑有问题,需重新检查STATIC_ROOT配置和卷挂载规则。
最终操作步骤
- 调整上述配置后,停止并重新构建服务:
docker compose down docker compose build docker compose up -d
- 访问
http://0.0.0.0:80验证静态文件是否正常加载。
内容的提问来源于stack exchange,提问作者pyalis
相关产品推荐
相关产品推荐

