Установка Gunicorn и настройка Nginx для Django-проектов
- Просмотры: 2724
- Категория: Администрирование
- Создано: 19 января 2021
- Тэги:
Я уже поднимал тему о том, как запускать на продакшне 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 закончена!