Развёртывание приложений Falcon с помощью Gunicorn и Nginx в Ubuntu 16.04

Published by Leave your thoughts

Falcon – это микрофреймворк Python для создания веб-приложений. Он отлично подходит для сборки API согласно архитектуре REST. Это высокопроизводительный фреймворк, который позволяет создавать приложения с наименьшим ущербом для скорости разработки.

Данное руководство поможет собрать и развернуть веб-приложение Falcon. Falcon является фреймворком WSGI, потому для работы веб-приложения потребуется Gunicorn, сервер приложений WSGI. Веб-сервер Nginx можно использовать в качестве обратного прокси-сервера, который будет обрабатывать входящие запросы и передавать их серверу Gunicorn.

Требования

  • Сервер Ubuntu 16.04.
  • Пользователь с доступом к sudo (руководство выполняется в сессии этого пользователя).
  • Настроенный брандмауэр.

Все дополнительные инструкции можно найти здесь.

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

Приложение Falcon нужно изолировать от других файлов Python. Для этого используется виртуальная среда (virtual environment). Чтобы создать такую среду, нужно установить инструмент virtualenv.

Примечание: Falcon может работать в Python 2.х и в Python 3.х. В данном руководстве используется Python 3.5.

Читайте также: Общие инструменты Python

Установите virtualenv:

sudo apt-get install virtualenv

Теперь нужно создать и открыть родительский каталог проекта:

mkdir falcon_app
cd falcon_app

Создайте виртуальную среду для хранения файлов проекта:

virtualenv venv -p /usr/bin/python3

Это создаст локальную копию Python и pip в каталоге venv. Флаг –p позволяет указать версию Python, которую нужно использовать в среде.

Вы увидите такой результат:

Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/8host/falcon_app/venv/bin/python3
Also creating executable in /home/8host/falcon_app/venv/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

Теперь включите виртуальную среду:

. venv/bin/activate

Примечание: Чтобы отключить виртуальную среду и вернуться в стандартную оболочку, введите:

deactivate

2: Установка Falcon и Gunicorn

Теперь нужно установить пакеты falcon и Gunicorn. Все это можно установить с помощью пакетного менеджера pip.

Falcon можно установить двумя способами. Вы можете установить бинарный файл Falcon с помощью команды pip install falcon. Но в сочетании с Cython фреймворк Falcon может увеличить свою производительность. Чтобы установить Cython, сообщить об этом Falcon и собрать пакет с помощью компилятора С, введите:

sudo apt-get install build-essential python3-dev
pip install cython
pip install --no-binary :all: falcon

Установите Gunicorn:

pip install gunicorn

3: Создание простого приложения Falcon

Для работы вам понадобится приложение Falcon. Напишите простое веб-приложение. Создайте файл main.py в каталоге falcon_app.

nano main.py

Добавьте в файл следующий код, чтобы создать простое приложение Falcon, которое будет выводить на экран какое-нибудь текстовое сообщение:

import falcon
class TestResource(object):
def on_get(self, req, res):
"""Handles all GET requests."""
res.status = falcon.HTTP_200  # Статус по умолчанию
res.body = ('This is me, Falcon, serving a resource!')
# Создание объекта приложения Falcon
app = falcon.API()
# Добавление класса TestResource
test_resource = TestResource()
# Определение маршрута
app.add_route('/test', test_resource)

Этот файл объявляет класс TestResource. Этот класс содержит метод on_get, который определяет ответ, который будет отправлен. После этого создаются экземпляры Falcon API и TestResource. В завершение нужно указать маршрут /test к API и приложить объект test_resource.

При отправке GET-запроса на URL-адрес /test запускается метод on_get() класса TestResource. Состояние и тело ответа указываются в переменных res.status и res.body соответственно.

Сохраните файл.

4: Обслуживание приложения Falcon с помощью Gunicorn

Прежде чем приступить к настройке производства и Nginx, нужно убедиться, что сервер приложений Gunicorn может обслужить созданное только что приложение.

Откройте каталог falcon_app и запустите сервер Gunicorn:

gunicorn -b 0.0.0.0:5000 main:app --reload

Эта команда запустит Gunicorn и начнёт обслуживать веб-приложение на 0.0.0.0 и порте 5000, о чём вы можете узнать из вывода:

[2016-11-14 16:33:41 +0000] [9428] [INFO] Starting gunicorn 19.6.0
[2016-11-14 16:33:41 +0000] [9428] [INFO] Listening at: http://0.0.0.0:5000 (9428)
[2016-11-14 16:33:41 +0000] [9428] [INFO] Using worker: sync
[2016-11-14 16:33:41 +0000] [9431] [INFO] Booting worker with pid: 9431

Вы можете использовать любой свободный порт выше 1024.

Опция main:app вызывает объект приложения app из файла main.py.

С помощью опции –reload сервер Gunicorn может отслеживать изменения кода без перезагрузки.

Чтобы проверить работу приложения, откройте веб-браузер и посетите страницу:

http://your_server_ip:5000/test

На экране появится сообщение:

This is me, Falcon, serving a resource!

Остановите сервер Gunicorn с помощью CTRL+C.

5: Настройка обратного прокси-сервера Nginx

Теперь приложение готово. Настройте Nginx как обратный прокси-сервер, чтобы сервер Gunicorn не обслуживал все запросы напрямую.

При использовании обратного прокси все запросы сначала попадут на Nginx, откуда они будут переданы на Gunicorn.

Установите Nginx:

sudo apt-get install nginx

Создайте конфигурационный файл falcon_app.conf в каталоге /etc/nginx/sites-available, в котором будут храниться настройки обратного прокси-сервера Nginx.

sudo nano /etc/nginx/sites-available/falcon_app.conf

Добавьте в файл такие настройки:

server {
listen 80;
server_name your_server_ip_or_domain;
location / {
include proxy_params;
proxy_pass http://localhost:5000;
}
}

Nginx будет прослушивать порт 80 и проксировать все запросы HTTP на http://localhost:5000, который будет прослушиваться сервером Gunicorn.

Включите этот файл с помощью символьной ссылки:

sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf

Отключите стандартные настройки Nginx, удалив символьную ссылку из каталога /etc/nginx/sites-enabled.

sudo rm /etc/nginx/sites-enabled/default

Проверьте ошибки в конфигурационных файлах Nginx:

sudo nginx -t

Если ошибок нет, вы увидите:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если команда обнаружила ошибки, исправьте их и повторите проверку.

Перезапустите Nginx, чтобы обновить настройки:

sudo systemctl restart nginx

Снова запустите сервер Gunicorn, но вместо 0.0.0.0 укажите localhost (чтобы заблокировать общий доступ к Gunicorn):

gunicorn -b localhost:5000 main:app --reload

Откройте порт 80 в брандмауэре:

sudo ufw allow 80

Примечание: Если вы используете https, разблокируйте в ufw порт 443.

Читайте также: Создание сертификата Let’s Encrypt для Nginx в Ubuntu 16.04

Откройте страницу:

http://your_server_ip/test

Вы должны увидеть то же сообщение, что и в предыдущий раз:

This is me, Falcon, serving a resource!

Обратите внимание: в этот раз не нужно указывать номер порта в ссылке, поскольку теперь все запросы обслуживает Nginx, который прослушивает стандартный HTTP-порт 80.

Чтобы остановить приложение, нажмите CTRL+C.

6: Управление Gunicorn с помощью Systemd

Теперь нужно настроить автозапуск приложения.

В случае перезагрузки сервера сервер Gunicorn должен запускаться самостоятельно.

Для этого создайте unit-файл для Gunicorn с расширением .service в каталоге /etc/systemd/system.

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

Для начала добавьте раздел [Unit], который определяет метаданные и зависимости приложения. Внесите в него описание сервиса.

[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target

Затем нужно добавить раздел [Service]. В нем нужно указать пользователя и группу, с помощью которых будет запущен сервис. Передайте текущему пользователю права на процесс и соответствующие файлы. Также права должна иметь группа www-data, тогда веб-сервер Nginx сможет взаимодействовать с процессом Gunicorn.

[Service]
User=8host
Group=www-data
PIDFile=/tmp/gunicorn.pid
Environment="PATH=/home/8host/falcon_app/venv/bin"
WorkingDirectory=/home/8host/falcon_app
ExecStart=/home/8host/falcon_app/venv/bin/gunicorn --workers 3 -b localhost:5000 main:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

Также нужно указать виртуальную среду Python, рабочий каталог приложения и команду, с помощью которой будет запущено приложение.

Команду для запуска Gunicorn нужно присвоить переменной ExecStart. Флаг —workers определяет количество рабочих процессов Gunicorn. Согласно документации Gunicorn, рабочих процессов должно быть 2n+1, где n – количество ядер CPU. То есть, если сервер имеет одно ядро CPU, нужно настроить 3 рабочих процесса.

Переменные ExecReload и ExecStop отвечают за запуск и остановку сервиса.

В завершение нужно добавить раздел [Install], который определяет, к чему должен подключиться сервис во время автозапуска.

[Install]
WantedBy=multi-user.target

Директива WantedBy создаёт каталог multi-user.target в /etc/systemd/system, а в нём создаёт символическую ссылку на этот файл. При отключении сервиса ссылка будет удалена.

Сохраните и закройте файл. Запустите сервис:

sudo systemctl start falcon_app

Включите сервис, чтобы настроить автозапуск Gunicorn.

sudo systemctl enable falcon_app

Снова направьте браузер на http://your_server_ip/test и просмотрите приложение. Серверы Nginx и Gunicorn работают в фоновом режиме. Чтобы обновить приложение Falcon, перезапустите сервис falcon_app:

sudo systemctl restart falcon_app

Читайте также: Основы Systemd: управление сервисами и журналирование

Заключение

Теперь вы умеете разворачивать веб-приложения Falcon и обслуживать их с помощью сервера приложений Gunicorn, создавать виртуальную среду Python, настраивать обратный прокси-сервер Nginx и писать Unit-файлы.

Tags: , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>