Развертывание веб-приложения Flask с помощью uWSGI и Nginx на CentOS 6.4

Вступление

Появление Flask – одно из величайших событий в области разработки веб-приложений и фреймворков для Python за последние пару лет.

Популярный фреймворк Flask минималистичен и в то же время чрезвычайно функционален, расширяем и предоставляет огромный выбор сторонних библиотек (например, Flask-WTF или Flask-SQLAlchemy). Этот дружественный фреймворк – отличный способ начать разработку веб-приложений с помощью Python (особенно при необходимости ознакомиться со способами решения некоторых технических задач, что можно легко сделать благодаря простой и удобочитаемой базе исходных текстов).

Данное руководство описывает простые действия для развертывания и запуска приложений. Для начала нужно будет подготовить сервер развертывания для Python на CentOS 6.4, а также ознакомиться с работой сервера приложений uWSGI на основе инвертированного прокси-сервера Nginx.

Кратко о Flask

Учитывая характер Flask, почти все об этом фреймворке уже было сказано выше. По сути, это отлично спрограммированая минималистская библиотека разработки веб-приложений, требующая установки всего двух зависимостей: механизма шаблонов Jinja2 и инструментария Werkzeug WSGI.

При помощи Flask можно без труда создать структурированный веб-сайт, который растягивается из одного файла в десятки многоразовых модулей (т.е. компонентов).

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

Развертывание веб-приложения

Что касается веб-приложений Python WSGI, их развертывание состоит из подготовки модуля WSGI, содержащего ссылку на объект приложения, что потом используется веб-сервером в качестве точки входа для передачи запросов, которые должны быть обработаны контроллерами  приложений (или просмотров).

Здесь uWSGI выступает в качестве сервера приложений WSGI, который будет содержать приложение Flask, обслуживаемое Nginx. Поскольку Nginx имеет встроенную поддержку предпочитаемого и (как известно) быстрого протокола uWSGI, его нужно просто активировать.

 Кратко о WSGI

Очень упрощенно говоря, WSGI представляет собой интерфейс между веб-сервером и самим приложением. Он устанавливает стандартное соединение между различными серверами и приложениями (фреймворками), что обеспечивает их взаимозаменяемость в случае необходимости (например, переход от среды разработки к производственной среде), что очень важно в настоящее время.

Примечание: для получения дополнительной информации о WSGI и веб-серверах Python читайте статью “Сравнение веб-серверов для приложений на основе Python“.

В случае Flask операции WSGI обрабатываются базовой промежуточной библиотекой Werkzeug.

Nginx как инвертированный прокси-сервер

Nginx – это веб-сервер/инвертированный прокси очень высокой производительности.

Он стал популярен потому, что он относительно легок в использовании, мало весит и легко расширяется (с помощью дополнений и плагинов). Благодаря своей архитектуре он способен обрабатывать множество запросов (практически без ограничений), с которыми более старые альтернативы справляются с трудом (в зависимости от загрузки приложения или веб-сайта).

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

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

Сервер веб-приложений Python WSGI

Серверы веб-приложений Python – это, как правило, либо написанные на языке C автономные серверы, либо полностью (или частично) основанные на Python серверы.

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

Хотя некоторые из них очень мощны, все же, Nginx рекомендуется использовать как основу по указанным выше причинам (например, из-за более высокой производительности). Аналогично, серверы разработки, которые, как правило, поставляются с фреймворками веб-приложений,использовать для разработки не рекомендуется в связи с их недостаточной функциональностью(конечно, есть исключения).

Популярные веб-серверы Python WSGI:

  • CherryPy
  • Gunicorn
  • uWSGI
  • waitress

 Кратко о uWSGI

Несмотря на очень запутанное соглашение об именах, сам uWSGI является обширным проектом, который состоит из большого количества компонентов и предоставляет полный набор программного обеспечения для построения хостинговых услуг. Один из этих компонентов, сервер uWSGI, запускает приложения Python WSGI.Он может использовать различные протоколы, в том числе свой ​​собственный идентичный SCGI протокол uwsgi. Поскольку HTTP-серверы по сравнению с серверами приложений более популярны, веб-серверы NGINX и Cherokee разработаны как модульные, что позволяет использовать собственный протокол uWSGI с высокой производительностью и обеспечивает прямой контроль над процессами.

Особенности uWSGI

  • Поставляется с адаптером WSGI и полностью поддерживает приложения Python на WSGI.
  • Связан с libpython. Он загружает код приложения при запуске и действует как интерпретатор Python, а также анализирует входящие запросы и вызывает Python.
  • Поставляется с прямой поддержкой популярного веб-сервера NGINX (а также Cherokee и Lighttpd).
  • Написан на языке C.
  • Различные компоненты могут сделать гораздо больше, чем просто запуск приложения, что может быть полезно для расширения функций.
  • В настоящее время (по состоянию на конец 2013 года), uWSGI активно развивается, регулярно появляются новые версии.
  • Имеет различные механизмы для запуска приложений (асинхронные и синхронные).
  • Невысокое потребление памяти при запуске.

 Подготовка системы к развертыванию

 Обновление системы

Чтобы  сервер развертывания работал стабильно, очень важно использовать последние версии программ.

Чтобы обеспечить использование последних доступных версий приложений по умолчанию, необходимо обновить систему.

Чтобы обновить CentOS, запустите команду:

yum -yupdate

Установка Python, pip и virtualenv

Примечание: данное руководство действительно для версий CentOS 6.5, а также для 5.8 и 6.4.

По умолчанию CentOS / RHEL поставляется с минимальным количеством ПО. Набор необходимых инструментов на данном сервере предоставляется не для запуска приложений, а для питания инструментов системы (например, yum).

Чтобы подготовить систему CentOS, нужно установить (то есть, скомпилировать из исходного кода) Python, а затем установить pip и virtualenv при помощи специального интерпретатора.

В целом, для работы понадобятся  следующие пакеты Python:

  • python-dev – средства разработки
  • pip– для управления пакетами
  • virtualenv– для создания изолированной виртуальной среды

Примечание: ниже приводится краткое (но весьма содержательное) изложение руководства “Установка Python 2.7.6 и 3.3.3 на CentOs 6.4“. Для получения более подробной информации о работе pip и virtualenv рекомендуется прочесть “Общие инструменты Python: использование virtualenv, установка пакетов с помощью pip и управление пакетами“.

Подготовка системы к разработке

Дистрибутивы CentOS намеренно  поставляются без большинства необходимых приложений и инструментов.

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

Поэтому для начала нужно скачать и установить их.

Группы программного обеспечения YUM – это комплексы часто используемых вместе инструментов (приложений), которые можно одновременно загрузить с помощью одной команды, указав также имя группы.

Примечание: можно скачать несколько групп YUM одновременно.

Чтобы получить необходимые инструменты разработки, запустите:

yum groupinstall -y development

или:

yum groupinstall -y 'developmenttools'

Примечание: первая (более короткая) версия команды может не сработать на более старых дистрибутивах CentOS.

Чтобы загрузить некоторые нужные дополнительные пакеты:

yum install -y zlib-developenssl-develsqlite-devel bzip2-devel

Загрузка, компилирование и установка Python на CentOS

Примечание: данные инструкции можно использовать для загрузки любой версии Python. Все, что нужно сделать – это указать нужную версию (в примере ниже – версия 2.7.6) . Можно установить и использовать несколько версий одновременно. В таком случае при запуске нужно будет указать версию (т.е. вместо python нужно использовать python2.7, python3.3, и т.д.).

Для начала нужно распаковать сжатый архив, содержащий исходный код Python. Данное руководство использует версию 2.7.6.

wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz

Этот файл сжимается с помощью библиотеки XZ. В зависимости от версии система может не иметь таковой. Если это так, выполните следующую команду, которая установит библиотеку XZ:

yum install xz-libs

Расшифруйте архив XZ, а затем извлеките содержимое tar-архива:

# Чтобы расшифровать (decode (-d)) архив tar:
xz -dPython-2.7.6.tar.xz
# Извлечь файлы:
tar -xvfPython-2.7.6.tar

Проверьте базу кода, используя ./configure:

# Откройте каталог с данным файлом:
cdPython-2.7.6
# Начните конфигурирование(задайте каталог установки)
# По умолчанию файлы устанавливаются в /usr/local.
# Отредактируйте --prefix,чтобы изменить это (например, на $HOME).
./configure --prefix=/usr/local

Соберите и установите Python 2.7.6:

# Скомпилируйте исходный код;
# Данная процедура может занять некоторое время (примерно несколько минут)
make && make altinstall

Дополнительно: добавление расположения новой установки Python в PATH:

Примечание: при использовании настроек по умолчанию выполнять это дополнительное действие нет необходимости.  Однако, если при установке Python путь /usr/local был изменен, нужно будет выполнить следующие действия, чтобы иметь возможность запускать Python без указания полного пути.

# Синтаксис: export PATH="[/путь/к/инсталляции]:$PATH"
export PATH="/usr/local/bin:$PATH"

Чтобы узнать о PATH больше, обратитесь к информационному проекту Linux (Linux Information Project).

Установка общих инструментов Python: pip и virtualenv

Установив Python, нужно завершить формирование основы для производства и развертывания приложений. Для этого нужно установить наиболее часто используемые инструменты: менеджер пакетов pip и менеджер среды virtualenv.

Чтобы узнать об этих инструментах больше, прочтите статью «Общие инструменты Python: использование virtualenv, установка пакетов с помощью pip и управление пакетами».

Установка pip на CentOS при помощи новой инсталляции Python

Прежде чем устанавливать pip, нужно получить его единственную зависимость – setuptools.

Выполните следующие команды (для версии Python 2.7.6):

# Загрузите установочный файл с помощью wget:
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz
# Извлеките файлы из архива:
tar -xvf setuptools-1.4.2.tar.gz
# Перейдите в извлеченный каталог:
cd setuptools-1.4.2
# Установите setuptools при помощи Python (2.7.6)
python2.7 setup.py install

Сама по себе установка pip – очень простой процесс. Чтобы этот инструмент был автоматически загружен и установлен с помощью cUR Llibrary, используйте инструкции упомянутой выше стати.

Загрузите установочные файлы для pip и затем установите его с помощью Python (2.7):

curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7 -

Установка virtualenv на CentOS с помощью Python

Чтобы загрузить и установить virtualenv с помощью pip, запустите команду:

pip install virtualenv

Развертывание приложения

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

Создание каталога приложения для развертывания

Для начала соберите каталог приложения , содержащий:

  • модуль приложения;
  • каталог виртуальной среды;
  • необходимый серверу WSGI-файл.

# Folders / Directories
mkdir ~/MyApplication # Replace the name to suit your needs
mkdir ~/MyApplication/app # Application (module) directory
# Application Files
touch ~/MyApplication/WSGI.py # Server entry-point
touch ~/MyApplication/app/__init__.py # Application file

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

Развернуть виртуальную среду очень просто.

Выполните следующее, чтобы  инициировать новую среду внутри директории MyApplication:

cd ~/MyApplication
virtualenvenv

Данная команда создаст новый каталог по имени env рядом с модулем приложения app.

Работа с виртуальной средой

Существует два способа использования виртуальной среды:

  • Активация среды
  • Установка местоположения интерпретатора Python внутри среды

Поскольку второй способ является более простым, явно укажите местоположения интерпретатора Python и pip.

Загрузка и установка uWSGI внутри виртуальной среды

Чтобы установить uWSGI с помощью pip, запустите:

~/MyApplication/env/bin/pip install uwsgi

Это установит uWSGI внутри виртуальной среды.

Загрузка и установка библиотеки Flask

Чтобы установить Flask с помощью pip, запустите:

~/MyApplication/env/bin/pip install flask

Создание примера приложения Flask

Для продолжения развертывания понадобится готовое к запуску приложение.

Создайте приложение Flask, состоящее из одной страницы.

nano ~/MyApplication/app/__init__.py

Разместите ниже следующий контент, чтобы определить простое приложение:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello!"
if __name__ == "__main__":
app.run()

Сохраните изменения и выйдите, нажав CTRL+X и Y для подтверждения.

Создание образца файла WSGI, импортирующего приложение

Обычно папка созданного приложения содержит основной модуль приложения (сведенный в один файл). Этот модуль приложения вместе с объектом приложения будут импортированы файлом WSGI для дальнейшей обработки. На данном этапе нужно создать файл WSGI, который будет импортировать приложение, и затем передать его на сервер приложений uWSGI.

Создайте (отредактируйте) файл WSGI.py:

nano ~/MyApplication/WSGI.py

Разместите в нем следующее:

from app import app
if __name__ == "__main__":
app.run()

Стадия развертывания: установка и настройка Nginx

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

Пример базовой архитектуры сервера:

Client Request ----> Nginx (Reverse-Proxy)
|
/|\
| | `-> App. Server I. 127.0.0.1:8080 # Our example
| `--> App. Server II. 127.0.0.1:8082
`----> App. Server III. 127.0.0.1:8083

Приведенные ниже инструкции недействительны для системы CentOS. При необходимости, пожалуйста, обратитесь к руководству «Как установить nginx на CentOS 6 с помощью yum».

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

# Активируйте репозиторий EPEL
sudosu -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
# Загрузите и установите Nginx
sudo yum install -y nginx

Для запуска Nginx используйте:

sudo service nginx start

Чтобы выключить Nginx, используйте:

sudo service nginx stop

Чтобы перезапустить Nginx:

# Nginx нужно перезапускать после внесения любых изменений в настройки,
# чтобы новые настройки вступили в силу.
sudo service nginx restart

Настройка Nginx

Выбрав и установив веб-сервер для запуска приложения, нужно подготовить Nginx к работе с внутренним сервером (запускающим приложение WSGI).

Для этого нужно отредактировать конфигурационный файл nginx.conf.

Чтобы открыть и отредактировать данный файл с помощью текстового редактора nano, запустите:

sudo nano /etc/nginx/nginx.conf

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

Скоприуйте и вставьте приведенный ниже пример конфигураций.

Примечание: чтобы активировать поддрежку SSL, пожалуйста, прочтите статью «Создание SSL-сертификата на Nginx».

В приведенном ниже примере используется встроенная интеграцияNginx с сервером приложений uWSGI по протоколу uwsgi.

Пример конфигураций для веб-приложения:

worker_processes 1;
events {
worker_connections 1024;
}
http {
sendfile on;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript
application/x-javascript
application/atom+xml;
# Configuration containing list of application servers
upstream uwsgicluster {
server 127.0.0.1:8080;
# server 127.0.0.1:8081;
# ..
# .
}
# Configuration for Nginx
server {
# Running port
listen 80;
# Settings to by-pass for static files
location ^~ /static/ {
# Example:
# root /full/path/to/application/static/file/dir;
root /app/static/;
}
# Serve a static file (ex. favico) outside static dir.
location = /favico.ico {
root /app/favico.ico;
}
# Proxying connections to application servers
location / {
include uwsgi_params;
uwsgi_passuwsgicluster;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
}

Отредактировав конфигурации, нажмите CTRL+X, чтобы выйти и сохранить изменения, и Y для подтверждения. Чтобы активировать внесенные изменения, нужно перезапустить Nginx.

Для этого введите:

sudo service nginx stop
sudo service nginx start

Установка сервера веб-приложения Python WSGI

Примечание: чтобы узнать о развертывании веб-приложений Python с помощью uWSGI больше, прочтите статью

Обслуживание приложений с помощью uWSGI

Данный раздел описывает работу веб-приложения PythonWSGIна сервере uWSGI. Как и другим серверам, серверу uWSGI нужно, чтобы приложение предоставило ему точки входа (т.е. объекты приложения). Во время запуска эти переменные конфигураций передаются серверу uWSGI и он начинает выполнять свою работу. При поступлении запроса uWSGI обрабатывает его, а затем передает его в контроллер приложения для обработки.

Запуск сервера

uWSGI имеет множество гибких опций и конфигураций. Чтобы не усложнять разработку с самого ее начала, рекомендуется установить простые конфигурации и усложнять их в ходе работы над приложением.

Примечание: прежде чем выполнить приведенные ниже команды, убедитесь, что каталог “my_app” является текущим, иначе uwsgi не сможет найти wsgi.py и не менее важный объект приложения.

Простой пример использования:

# Войдите в каталог приложения
cd ~/MyApplication
# Запустите uWSGI, установленный внутри виртуальной среды
env/bin/uwsgi [option] [option 2] .. -w [wsgi file with app. callable]

Чтобы uWSGI начал обслуживать приложение из wsgi.py, запустите:

cd ~/MyApplication
env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app
# Чтобы uWSGI взаимодействовал с Nginx с помощью HTTP:
# env/bin/uwsgi --socket 127.0.0.1:8080 --protocol=http -w WSGI:app

Это запустит сервер в приоритетном режиме. Чтобы отключить его, нажмите клавиши CTRL + C.

Чтобы запустить сервер в фоновом режиме, выполните следующую команду:

env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app&

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

Готово! Подключив сервер приложения к Nginx, можете просмотреть его; для этого введите IP-адрес сервера в браузер.

http://[IP адрес сервера]/
# Hello, world!

Читайте также

Чтобы получить более подробную информацию о развертывании веб-приложений Python, читайте следующие статьи:

Tags: , , , , , , , , , , , , , ,

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