Проблема статических файлов Nginx + Django
У меня возникла проблема с моим проектом. У меня все работает в проекте Django, когда DEBUG=True в settings.py. Но как только я меняю его на False, я получаю эту проблему, когда захожу на свой сайт (localhost): Сообщение об ошибке с localhost при DEBUG=False
Что, вероятно, означает, что либо мои статические файлы неправильно отправляются на мой Nginx, либо мой веб-сервер Nginx неправильно настроен на получение/использование моих статических файлов.
Вот 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:
# 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_FILES:
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;
}
}
Я застрял
на этом уже 3 дня, если у кого-то из вас есть идеи, пожалуйста, помогите, спасибо большое!Я уже перепробовал множество различных способов переделать все мои Dockerfiles и .conf моего проекта, но, к сожалению, безуспешно.
При DEBUG=False
Django не обслуживает статические файлы, как это происходит при DEBUG=True
, поэтому вам придется взять это на себя.
Скорее всего, у вас 404 HTML-ответ, отсюда и ошибки.
Сначала соберите статические файлы:
python manage.py collectstatic
Попросить django собрать все статические файлы и поместить их в одну папку, которая будет использоваться NGinx для их обслуживания.
Затем обновите конфигурацию NGinx, чтобы обслуживать эти файлы:
server {
listen 80;
...
location /static/ {
root /path/to/static;
}
...
}