Как развертывать веб-приложения Falcon с помощью Gunicorn и Nginx в Ubuntu 16.04

Вступление

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

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

Предпосылки

Для завершения этого урока вам понадобится:

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

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

Подключитесь к вашему серверу как пользователь без полномочий root:

ssh @

Falcon работает с Python 2.x и Python 3.x, но мы собираемся использовать последнюю версию Python, доступную в Ubuntu 16.04, а именно Python 3.5.

Мы будем использовать pip и virtualenv для настройки нашего приложения Falcon. Чтобы узнать больше об этих инструментах, прочитайте наш учебник на common инструменты Python .

Во-первых, установите virtualenv:

sudo apt-get install virtualenv

Затем создайте каталог, который будет содержать исходный код вашего приложения и виртуальную среду, а затем перейдите в этот каталог:

mkdir
cd

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

virtualenv venv -p /usr/bin/python3

Эта команда создает виртуальную среду внутри каталога + venv +. Флаг + -p + указывает, какая версия Python используется в виртуальной среде.

Вы увидите этот вывод:

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

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

. venv/bin/activate

Теперь, когда вы настроили виртуальную среду Python, давайте установим необходимые пакеты Python.

Шаг 2 - Установка Falcon и Gunicorn с помощью пипса

Нам нужно установить пакет + falcon +, и поскольку мы используем Gunicorn для обслуживания нашего приложения, мы должны установить и его. Оба они доступны через + pip +,

Вы можете установить Falcon одним из двух способов. В Falcon есть бинарный файл, который вы можете установить с помощью + pip install falcon +, но Falcon может получить дополнительное ускорение при компиляции с Cython. Выполните следующие команды для установки Cython, а затем сообщите Falcon, чтобы обнаружить его и скомпилировать себя с помощью системного компилятора C:

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

Далее установите Gunicorn:

pip install gunicorn

Давайте перейдем к написанию нашего простого приложения Falcon.

Шаг 3 - Написание простого веб-приложения с использованием Falcon

Давайте создадим простое однофайловое приложение Falcon. Создайте файл + main.py + в каталоге + falcon_app +:

nano main.py

Заполните файл следующим содержимым, которое создает приложение Falcon, которое отображает простое тестовое сообщение, когда люди посещают маршрут + / test +:

main.py

import falcon

class TestResource(object):
   def on_get(self, req, res):
       """Handles all GET requests."""
       res.status = falcon.HTTP_200  # This is the default status
       res.body = ('This is me, Falcon, serving a resource!')

# Create the Falcon application object
app = falcon.API()

# Instantiate the TestResource class
test_resource = TestResource()

# Add a route to serve the resource
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 - подача заявки на сокол с помощью Gunicorn

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

Убедитесь, что вы находитесь в каталоге + falcon_app +. Запустите Gunicorn с помощью следующей команды:

gunicorn -b :5000 main:app --reload

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

Output[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:  (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 + указывает Gunicorn вызвать объект приложения + app +, доступный в файле + main.py +.

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

Протестируйте свое приложение, открыв веб-браузер на локальном компьютере и зайдя в браузер + http: //: 5000 / test +. Вы увидите следующий вывод из вашего веб-приложения:

изображение: https: //assets.digitalocean.com/articles/falcon_gunicorn_nginx_1604/drw9BfS.png [ответ Сокола]

Остановите Gunicorn, нажав + CTRL + C +. Давайте настроим это более готовым способом производства.

Шаг 5 - Использование Nginx для запросов прокси к Gunicorn

Мы настроим и настроим Nginx для передачи всех веб-запросов в Gunicorn, а не для того, чтобы Gunicorn обслуживал запросы из внешнего мира напрямую. При этом все запросы вашего веб-приложения сначала обрабатываются Nginx, а затем направляются на сервер приложений.

Сначала установите Nginx, выполнив следующую команду:

sudo apt-get install nginx

Затем создайте новый файл конфигурации с именем + falcon_app.conf + в каталоге + / etc / nginx / sites-available +. Этот файл настроит Nginx для прокси-сервера всех запросов, поступающих на IP-адрес вашего сервера, на сервер Gunicorn нашего приложения Falcon.

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

Добавьте следующее содержимое в файл:

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

server {
   listen 80;
   server_name ;

   location / {
       include proxy_params;
       proxy_pass http://localhost:5000;
   }
}

Эта конфигурация говорит Nginx прослушивать порт + 80 + и перенаправлять все HTTP-запросы на + http: // localhost: 5000 +, где Gunicorn будет прослушивать.

Активируйте эту конфигурацию, создав символическую ссылку на этот файл в каталоге + / etc / nginx / sites-enabled +:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Затем отключите файл конфигурации Nginx по умолчанию, удалив его символическую ссылку из каталога + / etc / nginx / sites-enabled +:

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

Убедитесь, что в ваших файлах Nginx нет синтаксических ошибок:

sudo nginx -t

Вы увидите это сообщение, если у вас есть рабочая конфигурация:

Outputnginx: 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  main:app --reload

Разрешите доступ к порту + 80 + через брандмауэр сервера, если вы его включили:

sudo ufw allow 80

Наконец, протестируйте приложение, посетив + http: /// test +, и вы увидите тот же результат, который вы видели раньше.

Обратите внимание, что вам больше не нужен номер порта в URL, потому что ваши запросы теперь проходят через Nginx, который работает на порту + 80 +, HTTP-порт по умолчанию. Вы увидите следующий вывод в вашем браузере:

image: https: //assets.digitalocean.com/articles/falcon_gunicorn_nginx_1604/6pKlicT.png [Сокол теперь проксируется через Nginx]

Остановите сервер приложений, нажав + CTRL + C +. Давайте настроим наше приложение Falcon для автоматического запуска в фоновом режиме, как и другие наши сервисы.

Шаг 7 - Управление Gunicorn с помощью Systemd

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

Чтобы настроить это, мы создадим файл Systemd unit для нашего приложения Gunicorn, чтобы мы могли им управлять.

Для начала мы создадим файл для нашего приложения в каталоге + / etc / systemd / system с расширением` + .service ie`:

sudo nano /etc/systemd/system/

Файл блока состоит из разделов. Раздел + [Unit] + используется для указания метаданных и зависимостей нашего сервиса, включая описание нашего сервиса и когда запускать наш сервис.

Добавьте эту конфигурацию в файл:

/etc/systemd/system/falcon_app.service

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

Мы указываем, что служба должна запускаться after цель сети была достигнута. Другими словами, мы запускаем этот сервис только после того, как сетевые сервисы готовы.

После раздела + [Unit] + мы определяем раздел + [Service] +, в котором мы указываем, как запустить службу. Добавьте это в файл конфигурации:

/etc/systemd/system/falcon_app.service

[Service]
User=
Group=
PIDFile=
Environment="PATH=/home/sammy//venv/bin"
WorkingDirectory=/home/sammy/
ExecStart=/home///venv/bin/gunicorn --workers 3 -b
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

Сначала мы определяем пользователя и группу, под которой работает служба. Затем мы определяем файл для хранения PID (ID процесса) службы; этот PID используется для остановки или перезагрузки службы.

Также мы указываем виртуальную среду Python, рабочий каталог приложения. и команда, чтобы выполнить, чтобы запустить приложение. Мы назначаем команду для запуска Gunicorn переменной + ExecStart +. Флаг + - worker + используется для определения количества рабочих, с которых Gunicorn должен начинать. Документы Gunicorn предлагают установить количество рабочих в + 2n + 1 +, где + n + - количество ядер ЦП. Предполагая, что ваш сервер имеет одно ядро ​​ЦП, мы получаем число «+ 3 +».

Переменные + ExecReload + и + ExecStop + определяют, как служба должна запускаться и останавливаться.

Наконец, мы добавляем раздел + [Install] +, который выглядит следующим образом:

/etc/systemd/system/falcon_app.service

[Install]
WantedBy=multi-user.target

Раздел + Install + позволяет вам включать и отключать сервис. Директива + WantedBy + создает каталог с именем + multi-user.target + внутри + / etc / systemd / system +, и там будет создана символическая ссылка этого файла. Отключение этой службы приведет к удалению этого файла из каталога.

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

sudo systemctl start

Затем включите эту службу, чтобы при каждом запуске сервера Gunicorn начинал обслуживать веб-приложение:

sudo systemctl enable

Еще раз, наведите ваш браузер на + http: /// test +, чтобы увидеть ваше приложение. И Nginx, и Gunicorn работают в фоновом режиме. Если вам нужно обновить приложение Falcon, перезапустите сервис + falcon_app +:

sudo systemctl restart

Чтобы узнать больше о файлах модулей, прочитайте учебное руководство Understanding Systemd Units и файлы модулей.

Заключение

В этом руководстве вы настроили и развернули свое первое веб-приложение Falcon. Вы настроили среду Python и написали код своего приложения на сервере, а затем обслужили веб-приложение с Gunicorn. Затем вы настроили Nginx так, чтобы он передавал веб-запросы нашему приложению Gunicorn. Наконец, вы написали файл Systemd Unit и включили службу, чтобы ваше веб-приложение запускалось при запуске сервера.

Когда вы запускаете свои собственные приложения в производство, вы хотите получить к ним доступ с помощью имени хоста вместо IP-адреса. Посмотрите How для установки имени хоста с DigitalOcean, чтобы указать свой домен имя на вашем сервере.

Related