我的项目有问题。当 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,但遗憾的是没有成功。
当
DEBUG=False
时,Django不会像DEBUG=True
时那样提供静态文件,所以你必须负责它。
您很可能会收到 404 HTML 响应,因此会出现错误。
首先收集静态文件:
python manage.py collectstatic
要求 django 收集所有静态文件并将它们放在一个文件夹中,NGinx 将使用该文件夹来提供服务。
然后更新您的 NGinx 配置以提供这些文件:
server {
listen 80;
...
location /static/ {
root /path/to/static;
}
...
}