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

Nginx+Django部署后静态资源无法加载问题求助

Django Admin静态资源加载失败问题排查与解决

问题场景

环境为Django + uWSGI + Nginx + PostgreSQL,已执行python manage.py collectstatic将静态文件收集至movies_admin/static目录,但通过Nginx访问127.0.0.1/admin时,页面仅加载文本、表单字段,图片、CSS等静态资源完全无法显示。

现有配置文件

docker-compose.yml

version: '3'

services:
  django:
    restart: always
    build: movies_admin/.
    env_file:
      - .env
    ports:
      - "8000:8000"
    container_name: work_django
    depends_on:
      - postgres

  postgres:
    restart: always
    env_file:
      - .env
    image: 'postgres:${PG_VER}'
    environment:
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    container_name: work_database
    ports:
      - "5432:5432"
    volumes:
      - ${DB_VOLUME_CATALOG_PATH}:/var/lib/postgresql/data/

  nginx:
    image: 'nginx:${NGINX_VER}'
    volumes:
      - ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf:ro
      - ${NGINX_CONFD_CATALOG}:/etc/nginx/conf.d:ro
      - ${STATIC_PATH}:/var/www/static/:ro
    container_name: work_nginx
    depends_on:
      - django
    ports:
      - "80:80"

Nginx site.conf

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;

    location /static/ {
        alias /var/www/static/;
    }

    location @backend {
        proxy_pass http://django:8000;
    }

    location ~* \.(?:jpg|jpeg|gif|png|ico|css|js)$ {
        log_not_found off;
        expires 90d;
    }

    location / {
        try_files $uri @backend;
    }

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

Django settings.py 相关配置

STATIC_ROOT = '/var/www/static'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
    '/opt/app/static/',
]
STATIC_URL = '/static/'

排查修复步骤

1. 确认静态文件挂载与存在性

  • 检查.env里的STATIC_PATH是否指向本地的movies_admin/static目录,确保挂载路径正确。
  • 进入Nginx容器执行ls /var/www/static/,确认admin/css/、admin/img/这类Django admin的静态文件是否存在。

2. 调整Nginx规则优先级

当前配置中,后缀匹配的location ~* \.(jpg|jpeg|...)优先级高于/static/路径匹配,导致静态资源请求被错误转发到后端。修改配置如下:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;

    # 优先处理静态资源请求
    location /static/ {
        alias /var/www/static/;
        expires 90d;
        log_not_found off;
    }

    location @backend {
        proxy_pass http://django:8000;
        # 补充代理头,避免Django识别异常
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        try_files $uri @backend;
    }

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
  • 移除单独的后缀匹配规则,把缓存控制直接整合到/static/的location中。

3. 验证Django静态文件收集路径

  • 进入Django容器执行python manage.py collectstatic --noinput,确认输出是否将文件收集到/var/www/static(对应settings里的STATIC_ROOT)。
  • 如果容器内不存在/var/www/static目录,需要在Dockerfile中添加RUN mkdir -p /var/www/static,或者修改STATIC_ROOT为容器内的movies_admin/static,再通过docker-compose挂载到Nginx。

4. 检查浏览器请求状态

  • 打开浏览器开发者工具(F12),查看Network面板:
    • 若静态资源返回404:确认Nginx容器内对应路径下是否存在该文件。
    • 若返回502:检查Nginx容器能否ping通django容器(执行docker exec work_nginx ping django)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:37:19