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

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配置和卷挂载规则。

最终操作步骤

  1. 调整上述配置后,停止并重新构建服务:
docker compose down
docker compose build
docker compose up -d
  1. 访问http://0.0.0.0:80验证静态文件是否正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:45:38