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
相关产品推荐
相关产品推荐

