Развертывание веб-приложений Python WSGI на основе Pyramid

Вступление

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

Данная статья описывает компоновку приложения Pyramid WSGI, создание списка его зависимостей, а также его развертывание (публикацию).

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

Вкратце о Pyramid

По сравнению со своими более тяжелыми аналогами, Pyramid – один из самых легких фреймворков для разработки приложений Python. Тем не менее, в отличие от Flask и других минималистских фреймворков, Pyramid поставляется со множеством функций и инструментов.

Этот хорошо продуманный и обслуживаемый проект достаточно популярен. В целом, Pyramid предоставляет несколько разных способов (веб-серверов и подходов) развертывания приложений.

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

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

WSGI

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

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

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

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

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

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

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

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

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

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

  • CherryPy
  • Gunicorn
  • uWSGI
  • waitress

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

Благодаря связующему программному обеспечению (или промежуточному, англ. middleware) для WSGI Python, существует множество вариантов серверов веб-приложений.

Модернизация системы

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

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

Для систем на основе Debian (т.е, Ubuntu, Debian) запустите:

aptitude    update
aptitude -y upgrade

Для систем на основе RHEL (т.е., CentOS), используйте:

yum -y update

Примечание: в CentOS команда upgrade означает “обновить операционную систему”, а команда update – “обновить приложения”. В Debian/Ubuntu команда update обновляет список исходных кодов приложений, а upgrade обновляет их до последней доступной версии.

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

Примечание для пользователей CentOS / RHEL:

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

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

Чтобы получить инструкции по установке Python 2.7.6 и 3.3.3 на CentOS 6.4 и 5.8 (а также pip и virtualenv), читайте статью “Установка Python 2.7.6 и 3.3.3 на CentOS 6.4“.

На Ubuntu и Debian последняя версия интерпретатора Python (которую можно использовать) поставляется по умолчанию. Все, что остается установить:

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

python-dev: это общесистемный пакет, содержащий расширенные средства разработки для построения модулей Python.

Для установки python-dev используйте следующую команду:

aptitude install python-dev

pip:  это менеджер пакетов, который помогает установить необходимые пакеты приложений.

Для установки pip запустите следующее:

curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python -
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python -
export PATH="/usr/local/bin:$PATH"

Для этого могут потребоваться привилегии sudo.

virtualenv: приложение Python вместе со всеми его зависимостями рекомендуется хранить в отдельной среде. Проще говоря, среда – это изолированное место (каталог) для размещения пакетов веб-приложения. Для этого используется инструмент под названием virtualenv.

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

sudo pip install virtualenv

Подготовка простого приложения с объектом “app”

Примечание: данный раздел сфокусирован на создании простого приложения, состоящего из одной страницы, онлайн.

На данный момент существует простое приложение (application.py), которое выводит “Hello world!” на порту 8080 сервера разработки Pyramid.

Текущий рабочий каталог находится в ~/pyramid_sites/hello_world.

Текущее приложение Pyramid (application.py) выглядит так:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('<h1>Hello world!</h1>')
if __name__ == '__main__':
config = Configurator()
config.add_view(hello_world)
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 8080, app)
server.serve_forever()

Чтобы превратить этот образец в модуль, содержащий WSGI, нужно выполнить следующие изменения:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('<h1>Hello world!</h1>')
# Поместите сюда объект приложения.
# Создайте конфигуратор
config = Configurator()
config.add_view(hello_world)
# Экспонируйте объект "app"
app = config.make_wsgi_app()
# При прямом запуске процесс сервера разработки
# будет создан и запущен на порту #8080.
if __name__ == '__main__':
server = make_server('0.0.0.0', 8080, app)
server.serve_forever()

Внеся все поправки, нажмите CTRL+X, чтобы сохранить и выйти, а затем Y для подтверждения.

Теперь данный файл можно использовать как модуль приложения с любым веб-сервером Python WSGI.

Многоуровневый объект приложения

С другой стороны, при создании более объемного приложения с помощью скаффолдинга (scaffolding) можно собрать wsgi.py, что будет содержать приложение, использующее файлы “.ini” для загрузки конфигураций развертывания (или разработки).

Примечание: данный файл должен находиться в root-папке приложения, вместе с файлами requirements.txt или .ini. Это работает путем добавления приложения как модуля.

Примечание: технически для этого файла можно выбрать любое имя. Тем не менее, имя “wsgi.py”, вероятно, подходит больше любого другого.

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

nano wsgi.py

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

from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.paster import get_app
def hello(request):
return Response('Hello!')
config = Configurator()
config.add_route('hello', '/')
config.add_view(home, route_name='hello')
app = config.make_wsgi_app()
# Or from an .ini file:
# app = get_app('config.ini', 'application_name')

Обработка зависимостей приложения с помощью PIP

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

Создание списка зависимостей приложения

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

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

Чтобы создать список установленных пакетов с помощью pip:

pip freeze > requirements.txt

Данная команда создаст файл по имени requirements.txt, содержащий список всех установленных ранее пакетов. Если запустить эту команду в virtualenv, то список будет содержать только пакеты, установленные внутри среды. В противном случае, будут перечислены все пакеты, установленные глобально.

Скачивание зависимостей по списку

Примечание: Этот раздел содержит команды, которые должны быть выполнены на машине/в среде разработки.

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

pip install -r requirements.txt

Данная команда скачает и установит все пакеты из списка. При работе с активированной средой файлы будут скачаны непосредственно в эту среду. В противном случае они будут установлены глобально (не рекомендуется).

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

Установив приложение Pyramid, можно перейти непосредственно к процессу развертывания и установки выбранного сервера веб-приложений.

Данная статья сфокусирована на использовании простого и в то же время мощного сервера CherryPy.

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

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

Веб-сервер CherryPy поставляется с одноименным фреймворком. Будучи «готовым к производству высокоскоростным общим HTTP-сервером», CherryPy является модульным компонентом, который может обслуживать любое приложение Python WSGI.

Поскольку проект имеет отдельную виртуальную среду (~/pyramid_sites/env), CherryPy можно установить внутри этой среды.

# Установите фреймворк CherryPy и HTTP веб-сервер:
pip install cherrypy

Чтобы обслуживать приложение Pyramid, при инсталляции пакета приложения нужно создать файл “server.py” для запуска интерпретатора Phython. Именно этот файл содержит пакет приложения и обслуживает его с помощью веб-сервера CherryPy.

Чтобы создать файл server.py, запустите:

nano server.py

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

# Import your application as:
# from wsgi import application
# Example:
# If you are using the wsgi.py (standard Pyramid)
# from wsgi import app
# If using application.py (single page example):
from application import app
# Import CherryPy
import cherrypy
if __name__ == '__main__':
# Mount the application (or *app*)
cherrypy.tree.graft(app, "/")
# Unsubscribe the default server
cherrypy.server.unsubscribe()
# Instantiate a new server object
server = cherrypy._cpserver.Server()
# Configure the server object
server.socket_host = "0.0.0.0"
server.socket_port = 8080
server.thread_pool = 30
# For SSL Support
# server.ssl_module            = 'pyopenssl'
# server.ssl_certificate       = 'ssl/certificate.crt'
# server.ssl_private_key       = 'ssl/private.key'
# server.ssl_certificate_chain = 'ssl/bundle.crt'
# Subscribe this server
server.subscribe()
# Example for a 2nd server (same steps as above):
# Remember to use a different port
# server2             = cherrypy._cpserver.Server()
# server2.socket_host = "0.0.0.0"
# server2.socket_port = 8080
# server2.thread_pool = 30
# server2.subscribe()
# Start the server engine (Option 1 *and* 2)
cherrypy.engine.start()
cherrypy.engine.block()

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

Запуск и обслуживание сервера приложений

Чтобы начать обслуживать приложение, запустите server.py с помощью Python.

Для этого используйте:

python server.py

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

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

python server.py &

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

Настройка Nginx

Установка Nginx

Примечание для пользователей CentOS / RHEL:

Приведенные ниже инструкции не сработают на системах CentOS. Пожалуйста, обратитесь к статье “Установка nginx на CentOS 6 с помощью yum” за необходимой информацией.

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

sudo aptitude install nginx

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

sudo service nginx start

Чтобы отключить Nginx:

sudo service nginx stop

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

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

Примечание: чтобы получить больше информации о Nginx на Ubuntu, читайте статью “Установка Nginx на Ubuntu 12.04“.

Настройка Nginx

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

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

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

sudo nano /etc/nginx/nginx.conf

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

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

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 app_servers {
server 127.0.0.1:8080;
# server 127.0.0.1:8081;
# ..
# .
}
# Configuration for Nginx
server {
# Running port
listen 80;
# Settings to serve static files
location ^~ /static/  {
# Example:
# root /full/path/to/application/static/file/dir;
root /app/static/;
}
# Serve a static file (ex. favico)
# outside /static directory
location = /favico.ico  {
root /app/favico.ico;
}
# Proxy connections to the application servers
# app_servers
location / {
proxy_pass         http://app_servers;
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

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

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

Готово!

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

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