Nginx
Nginx будет использоваться в качестве обратного прокси сервера для сервера приложений Gunicorn, так-же на него будет возложена работа по выдаче статических файлов.
Первое, что мы сделаем - добавим следующие строки в файл docker-compose.prod.yml:
version: '3.8'
services:
web:
# Берем Dockerfile из каталога app
build:
context: ./app
dockerfile: Dockerfile.prod
# Запускаем сервер gunicorn
command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
# Открываем порт 8000 внутри и снаружи
ports:
- 8000:8000
# Файл содержащий переменные для контейнера
env_file:
- .env.prod
# Дожидаемся запуска контейнера db и memcached
depends_on:
- db
- memcached
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=book_django
- POSTGRES_PASSWORD=pass_book_django
- POSTGRES_DB=book_django
memcached:
image: memcached:1.6.21
ports:
- 11211:11211
nginx:
build: ./nginx
ports:
- 80:80
depends_on:
- web
volumes:
postgres_data:
В примере выше мы открываем стандартный 80й порт для посетителей сайта, который будет перенаправлять пакеты на 80й порт контейнера nginx. Вы можете изменить 80й порт на любой другой.
Создадим папку nginx, в которой будут хранится конфигурационный файл htmx_book.conf и файл Dockerfile.
В файл htmx_book.conf добавим следующий код:
upstream htmx_book {
# Список бэкэнд серверов для проксирования
server web:8000;
}
server {
listen 80;
# Ваш домен
server_name 127.0.0.1;
# Параметры проксирования
location / {
# Если будет открыта корневая страница
# все запросу пойдут к одному из серверов
# в upstream htmx_book
proxy_pass http://htmx_book;
# Устанавливаем заголовки
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# Отключаем перенаправление
proxy_redirect off;
}
}
Что бы файл конфигурации попал в контейнер мы должны создать отдельный Dockerfile:
FROM nginx:1.25
RUN rm /etc/nginx/conf.d/default.conf
COPY htmx_book.conf /etc/nginx/conf.d/
После создания контейнера Nginx, мы закроем прямой доступ к контейнеру с Django через 8000й порт.
К контейнеру с Django будет разрешено обращаться только сервисам Docker.
Для этого заменим port на expose, в результате наш файл docker-compose.prod.yml будет выглядеть следующим образом:
version: '3.8'
services:
web:
# Берем Dockerfile из каталога app
build:
context: ./app
dockerfile: Dockerfile.prod
# Запускаем сервер gunicorn
command: gunicorn core.wsgi:application --bind 0.0.0.0:8000
# Слушаем порт 8000
expose:
- 8000
# Файл содержащий переменные для контейнера
env_file:
- .env.prod
# Дожидаемся запуска контейнера db и memcached
depends_on:
- db
- memcached
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=book_django
- POSTGRES_PASSWORD=pass_book_django
- POSTGRES_DB=book_django
memcached:
image: memcached:1.6.21
ports:
- 11211:11211
nginx:
build: ./nginx
ports:
- 80:80
depends_on:
- web
volumes:
postgres_data:
Запустим контейнеры еще раз и убедимся, что они работают:
docker-compose -f docker-compose.prod.yml down -v
docker-compose -f docker-compose.prod.yml up -d --build
docker-compose -f docker-compose.prod.yml exec web python manage.py migrate --noinput
Если мы перейдем по адресу http://127.0.0.1 (если порт не указан, используется 80й порт), то мы увидим что наш проект работает, а если перейдем по прежнему адресу http://127.0.0.1:8000, то получим ошибку.