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

Docker Compose部署Django应用:Nginx未托管静态文件求助

Django+Docker Compose部署中静态文件未被Nginx托管的问题

环境与文件信息

文件夹结构

docker_insta(根目录)
- insta_backend
  - insta_backend
  - manage.py
  - requirements.txt
  - Dockerfile
  - entrypoint.sh
- nginx
  - default.conf
  - Dockerfile
- docker-compose.yml

核心文件内容

docker-compose.yml

version: '3.9'
services:
  db:
    image: postgres:13.3
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - 5432:5432
    volumes:
      - db:/var/lib/postgresql/data
  redis:
    image: redis:6.2.4
    ports:
      - 6379:6379
  django:
    volumes:
      - static:/app/static
      - media:/app/media
    build: ./insta_backend
    ports:
      - 8000:8000
    depends_on:
      - db
      - redis
  nginx:
    build: ./nginx
    volumes:
      - static:/app/static
      - media:/app/media
    ports:
      - 80:80
    depends_on:
      - django

volumes:
  static:
  media:
  db:

Django Dockerfile

FROM python:3.9-alpine

RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . /app
WORKDIR /app

ENTRYPOINT [ "sh", "entrypoint.sh" ]

entrypoint.sh

#!/bin/sh

python manage.py migrate --no-input
python manage.py collectstatic --no-input

gunicorn insta_backend.wsgi:application --bind 0.0.0.0:8000

Nginx Dockerfile

FROM nginx:1.19.0-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf

default.conf

upstream django_server {
    server django:8000;
}

server {
    listen 80;

    location /static/ {
        alias /app/static/;
    }

    location /media/ {
        alias /app/media/;
    }

    location / {
        proxy_pass http://django_server;
    }
}

settings.py(相关片段)

...

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

...

问题现象

  • 所有容器启动正常
  • 访问localhost能看到Django应用,但静态文件加载失败
  • 日志显示/static/开头的请求被转发到Django服务器,而非由Nginx直接托管
  • 已确认Django与Nginx的卷挂载正常,双方都能查看静态文件夹内的文件

解决步骤

1. 确认请求路径与端口

当前django容器暴露了8000端口,若直接访问localhost:8000会绕过Nginx,必须确保访问的是localhost(80端口),让请求经过Nginx处理。

2. 检查Nginx配置的路径匹配

Nginx按顺序匹配location规则,当前配置逻辑正确,但需验证路径一致性:

  • 确保location /static/的末尾斜杠与alias /app/static/的斜杠完全对应,可尝试替换alias为root测试(注意路径拼接逻辑):
    location /static/ {
        root /app;  # 实际路径为/app/static/,root会自动拼接location路径
    }
    

3. 验证Nginx容器内静态文件存在性

进入Nginx容器,确认静态文件是否挂载到位:

docker-compose exec nginx ls /app/static

若文件不存在,检查Django容器内collectstatic是否正确生成文件:

docker-compose exec django ls /app/static

4. 排查Nginx配置语法错误

重启Nginx容器并查看日志,确认配置无语法问题:

docker-compose restart nginx
docker-compose logs nginx

若日志提示配置错误,修正default.conf后重新构建容器。

5. 优化Nginx配置

添加请求头与缓存规则,确保静态文件处理逻辑更健壮:

upstream django_server {
    server django:8000;
}

server {
    listen 80;
    server_name localhost;

    location /static/ {
        alias /app/static/;
        expires 30d;
        access_log off;
    }

    location /media/ {
        alias /app/media/;
        expires 30d;
        access_log off;
    }

    location / {
        proxy_pass http://django_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

6. 重新部署容器

修改配置后,重新构建并启动所有容器:

docker-compose down
docker-compose build nginx
docker-compose up -d

验证

访问localhost,打开浏览器开发者工具查看静态文件请求状态:

  • 返回200则说明Nginx已正确托管静态文件
  • 仍返回404则检查Nginx与Django日志,确认请求路径匹配情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:52:49