WSGI. Gunicorn

Во время работы над Django-проектом командой runserver вы запускали сервер разработчика. Этот сервер встроен в Django и интегрирован с ним, он удобен и практичен, однако стабильно работает только при небольшой нагрузке.
Сервер разработчика не предназначен для многопользовательского режима: он не выдержит и просто перестанет работать, когда на ваш сайт одновременно зайдёт несколько посетителей.
Для запуска проекта на хостинге нужен боевой веб-сервер, который умеет держать нагрузку, например nginx (название произносится «энджин-икс»), один из самых популярных веб-серверов в мире.
nginx — отличный сервер, но, в отличие от сервера разработчика Django, nginx не умеет напрямую взаимодействовать с Django-проектом, ему необходима программа-посредник, интерфейс между nginx и Django.
И тут на помощь приходит WSGI (Web-Server Gateway Interface) — стандарт взаимодействия Python-фреймворка и веб-сервера. Дополнительную информацию о нём можно найти здесь, в описании стандартов Python.
Чтобы веб-сервер nginx и Django-проект начали понимать друг друга, Django должен быть запущен на wsgi-сервере.
Есть несколько таких серверов, мы выбрали wsgi-сервер Gunicorn.
После подключения nginx и Gunicorn обработка запросов будет происходить так:
  • отправленный к серверу запрос примет nginx
  • nginx передаст запрос wsgi-серверу Gunicorn
  • Gunicorn преобразует запрос в понятный для Django формат и передаст его Django-проекту
image

Ставим Gunicorn

На своём сервере перейдите в директорию с проектом, активируйте виртуальное окружение и через менеджер пакетов pip установите Gunicorn:
Скопировать кодBASH
pip install gunicorn
При разработке Django-проекта вы запускали сервер разработки, на сервере вместо него будет Gunicorn. Запускайте Gunicorn:
Скопировать кодBASH
gunicorn --bind 0.0.0.0:8000 yatube.wsgi
Gunicorn выполнит команду bind (англ. «связать») с двумя параметрами: address:port и путь до wsgi-модуля проекта, который представляет собой файл для запуска приложения в боевом режиме.
Фактически эта команда указывает серверу Gunicorn, что надо связать указанный в параметре IP с проектом и передавать все запросы в него.
Откройте ваш проект в браузере: http://xxx.xxx.xxx.xxx:8000/ и убедитесь, что приложение работает.
При работе под сервером Gunicorn статичные файлы (например — изображения и css-стили) не будут отображаться: этот сервер работает только с динамическими запросами. Проект выглядит не очень: нет картинок и оформления, но это не беда, в следующем уроке вы настроите nginx, он и займётся статикой.
Перейдите в консоль и нажмите Ctrl+C, чтобы остановить сервер.

Демон systemd

Программы на сервере должны работать постоянно и оперативно перезапускаться при возникновении проблем. Кто-то должен следить за ними. Сидеть и отслеживать вручную, не упал ли сервер и всё ли работает — занятие скучное и неблагодарное.
Лучше поручить это менеджеру процессов systemd (system daemon).
«Демонами» в Linux называют программы, которые запускаются автоматически при старте операционной системы и работают в фоновом режиме. Они обеспечивают решение каких-то служебных задач и не предназначены для взаимодействия с пользователем.
systemd — стандартная утилита, демон в Linux, задача которого — контролировать состояние запущенных процессов — программ.
При настройке и работе systemd отслеживаемые процессы называют «юнитами» (Unit). Создавая и настраивая юнит, администратор сервера ставит задание утилите systemd: «ты будешь следить за состоянием этой программы, а если программа зависнет или выключится — перезапусти её».
Помимо тех юнитов, которые создаёт администратор сервера, systemd отслеживает и системные юниты, которые были созданы при установке операционной системы.

Юнит Gunicorn

К серверу Gunicorn у нас простые и понятные требования.
Он должен:
  • запускаться при старте системы,
  • работать непрерывно,
  • перезапускаться, если по какой-то причине отключится.
Вот эти задачи и решит systemd.
Создадим юнит для сервера Gunicorn. Для этого в директории /etc/systemd/system/ создадим файл gunicorn.service, в нём опишем команды для запуска, путь до проекта и виртуального окружения и права на запуск процесса.
После настройки юнита мы включим его в список автозапуска, и каждый раз при старте или перезагрузке операционной системы systemd будет запускать процесс, описанный в gunicorn.service (запускать сервер Gunicorn) и отслеживать состояние этого процесса.
С правами администратора создайте и откройте в nano файл gunicorn.service в директории /etc/systemd/system/
Скопировать кодBASH
sudo nano /etc/systemd/system/gunicorn.service
В этом файле опишите конфигурацию юнита:
Скопировать кодBASH
[Unit] # это текстовое описание юнита, пояснение для разработчика Description=gunicorn daemon # при старте операционной системы запускать процесс только после того, # как операционная система загрузится и настроит подключение к сети After=network.target [Service] # от чьего имени запускать процесс: # укажите имя, под которым вы подключались к серверу User=<имя-пользователя-в-системе> # адрес к директории, где установлен Gunicorn WorkingDirectory=/home/<имя-пользователя-в-системе>/<директория-проекта> # команду, которую вы запускали руками, теперь будет запускать systemd: # в указанной директории будет выполнена команда bind # и по запросу к 127.0.0.1:8000 будет выполнен файл запуска приложения yatube.wsgi # пробелы до символа \ важны, внимтельнее с ними ExecStart=<путь-до-gunicorn-в-виртуальном-окружении> \ --bind 127.0.0.1:8000 \ yatube.wsgi:application [Install] # группировка юнитов WantedBy=multi-user.target
Чтобы точно узнать путь до gunicorn (или любого другого приложения), воспользуйтесь командой which:
Скопировать кодBASH
which gunicorn # убедитесь, что виртуальное окружение активировано

Управление демоном и юнитами

Чтобы увидеть состояние всех запущенных юнитов — выполните команду
Скопировать кодBASH
sudo systemctl
image
Эта же команда (но с параметрами start, stop или restart управляет юнитами: этими командами можно запустить, остановить или перезапустить процесс (в случае с юнитом gunicorn можно запустить, остановить или перезапустить сервер Gunicorn).
Время запустить юнит (фактически запуск юнита означает запуск процесса, в нашем случае — запуск сервера Gunicorn).
Скопировать кодBASH
sudo systemctl start gunicorn # запустить юнит
Дополнительной командой добавим юнит gunicorn в список автозапуска операционной системы.
Скопировать кодBASH
sudo systemctl enable gunicorn # включить юнит в автозапуск при загрузке системы
Теперь Gunicorn будет работать всегда: он запустится при старте операционной системы, автоматически перезапустится при возникновении проблем, а управлять им теперь можно командами sudo systemctl start/stop/restart.