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-проекту
Ставим 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 с проектом и передавать все запросы в него.
При работе под сервером 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
Эта же команда (но с параметрами start, stop или restart управляет юнитами: этими командами можно запустить, остановить или перезапустить процесс (в случае с юнитом gunicorn можно запустить, остановить или перезапустить сервер Gunicorn).
Время запустить юнит (фактически запуск юнита означает запуск процесса, в нашем случае — запуск сервера Gunicorn).
Скопировать кодBASH
sudo systemctl start gunicorn # запустить юнит
Дополнительной командой добавим юнит gunicorn в список автозапуска операционной системы.
Скопировать кодBASH
sudo systemctl enable gunicorn # включить юнит в автозапуск при загрузке системы
Теперь Gunicorn будет работать всегда: он запустится при старте операционной системы, автоматически перезапустится при возникновении проблем, а управлять им теперь можно командами sudo systemctl start/stop/restart.