Как настроить 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. Также убедитесь, что статические маршруты настроены правильно