Как настроить Nginx в качестве обратного прокси для Django в Docker?

Я пытаюсь настроить nginx в качестве обратного прокси для Django в docker, чтобы я мог запрашивать пароль у пользователей, у которых нет определенного IP. Однако я не могу заставить его работать.

У меня есть приложение Django с базой данных postgreSQL, все настроено и работает в Docker. У меня также есть контейнер Nginx, но я не могу понять, как соединить эти два приложения? Я не использовал Nginx раньше.

Ближе всего к тому, чтобы увидеть страницу приветствия Nginx на localhost:1337 и увидеть админку Django на localhost:1337/admin, но я получаю ошибку CSRF, когда я пытаюсь войти в систему.

Любая помощь будет очень признательна!

Я попробовал настроить Nginx в Docker, используя следующие файлы:

Вот мой файл docker-compose.yml:

services:
  web:
    build: .
    command: gunicorn config.wsgi -b 0.0.0.0:8000
    environment:
      - SECRET_KEY=django-insecure-^+v=tpcw8e+aq1zc(j-1qf5%w*z^a-5*zfjeb!jxy(t=zv*bdg
      - ENVIRONMENT=development
      - DEBUG=True
    volumes:
      - .:/code
      - static_volume:/code/staticfiles
    expose:
      - 8000
    depends_on:
      - db
    networks:
      - my-test-network

  db:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data/

  nginx:
    build: ./nginx
    ports:
      - "1337:80"
    volumes:
      - static_volume:/code/staticfiles
    depends_on:
      - web
    networks:
      - my-test-network

volumes:
  postgres_data:
  static_volume:

networks:
  my-test-network:
    driver: bridge

Вот мой dockerfile для Nginx:

FROM nginx:1.25

RUN rm /etc/nginx/conf.d/default.conf

COPY nginx.conf /etc/nginx/conf.d

Вот мой файл конфигурации Nginx:

upstream hello_django {
    server pk-portal-web-1:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://hello_django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /code/staticfiles/;
    }

}

Вот мой основной dockerfile для остальной части приложения:

# Pull base image
FROM python:3.10

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /code

# Install dependencies
COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system

# Copy project
COPY . /code/

Ошибка CSRF

Эта ошибка возникает, когда настройки, связанные с прокси, выполнены неправильно, и по этой причине запросы, отправляемые в Django, помечаются как неавторизованные. Чтобы исправить эту проблему, необходимо ввести следующий код в файл settings.py

USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

Подключение Nginx и Django

В файле nginx.conf вы задали имя сервиса Django как pk-portal-web-1. Но это имя сервиса должно точно совпадать с именем сервиса Django в файле docker-compose.yml.

Настройка обратного прокси

Убедитесь, что Nginx правильно настроен для пересылки запросов к Django. Также убедитесь, что статические маршруты настроены правильно

Вернуться на верх