Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Развертывание приложений Python с помощью Gunicorn

10909
7 минут чтения
Средний рейтинг статьи: 3.7

В этой статье мы покажем, как настроить сервер с Ubuntu 20.04, установить и настроить компоненты, необходимые для развертывания приложений Python. Настроим WSGI-сервер Gunicorn для взаимодействия с нашим приложением. Он предоставит нам интерфейс, обеспечивающий преобразование клиентских запросов по протоколу HTTP в вызовы Python, исполняемые приложением. Потом мы настроим Nginx как обратный прокси-сервер для Gunicorn, чтобы перенаправлять запросы на Gunicorn-сервер, а также при необходимости защитить HTTP-соединения с помощью SSL-сертификата или воспользоваться другими полезными функциями: балансировкой нагрузки, кэшированием и другими. Все эти тонкости могут оказаться полезными при настройке работы с облачными сервисами, которые предоставляет timeweb.cloud

Обновление системы

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

Для обновления системы воспользуемся пакетным менеджером apt (advanced packaging tool) — утилитой для установки, обновления и удаления программных пакетов в операционных системах Linux. 

Обновление происходит с помощью команды:

    

Установка Python и сопутствующих компонентов

В Ubuntu последняя версия интерпретатора Python доступна по умолчанию. Проверим версию с помощью команды:

    

Результат: 

    

Создание виртуальной среды Python

Настроим виртуальную среду. Это позволит нашему проекту иметь свои собственные зависимости, отдельные от тех, что есть у других проектов. Устанавливаем пакет virtualenv, который позволит создавать виртуальные среды:

    

Создаём папку для нашего проекта и перейдем в нее:

    

Создаём виртуальную среду:

    

И папку самого проекта:

    

В папке нашего проекта должно быть два объекта — app и venv.

Проверить это можно с помощью стандартной для Linux систем команды для просмотра содержимого каталога:

    

Виртуальную среду необходимо активировать, чтобы все последующие компоненты устанавливались для проекта локально:

    

Облачные серверы

Масштабируемые вычислительные ресурсы
по всему миру с почасовой оплатой.

Установка и настройка Gunicorn

Gunicorn (Green Unicorn) — это HTTP-сервер Python WSGI для UNIX. Сервер Gunicorn легко совместим с различными веб-фреймворками, быстрый, прост в реализации, требует мало ресурсов сервера.

Установка Python Gunicorn:

    

WSGI Python

WSGI (Web Server Gateway Interface) — стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например Nginx.

Image1

WSGI-сервер вызывается приложением, которое позволяет нам запускать программный код в рамках обработки запросов. Обычно программный код предоставляется как объект с именем application в модуле Python, доступном для сервера. Стандартно в файле wsgi.py содержится такое вызываемое приложение.

Для примера создадим такой файл с помощью текстового редактора nano:

    

И поместим в него простой пример кода:

    

В коде выше импортируется aiohttp. Библиотека aiohttp предоставляет асинхронный HTTP-клиент, построенный поверх asyncio. HTTP-запросы — классический пример того, что хорошо подходит для асинхронности, поскольку они предполагают ожидание ответа от сервера, в течение которого было бы удобно и эффективно выполнять другой код. Данная библиотека предоставляет возможность отправлять запросы последовательно, но не дожидаясь первого ответа, прежде чем отправлять новый. Удобно запускать серверы aiohttp за Nginx

Запустить сервер можно с помощью команды построенной по шаблону:

    

Где [WSGI_APP] состоит из $(MODULE_NAME):$(VARIABLE_NAME), a [OPTIONS]набор параметров для настройки Gunicorn.

Простейшая команда будет выглядеть так:

    

Если потребуется перезапустить Gunicorn можно использовать команду restart gunicorn:

    

Systemd

Systemd — менеджер системных служб, который позволяет строго управлять процессами, ресурсами и разрешениями. Создадим сокет, который systemd будет прослушивать и автоматически запускать Gunicorn в ответ на трафик.

Добавим конфигурации для службы и сокета соответственно:

    

В этот файл с помощью текстового редактора добавим следующее:

    

В строке ExecStart необходимо указать путь до исполняемого файла gunicorn в виртуальном окружении. Вероятно, он будет выглядеть примерно так: /home/someuser/myapp/venv/bin/gunicorn.

А в /etc/systemd/system/gunicorn.socket добавим:

    

Включаем и запускаем сокет:

    

Настройка Gunicorn

Рассмотрим полезные параметры Gunicorn в Python 3. Все возможные параметры можно посмотреть в официальной документации.

Сокеты

-b BIND, --bind=BIND — указание серверного сокета. Можно указать в форматах: $(HOST), $(HOST):$(PORT)

Например:

    

Эта команда запустит наше приложение локально на порту 8080.

Рабочие процессы

-w WORKERS, --workers=WORKERS — количество рабочих процессов. Обычно это число должно составлять от 2 до 4 на ядро сервера.

Пример:

    

Тип процесса

-k WORKERCLASS, --worker-class=WORKERCLASS — тип рабочего процесса для запуска. 

sync — тип процесса по умолчанию. Это самый простой тип — синхронный рабочий процесс, который обрабатывает один запрос за раз. Другие типы может потребоваться устанавливать как зависимости.

Доступные асинхронные рабочие процессы основаны на Greenlets (через Eventlet и Gevent). Greenlets — это реализация совместной многопоточности для Python. Соответствующие параметры — eventlet и gevent.

Мы будем использовать асинхронный тип процесса, совместимый с aiohttp:

    

Журнал доступа

Также возможно использовать флаг --access-logfile, чтобы разрешить заполнение журнала доступа.

Например:

    

Журнал ошибок

С помощью такой команды можно указать журнал для логирования ошибок:

    

Степень детализации выходных данных журнала ошибок можно установить с помощью флага --log-level.

При работе с log в Gunicorn доступны следующие уровни:

  • ‘debug’
  • ‘info’
  • ‘warning’
  • ‘error’
  • ‘critical’

По умолчанию установлен уровень ‘info’, отрезающий информацию, относящуюся к debug’.

Установка и настройка Nginx

Запустим команду для установки Nginx:

    

Давайте проверим сможет ли демон Nginx подключиться к созданному ранее сокету:

    

Таким образом служба Gunicorn будет автоматически запущена, и мы увидим HTML-код от сервера в терминале.

Настройка Nginx

Настройка Nginx происходит путем добавления конфигурационных файлов для виртуальных хостов.

Стоит хранить конфигурацию каждого прокси в директории /etc/nginx/sites-available.

Запуск каждого из прокси серверов осуществляется через создание ссылки на него в директорию /etc/nginx/sites-enabled. При запуске Nginx автоматически пробегается по этой директории и включает нужные прокси сервера.

Таким образом, создадим конфигурационный файл:

    

Далее создадим ссылку через команду:

    

Nginx необходимо перезапускать после любых изменений, внесенных в конфигурационный файл, чтобы новые настройки начали действовать.

Сначала проверим корректность синтаксиса в файле:

    

И перезапустим:

    

Разверните свое Python-приложение в облаке Timeweb Cloud

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Надеемся, наш гайд по развертыванию приложений в Python оказался полезным для вас. Если остались какие-то вопросы, пишите в комментарии! Больше о Python читайте в наших инструкциях.

Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать. 

10909
7 минут чтения
Средний рейтинг статьи: 3.7

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server