Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

11.7 Подготовка к деплою, Gunicorn и NGINX в Docker Compose
3 из 3 шагов пройдено

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, то получим ошибку.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

По ссылке переходим на 1337 порт почемуто.

@Николай_Петров, спасибо, исправил.

А у меня по прежнему тоже без ошибок загружает