You need to enable JavaScript to run this app. Django结合Docker、Nginx、PostgreSQL部署时静态文件访问异常问题求解
优惠活动
大模型
产品
解决方案
定价
更多

Django结合Docker、Nginx、PostgreSQL部署时静态文件访问异常问题求解

静态资源加载异常修复方案

核心问题定位

  • 直接访问127.0.0.1:8000的方式完全绕开Nginx的静态资源转发规则。8000是gunicorn监听的Django服务端口,gunicorn本身不处理静态文件请求——DEBUG=True模式下自动返回静态文件是Django自带runserver的逻辑,gunicorn部署时该逻辑不会触发。正确的外部访问入口是Nginx监听的80端口,即http://127.0.0.1/admin,不需要加8000端口。
  • Nginx媒体资源规则配置错误:当前default.conf中location /media/的alias指向/backend/static,与静态文件路径重复,无法读取媒体文件。
  • Nginx容器挂载路径与配置不匹配:docker-compose中Nginx服务的静态目录挂载为./backend/languages/static:/static,但Nginx配置中静态文件alias写的是/backend/static,路径无法对应;同时媒体目录未做任何映射,Nginx容器内完全读取不到媒体文件。
  • backend服务的build路径配置错误:docker-compose中backend服务的build路径写为./backend/languages,但实际Dockerfile位于./backend目录下,build上下文不匹配。

配置修改步骤

1. 修正Nginx核心配置

替换nginx/default.conf内容,对齐挂载路径,修正媒体路径错误:

upstream django {
    server backend:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://django;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /static/;
        autoindex off;
    }

    location /media/ {
        alias /media/;
        autoindex off;
    }
}

2. 修正docker-compose编排配置

调整build路径、目录挂载规则,确保Nginx容器能正确读取静态、媒体文件:

version: "3.7"

services:
  backend:
    build: ./backend
    stdin_open: true
    tty: true
    restart: "on-failure"
    env_file:
      .env
    volumes:
      - ./backend/languages:/backend
      - ./backend/languages/static:/backend/static
      - ./backend/languages/media:/backend/media
    ports:
      - 8000:8000
    networks:
      - nginx_network
      - db_network
    depends_on:
      - db
  db:
    image: postgres:11
    restart: "on-failure"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    networks:
      - db_network
  
  nginx:
    build: ./nginx
    restart: always
    volumes:
      - ./backend/languages/static:/static
      - ./backend/languages/media:/media
    ports:
      - 80:80
    networks:
      - nginx_network
    depends_on:
      - backend

networks:
  nginx_network:
    driver: bridge
  db_network:
    driver: bridge

volumes:
  postgres_data:

3. 重启服务

执行重新构建命令生效配置:
docker-compose down && docker-compose up --build -d
启动完成后直接访问http://127.0.0.1/admin,静态资源即可正常加载。

补充注意事项

  • alias路径末尾的斜杠不可省略,否则会出现路径拼接错误(比如请求/static/admin/css/base.css会被错误映射为/staticadmin/css/base.css,触发404)。
  • 后续生产环境部署时,需要将DEBUG改为False,同时将ALLOWED_HOSTS配置为实际访问域名,不要使用通配符*,此时静态、媒体请求将完全由Nginx处理,上述配置已适配该场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 17:45:04