Запуск aiohttp с помощью gunicorn и nginx

Инструкция с примерами и комментариями по запуску асинхронного веб-сервера aiohttp с помощью gunicorn за nginx.

💾Установка программ

Начать необходимо с установки необходимых программ. Примеры основаны на Ubuntu.

Установка актуальной версии nginx описана здесь.

Установка других пакетов:

[code commandline]

[/code]

📦Разворачивание проекта

Предположим, что проект уже готов и размещен в директории [code]/home/user/aiohttp[/code].

Код, на котором можно протестировать работу представлен ниже. Разместим его в файл [code]app_test.py[/code]:

[code python]

[/code]

🐍Настроим Python

Работать будем через виртуальное окружение. Переходим в директорию проекта[code]/home/user/aiohttp[/code] и создаем окружение командой:

[code commandline]

[/code]

Активируем окружение и дальше работаем под ним:

[code commandline]

[/code]

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

[code commandline]

[/code]

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

Устанавливаем командой:

[code commandline]

[/code]

Запускаем:

[code commandline]

[/code]

Если ошибок нет, тогда можно проверить работу по адресу: http://localhost:8081

Теперь создадим файл конфигурации [code]gunicorn.conf.py[/code], разместим в нем необходимые настройки и поменяем строку запуска для его использования.

[code python]

[/code]

Здесь уже указано, что запросы будут обрабатываться двумя рабочими потоками. Если есть желание направить все через сокеты, тогда заменим bind на [code python]bind=»unix:/tmp/apptest.sock»[/code].

Для отладки, в конфиг можно добавить [code]reload=True[/code], после чего gunicorn будет автоматически перезапускаться по факту изменения любого файла проекта.

Строка запуска примет вид:

[code commandline]

[/code]

Настройка supervisor

Для работы gunicorn в режиме демона, атоматического запуска и перезапуска сервиса необходимо настроить supervisor. Программа написана на Python 2+ и поддерживает только 2 версию.

Есть другие альтернативы, такие как systemd, upstart, runit, но все они требуют более сложной настройки или наличия программ-зависимостей в системе.

Для проверки наличия установленного сервиса, запустим его командой (если ошибок нет, значит все в порядке):

[code commandline]

[/code]

Файлы конфигурации лежат в директории [code]/etc/supervisor/conf.d/[/code], где создадим свой файл [code]apptest.conf[/code] и добавим в него:

[code ini]

[/code]

Если хотите все сообщения лить в лог ошибок, тогда включите [code]redirect_stderr=true[/code]

Теперь прочитаем новый конфиг командой:

[code commandline]

[/code]

Если мы видим наше приложение, тогда применим новую конфигурацию командой:

[code commandline]

[/code]

Посмотреть статус программ можно командой:

[code batch]

[/code]

Помощь по командам внутри supervisorctl доступна по команде help.

Если все сделано верно, тогда можно проверить работу по адресу: http://localhost:8081

Для настройки ведения логов необходимо добавить в конфиг supervisor следующие строки (затем перечитать конфиги, обновить и перезапустить приложение):

[code ini]

[/code]

Перезапуск приложения из командной строки:

[code commandline]

[/code]

В Ubuntu 16+ есть проблема, из-за которой supervisor не запускается автоматически после перезагрузки. Для решения этой проблемы необходимо выполнить следующие команды:

[code commandline]

[/code]

Настройка Nginx

Добавим конфиг сайта [code]/etc/nginx/conf.d/apptest.conf[/code] с содержимым:

[code apacheconf]

[/code]

upstream apptest_server показан для примера, при желании завернуть все через сокеты, чтобы gunicorn не занимал портов.

Данные примеры будут работать только на Linux и Unix-подобных системах. На Windows это не повторить.

💬В комментариях напишите, нужен ли вообще этот асинхронный сервер?