Nginx + Django 静态文件问题

问题描述 投票:0回答:1

我的项目有问题。当 settings.py 中的 DEBUG=True 时,我的 Django 项目中一切正常。但是,一旦我将其更改为 False,当我访问我的网站(本地主机)时就会遇到此问题: 当 DEBUG=False 时,本地主机出现错误消息

这可能意味着我的静态文件未正确发送到我的 Nginx,或者我的 Nginx Web 服务器未正确配置为接收/使用我的静态文件。

这是我正在使用的 docker-compose:

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
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  nginx:
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    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:

我的 Django 项目的 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/

settings.py 静态文件:

STATIC_URL = '/static/'

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

Nginx Dockerfile:

# Use the official NGINX image from Docker Hub
FROM nginx:1.21.6

# Remove the default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

# Copy the custom nginx.conf
COPY nginx.conf /etc/nginx/conf.d/

# Copy your SSL certificate and key
COPY certs/nginx-selfsigned.crt /etc/nginx/certs/
COPY certs/nginx-selfsigned.key /etc/nginx/certs/

Nginx.conf:

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 / {
        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;
    }
}

我已经被这个问题困扰了三天了,如果大家有任何想法请帮忙,非常感谢!

我已经尝试了很多不同的方法来重做项目的所有 Dockerfile 和 .conf,但遗憾的是没有成功。

django nginx dockerfile static-files
1个回答
0
投票

DEBUG=False
时,Django不会像
DEBUG=True
时那样提供静态文件,所以你必须负责它。

您很可能会收到 404 HTML 响应,因此会出现错误。

首先收集静态文件:

python manage.py collectstatic

要求 django 收集所有静态文件并将它们放在一个文件夹中,NGinx 将使用该文件夹来提供服务。

然后更新您的 NGinx 配置以提供这些文件:

server {
    listen 80;
    ...
    location /static/ {
        root /path/to/static;
    }
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.