Spec-Zone.ru › Falcon 2.0

Развертывание Falcon на Linux с NGINX и uWSGI

NGINX — это мощный веб-сервер и обратный прокси, а uWSGI — быстрый и высоконастраиваемый сервер приложений WSGI. Вместе NGINX и uWSGI обеспечивают скорость и функциональность, достаточные для большинства приложений. Кроме того, этот стек предоставляет строительные блоки для масштабируемой и высокодоступной (HA) производственной среды, а приведенная ниже конфигурация — всего лишь отправная точка.

Это руководство содержит инструкции для развертывания в среде Linux. Однако приложить немного усилий, чтобы адаптировать эту конфигурацию к другим операционным системам, таким как OpenBSD.

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

Лучше всего запускать приложение от имени другого пользователя операционной системы, отличного от пользователя, который владеет исходным кодом вашего приложения. Пользователь приложения НЕ ДОЛЖЕН иметь права записи в ваш исходный код. Это снижает вероятность того, что кто-то сможет записать вредоносный Python-файл в вашу исходную директорию через конечную точку загрузки, которую вы можете определить; при перезапуске приложения вредоносный файл загружается и начинает вызывать любые неприятности (tm).

$ useradd myproject --create-home
$ useradd myproject-runner --no-create-home

Полезно переключиться на пользователя проекта (myproject) и использовать домашний каталог в качестве среды приложения.

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

$ git clone git@github.com/myorg/myproject.git /home/myproject/src

Примечание

Вы можете использовать tarball, zip-файл, scp или любой другой метод, чтобы получить исходный код на сервер.

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

# For Python 3
$ python3 -m venv /home/myproject/venv

# For Python 2
$ virtualenv /home/myproject/venv

Затем установите свои зависимости.

$ /home/myproject/venv/bin/pip install -r /home/myproject/src/requirements.txt
$ /home/myproject/venv/bin/pip install -e /home/myproject/src
$ /home/myproject/venv/bin/pip install uwsgi

Примечание

Точные команды для создания виртуальной среды могут отличаться в зависимости от используемой версии Python и вашей операционной системы. В конечном счете, приложению требуется виртуальная среда /home/myproject/venv с установленными зависимостями проекта. Используйте бинарник pip внутри виртуальной среды, используя source venv/bin/activate или полный путь.

Подготовка приложения к работе

Для целей этого руководства мы будем предполагать, что вы реализовали способ настройки приложения, например, с помощью функции create_api() или скрипта на уровне модуля. Эта функция или скрипт предназначены для предоставления экземпляра falcon.API, который реализует стандартный интерфейс WSGI callable.

Вам нужно будет каким-то образом экспонировать экземпляр falcon.API, чтобы uWSGI мог его найти. Для этого руководства рекомендуется создать файл wsgi.py. Измените логику следующего примера файла, чтобы правильно настроить ваше приложение. Убедитесь, что вы экспонируете переменную, названную application, присвоенную вашему экземпляру falcon.API.

/home/myproject/src/wsgi.py
import os
import myproject

# Replace with your app's method of configuration
config = myproject.get_config(os.environ['MYPROJECT_CONFIG'])

# uWSGI will look for this variable
application = myproject.create_api(config)

Обратите внимание, что в приведенном выше примере WSGI callable просто присваивается переменной application, а не передается в самохостинговый WSGI-сервер, такой как wsgiref.simple_server.make_server. Запуск независимого WSGI-сервера в вашем файле wsgi.py приведет к неожиданным результатам.

Развертывание Falcon с помощью uWSGI

После создания файла wsgi.py пришло время настроить uWSGI. Начните с создания простого файла uwsgi.ini. Как правило, этот файл не следует включать в систему контроля версий; он должен генерироваться из шаблона вашим инструментом развертывания в соответствии с целевой средой (количеством процессоров и т. д.).

При выполнении этой конфигурации будет создан новый сервер uWSGI, работающий с файлом wsgi.py и прослушивающий порт 12.0.0.1:8080.

/home/myproject/src/uwsgi.ini
[uwsgi]
master = 1
vacuum = true
socket = 127.0.0.1:8080
enable-threads = true
thunder-lock = true
threads = 2
processes = 2
virtualenv = /home/myproject/venv
wsgi-file = /home/myproject/src/wsgi.py
chdir = /home/myproject/src
uid = myproject-runner
gid = myproject-runner

Примечание

Потоки против процессов

При выборе способа управления процессами, которые фактически выполняют ваш Python-код, следует учитывать множество вопросов. Общепринято ли ограничение ЦП или вводом-выводом? Ваше приложение потокобезопасно? Сколько у вас процессоров? На какой системе вы работаете? Нужен ли вам кэш в процессе?

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

Примечание

TCP против сокетов UNIX

NGINX и uWSGI могут общаться через обычный TCP (используя IP-адрес) или сокеты UNIX (используя файл сокета). Сокеты TCP проще настроить и, как правило, подходят для простых развертываний. Если вы хотите иметь более точный контроль над тем, какие процессы, пользователи или группы могут получить доступ к приложению uWSGI, или вы ищете небольшое повышение скорости, рассмотрите использование сокетов UNIX. uWSGI может автоматически снизить привилегии с chmod-socket и переключиться на пользователя с помощью chown-socket.

Параметры uid и gid, как показано выше, имеют решающее значение для защиты вашего развертывания. Эти значения управляют пользователем и группой уровня операционной системы, которые будут использоваться сервером для выполнения приложения. Указанный пользователь и группа операционной системы не должны иметь прав записи в директорию исходного кода. В данном случае мы используем пользователя myproject-runner, созданного ранее для этой цели.

Теперь вы можете запустить uWSGI следующим образом:

$ /home/myproject/venv/bin/uwsgi -c uwsgi.ini

При успешном запуске вы должны увидеть что-то вроде этого:

*** Operational MODE: preforking+threaded ***
...
*** uWSGI is running in multiple interpreter mode ***
...
spawned uWSGI master process (pid: 91828)
spawned uWSGI worker 1 (pid: 91866, cores: 2)
spawned uWSGI worker 2 (pid: 91867, cores: 2)

Примечание

Всегда полезно следить за логами uWSGI, поскольку они содержат исключения и другую информацию из вашего приложения, которая может помочь прояснить неожиданное поведение.

Подключение NGINX и uWSGI

Хотя uWSGI может напрямую обслуживать HTTP-запросы, полезно использовать обратный прокси, такой как NGINX, для перегрузки TLS-переговоров, обслуживания статических файлов и т. д.

NGINX изначально поддерживает протокол uwsgi для эффективного проксирования запросов в uWSGI. В NGINX мы создадим «upstream» и направим этот upstream (через TCP-сокет) на наше запущенное приложение uWSGI.

Прежде чем продолжить, установите NGINX в соответствии с инструкциями для вашей платформы.

Затем создайте файл конфигурации NGINX, который выглядит примерно так:

/etc/nginx/sites-avaiable/myproject.conf
server {
  listen 80;
  server_name myproject.com;

  access_log /var/log/nginx/myproject-access.log;
  error_log  /var/log/nginx/myproject-error.log  warn;

  location / {
    uwsgi_pass 127.0.0.1:8080
    include uwsgi_params;
  }
}

Наконец, запустите (или перезапустите) NGINX:

$ sudo service start nginx

Теперь ваше приложение должно работать. Проверьте логи uWSGI и NGINX на наличие ошибок, если приложение не запускается.

Дополнительные соображения

Мы не объясняли, как настроить TLS (HTTPS) для NGINX, оставив это как упражнение для читателя. Однако мы рекомендуем использовать Let’s Encrypt, который предлагает бесплатные, краткосрочные сертификаты с автоматическим продлением. Посетите сайт Let’s Encrypt, чтобы узнать, как интегрировать их сервис непосредственно с NGINX.

В дополнение к настройке NGINX и uWSGI для запуска вашего приложения, вам, конечно, понадобится развернуть сервер базы данных или любые другие сервисы, необходимые вашему приложению. Из-за широкого разнообразия вариантов и соображений в этой области мы решили не включать вспомогательные службы в это руководство. Однако сообщество Falcon всегда готово помочь с вопросами развертывания, поэтому не стесняйтесь задавать вопросы.

© 2019 by Falcon contributors
Licensed under the Apache License, Version 2.0.
https://falcon.readthedocs.io/en/2.0.0/deploy/nginx-uwsgi.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API