Развёртывание приложений Falcon с помощью Gunicorn и Nginx в Ubuntu 16.04
Python | Комментировать запись
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: Falcon, Gunicorn, NGINX, Ubuntu 16.04