Установка Gunicorn и настройка Nginx для Django-проектов

Просмотры: 2588
Категория: Администрирование
Создано: 19 января 2021
Тэги: Linux Python Ubuntu Django WSGI

Я уже поднимал тему о том, как запускать на продакшне django-проекты, используя связку uwsgi+nginx. Сегодня рассмотрим другую возможность поднять django-проект на боевом сервере. Для этих целей будем использовать WSGI-сервер Gunicorn. Он представляет собой портированный на Python проект Unicorn для Ruby. Gunicorn прост в настройке, лекго устанавливается. Многие админы рекомендуют его в качестве WSGI-сервера для Django-проектов.

Начнём с установки. Перейдём в директорию с нашим django-проектом и активируем виртуальное окружение

cd /path/to/my/django/project

source venv/bin/activate

Устанавливаем Gunicorn

pip install gunicorn

Теперь создадим файл сокета Gunicorn

sudo nano /etc/systemd/system/gunicorn.socket

Он будет состоять из трёх разделов: [Unit] для описания сокета, [Socket] для определения расположения сокета и [Install] для обеспечения установки этого сокета в нужное время.

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Теперь необходимо создать служебный файл systemd для Gunicorn

sudo nano /etc/systemd/system/gunicorn.service

Начинаем с раздела [Unit]. Здесь добавляем описание службы. С помощью директивы Required указываем на необходимый сокет. Также указываем, что запускать службу нужно после запуска сети.

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

В разделе [Service] указываем владельца и группу, которые будут запускать эту службу. Задаём рабочий каталог (путь до директории, где лежит manage.py). Также привяжем службу к Unix-сокету, который создает процесс gunicorn.socket

[Service]
User=our_user
Group=nginx
WorkingDirectory=/home/our_user/path/to/django/project
ExecStart=/home/our_user/path/to/django/project/venv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

Наконец добавляем раздел [Install], который указывает, когда запускать Gunicorn. Нам необходимо, чтобы он запускался в многопользовательском режиме

[Install]
WantedBy=multi-user.target

Запускаем и активируем сокет.

sudo systemctl start gunicorn.socket

sudo systemctl enable gunicorn.socket

Проверяем, удалось ли запустить сокет:

sudo systemctl status gunicorn.socket

Проверяем наличие gunicorn.sock файла в директории /run:

file /run/gunicorn.sock

Если systemctl status указывает на ошибку и файл gunicorn.sock отсутствует в директории /run, находим ошибки и исправляем. Если ошибок нет, двигаемся дальше.

В самом начале, когда мы запустили только gunicorn.socket служба gunicorn.service не будет активна из-за отсутствия подключения к сокету. Проверяем это

sudo systemctl status gunicorn

Теперь тестируем активацию службы при подключении к сокету:

curl --unix-socket /run/gunicorn.sock localhost

Если всё настроено правильно, получим на консоль html-файл главной страницы. В противном случае отлавливаем и устраняем ошибки.

Ещё раз проверяем, запущен ли сервис gunicorn.

sudo systemctl status gunicorn

Если вносились какие-то изменения в конфигурационные файлы службы gunicorn.service, перезапускаем systemd и gunicorn:

sudo systemctl daemon-reload

sudo systemctl restart gunicorn

Если всё работает как часы и нет ошибок, идём настраивать nginx. Тут всё как обычно. Только лишь в разделе server дописываем следующее

location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

Проверяем конфиг-файл nginx-а на ошибки

sudo nginx -t

И перезапускаем его

sudo systemctl restart nginx

Конфигурация Gunicorn+Nginx закончена!