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

DEBUG=False时Django静态文件加载失败,Nginx配置求助

解决方案:DEBUG=False时静态文件无法加载问题

当Django设置DEBUG=False时,Django本身不再提供静态文件服务,必须由反向代理(如Nginx)来处理静态文件请求。结合现有配置,需要做以下几处修改:

1. 更新Django settings.py静态文件配置

添加STATIC_ROOT,指定collectstatic命令收集静态文件的目标目录:

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    BASE_DIR / 'webapp' / 'static',
]

# 新增:静态文件收集后的存放路径
STATIC_ROOT = BASE_DIR / 'staticfiles'

2. 修改Django Dockerfile,添加静态文件收集步骤

在Dockerfile末尾加入收集静态文件的命令:

# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /app

# Install dependencies
COPY requirements.txt /app/
RUN pip install --upgrade pip && pip install -r requirements.txt

# Copy project
COPY . /app/

# 收集静态文件到STATIC_ROOT目录
RUN python manage.py collectstatic --noinput

3. 修改docker-compose.yml,共享静态文件目录给Nginx

在web服务中添加静态文件卷共享,同时在nginx服务中挂载该卷:

version: '3.8'
services:
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
      # 共享收集后的静态文件目录
      - static_files:/app/staticfiles
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 挂载静态文件目录到Nginx容器内
      - static_files:/usr/share/nginx/html/static
    depends_on:
      - web
    restart: on-failure  # Ensures NGINX retries if it fails to start the first time

  migrations:
    build: .
    command: sh -c "python manage.py makemigrations && python manage.py migrate"
    depends_on:
      - db


volumes:
  postgres_data:
  # 新增:静态文件共享卷
  static_files:

4. 更新Nginx配置,添加静态文件处理规则

在Nginx的server块中新增location /static/,直接返回静态文件:

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;  # Redirect HTTP to HTTPS
}

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /etc/nginx/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/nginx/certs/nginx-selfsigned.key;

    # 处理静态文件请求,直接返回本地文件
    location /static/ {
        root /usr/share/nginx/html;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }

    location / {
        proxy_pass http://web:8000;  # Note: http not https
        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;
    }
}

5. 重新构建并启动服务

执行以下命令完成部署:

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

修改完成后,Nginx会直接处理所有/static/路径的请求,不再转发给Django,即可解决DEBUG=False时静态文件无法加载的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:41