- PVSM.RU - https://www.pvsm.ru -
Данная статья является переводом статьи Кевина Голдберга «An Introduction to Python WSGI Servers: Part 1» blog.appdynamics.com/engineering/an-introduction-to-python-wsgi-servers-part-1 [1] с небольшими дополнениями от переводчика

WSGI-серверы появились потому, что веб-серверы в то время не умели взаимодействовать с приложениями, написанными на языке Python. WSGI (произносится как «whiz-gee» с твердым «g») был разработан Филиппом Дж. Эби (вместе с Ян Бикинг и др.) В начале 2000-х годов. Модуль Apache, известный как mod_python [2], разработанный Григорием Трубецким в конце 90-х годов, на тот момент обрабатывал большую часть Python-приложений. Однако mod_python не был официальной спецификацией. Он был просто создан, чтобы разработчики могли запускать код Python на сервере. К сожалению, такой подход был небезопасным и разработчики начали искать новое решение.
WSGI [3](Web-Server Gateway Interface) является потомком CGI(Common Gateway Interface). Когда веб начал развиваться, CGI разрастался из-за поддержки огромного количества языков и из-за отсутствия других решений. Однако, такое решение было медленным и ограниченным. WSGI был разработан как интерфейс для маршрутизации запросов от веб-серверов(Apache, Nginx и т.д.) на веб-приложения.
В простейшем случае WSGI состоит из двух основных сущностей:
Веб-сервер исполняет код и отправляет связанную с http-запросом информацию и callback-функцию в веб-приложение. Затем запрос на стороне приложения обрабатывается и высылается ответ на веб-сервер.

Периодически между веб-сервером и веб-приложением существуют одна или несколько промежуточных прослоек. Такие прослойки позволяют осуществить, например, балансировку между несколькими веб-приложениеми или предпроцессинг(предобработку) отдаваемого контента.
Вот примеры фреймворков, поддерживающих WSGI:
Возможно Вы спросите «Хорошо, но почему именно WSGI?». На это есть несколько причин:
WSGI-серверы выпускаются в различных вариациях. Одни нацелены на fullstack-решение, в то время как другие хорошо подходят для конкретных фреймворков. Например, Gunicorn работает с Django прямо из коробки. Вот более пристальный взгляд на шесть WSGI-серверов на рынке сегодня: Bjoern, uWSGI, mod_wsgi, Meinheld, CherryPy и Gunicorn.
Bjoern [10] — это асинхронный WSGI-сервер, написанный на C. Написанный с нуля, чтобы быть небольшим и быстрым, он был разработан с использованием http_parser от Райана Даля (создателя Node.js) и цикла событий Libev от Марка Леманна.
С размером загрузки всего 18 КБ он состоит из менее 800 строк кода. Он занимает менее 1 МБ оперативной памяти и не использует корутины [11] или потоки. Bjoern полностью совместим с WSGI и считается одним из самых высокопроизводительных WSGI-серверов.
Bjoern поддерживает постоянные соединения и может привязываться к Unix-сокетам или TCP-адресам. Bjoern считается более быстрым, чем Gunicorn, и менее раздутым, чем uWSGI и Meinheld. Один из недостатков данного сервера — отсутствие нормальной документации с понятными примерами.

uWSGI [12] был разработан компанией Unbit [13](Италия) с целью стать fullstack-решением, способным создавать услуги . Он назван в честь стандарта WSGI и создавался как плагин для одного из проектов компании.
Широкий и постоянно развивающийся проект, uWSGI позволяет делать гораздо больше, чем веб-приложения для
mod_wsgi — модуль HTTP-сервера Apache, разработанный Грэмом Дамплтоном (ранее, один из разработчиков mod_python), предоставляет интерфейс WSGI для веб-приложений. Совместим с версиями языка Python2 и Python3. Создан в качестве альтернативы другим решениям для интеграции веб-приложений, таких как CGI, FastCGI и mod_python. Может быть установлен как модуль Apache или через mod_wsgi express. Второй способ упрощает установку для разработчиков Python, которые не так хорошо знакомы с Apache. Другие преимущества:
• Вы не нуждаетесь в root-правах при полной установке.
• Создается локальная среда, что снижает риск негативного воздействия на существующие настройки.
Развитие mod_wsgi как проекта может показаться медленным из-за того, что модуль разрабатывается одним разработчиком. Другим недостатком является то, что документация в настоящее время плохо организована и может быть устаревшей.
В настоящее время основное внимание уделяется упрощению реализации Apache с использованием mod_wsgi в средах с использованием Docker [15].
Созданный Ютака Мацубара, Meinheld является сервером, совместимым с WSGI, который использует мощь picoev [16] и greenlet [17] для выполнения асинхронных операций ввода-вывода. Он может использоваться с автономным HTTP-сервером или через Gunicorn.
Meinheld имеет зависимость от стороннего компонента, называемого greenlet.
Репозиторий с исходным кодом расположен на GitHub [18]. Meinheld поддерживает веб-сокеты и включает в себя несколько monkeypatches [19] над другими модулями для расширения функциональности.

CherryPy — более известен как минималистичный Python-фреймворк для написания веб-приложений, CherryPy также поставляется с WSGI thread-pooled веб-сервером и поддержкой протокола HTTP / 1.1. Команда разработчиков CherryPy описывает свой веб-сервер как production-ready, высокоскоростной, thread-pooled HTTP-сервер. Он имеет:
• Быструю, простую настройку;
• Возможность масштабирования;
• Небольшое и простое в использовании решение для ваших приложений Python;
• Поддержка SSL.
CherryPy отличает себя от более известных WSGI-серверов из-за простоты использования и удобства для разработчиков. Вы можете написать небольшое веб-приложение в течении нескольких минут, запустив его в несколько процессов и создав только один файл с именем server.py. Объединив CherryPy с Nginx в качестве прокси-сервера, Вы получите надежный способ обслуживания своих веб-приложений. CherryPy был создан Реми Делоном. Он хотел создать структуру, которая была бы максимально близка к главным принципам разработки на языке Python [20].

Gunicorn [21] — это WSGI-сервер, созданный для использования в UNIX-системах. Название — сокращенная и комбинированная версия слов «Green Unicorn». На самом сайте проекта есть зеленый единорог. Gunicorn был перенесен из проекта «Unicorn» из языка Ruby. Он относительно быстрый, ресурсоёмкий, легко запускается и работает с широким спектром веб-фреймворков.
Команда разработчиков рекомендует использовать Gunicorn в связке с Nginx, где Nginx используется в качестве прокси-сервера.
В данной статье были разобраны шесть наиболее популярных WSGI-серверов на данный момент: Bjoern, uWSGI, mod_wsgi, Meinheld, CherryPy и Gunicorn. Какой сервер использовать Вам, зависит от условий и требований к Вашему приложению. В следующей части будет проведён анализ производительности этих шести WSGI-серверов.
Автор: Степан Филатов
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/296307
Ссылки в тексте:
[1] blog.appdynamics.com/engineering/an-introduction-to-python-wsgi-servers-part-1: https://blog.appdynamics.com/engineering/an-introduction-to-python-wsgi-servers-part-1/
[2] mod_python: https://ru.wikipedia.org/wiki/Mod_python
[3] WSGI: http://citforum.ru/programming/python/wsgi/
[4] Nginx, Apache: https://habr.com/post/267721/
[5] Django: https://www.djangoproject.com/
[6] CherryPy: https://cherrypy.org/
[7] Flask: http://flask.pocoo.org/
[8] TurboGears: http://www.turbogears.org/
[9] web2py: http://www.web2py.com/
[10] Bjoern: https://github.com/jonashaag/bjoern
[11] корутины: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0
[12] uWSGI: https://uwsgi.readthedocs.io/en/latest/
[13] Unbit: http://unbit.com/
[14] хостинга: https://www.reg.ru/?rlink=reflink-717
[15] Docker: https://habr.com/post/309556/
[16] picoev: http://developer.cybozu.co.jp/archives/kazuho/2009/08/picoev-a-tiny-e.html
[17] greenlet: https://pypi.org/project/greenlet/
[18] GitHub: https://github.com/mopemope/meinheld
[19] monkeypatches: https://ru.wikipedia.org/wiki/Monkey_patch
[20] главным принципам разработки на языке Python: https://tyapk.ru/blog/post/the-zen-of-python
[21] Gunicorn: https://gunicorn.org/
[22] Источник: https://habr.com/post/426957/?utm_source=habrahabr&utm_medium=rss&utm_campaign=426957
Нажмите здесь для печати.