Как вы развертываете свое приложение WSGI?(и почему это лучший способ)
-
05-09-2019 - |
Вопрос
Развертывание приложения WSGI.Есть много способов освежевать эту кошку.В настоящее время я использую apache2 с mod-wsgi, но я вижу некоторые потенциальные проблемы с этим.
Так как же это можно сделать?
- Apache Mod-wsgi (другой мод-wsgi, похоже, того не стоит)
- Чистый веб-сервер Python, например, paste, cherrypy, Spawning, Twisted.web
- как 2, но с обратным прокси от nginx, apache2 и т.д., С хорошей статической обработкой файлов
- Преобразование в другой протокол, такой как FCGI, с мостом (например, Flup) и запуск на обычном веб-сервере.
Еще?
Я хочу знать, как вы это делаете и почему это лучший способ сделать это.Я бы абсолютно Любовь вы должны утомлять меня подробностями о том, что и почему, о конкретных приложениях и т.д.Я поддержу любой не безумный ответ.
Решение
Как всегда:Это зависит ;-)
Когда мне не нужны какие-либо функции apache, я использую чистый веб-сервер python, такой как paste и т.д.Какой именно, я думаю, зависит от вашего приложения и может быть определено путем выполнения некоторых тестов.Я всегда хотел что-нибудь сделать, но так и не дошел до этого.Я предполагаю, что нерест может иметь некоторые преимущества при использовании неблокирующего ввода-вывода "из коробки", но иногда у меня возникали проблемы с ним из-за выполняемых им исправлений.
Конечно, вы всегда можете нанести лак и спереди.
Если требуется Apache, я обычно использую решение 3, чтобы я мог разделять процессы.Вы также можете более легко перемещать процессы на другие серверы и т.д.Мне просто нравится разделять вещи.
Для статических файлов я сейчас использую отдельный сервер для проекта, который просто обслуживает статические изображения / css / js.Я использую lighttpd в качестве веб-сервера, который обладает отличной производительностью (в этом случае у меня больше нет лака спереди).
Еще одним полезным инструментом является супервайзер для контроля и мониторинга этих служб.
Я дополнительно использую наращивание для управления моими развертываниями и изолированными блоками разработки (вместе с virtualenv ( виртуальная среда )).
Другие советы
Мне бы очень хотелось, чтобы вы утомили меня подробностями о том, что и почему, о конкретных приложениях и т. Д
Хо.Ну, ты сам напросился на это!
Как и Дэниел, я лично использую Apache с mod_wsgi.Он все еще достаточно новый, и его развертывание в некоторых средах может быть затруднено, но если вы все равно компилируете все самостоятельно, это довольно просто.Я нахожу это очень надежным, даже ранние версии.Спасибо Грэму Дамплтону за то, что он в значительной степени контролировал ситуацию в одиночку.
Однако для меня важно, чтобы приложения WSGI работали на всех возможных серверах.На данный момент в этой области есть небольшая дыра:у вас есть стандарт WSGI, в котором указано, что делает вызываемое WSGI (приложение), но нет стандартизации развертывания;нет единого способа сообщить веб-серверу, где найти приложение.Также не существует стандартизированного способа заставить сервер перезагрузить приложение после того, как вы его обновили.
Подход, который я принял, заключается в том, чтобы поместить:
вся логика приложения в модулях / пакетах, предпочтительно в классах
все настройки для конкретного веб-сайта выполняются путем создания подкласса основного приложения и переопределения элементов
все параметры развертывания, зависящие от конкретного сервера (например.фабрика подключения к базе данных, настройки ретрансляции почты) в качестве параметров класса __init__()
одно приложение верхнего уровня.скрипт py, который инициализирует класс приложения с правильными настройками развертывания для текущего сервера, затем запускает приложение таким образом, чтобы оно могло работать в развертывании как CGI-скрипт, mod_wsgi WSGIScriptAlias (или Passenger, который, по-видимому, работает таким же образом), или с ним можно взаимодействовать из командной строки
вспомогательный модуль, который решает вышеуказанные проблемы с развертыванием и позволяет перезагружать приложение, когда меняются модули, на которые полагается приложение
Итак, что это за приложение.py выглядит в итоге примерно так:
#!/usr/bin/env python
import os.path
basedir= os.path.dirname(__file__)
import MySQLdb
def dbfactory():
return MySQLdb.connect(db= 'myappdb', unix_socket= '/var/mysql/socket', user= 'u', passwd= 'p')
def appfactory():
import myapplication
return myapplication.Application(basedir, dbfactory, debug= False)
import wsgiwrap
ismain= __name__=='__main__'
libdir= os.path.join(basedir, 'system', 'lib')
application= wsgiwrap.Wrapper(appfactory, libdir, 10, ismain)
wsgiwrap.Оболочка проверяет каждые 10 секунд, был ли обновлен какой-либо из модулей приложения в libdir, и если да, то выполняет какую-нибудь неприятную sys.modules магию, чтобы надежно выгрузить их все.Затем appfactory() будет вызван снова, чтобы получить новый экземпляр обновленного приложения.
(Вы также можете использовать инструменты командной строки, такие как
./application.py setup
./application.py daemon
для запуска любых перехватов настроек и фоновых задач, предоставляемых вызываемым приложением, немного похоже на то, как работает distutils.Он также реагирует на запуск / остановку / перезапуск подобно сценарию инициализации.)
Другой трюк, который я использую, заключается в том, чтобы поместить параметры развертывания для нескольких серверов (разработка / тестирование / производство) в один и тот же application.py скрипт и обнюхайте ‘socket.gethostname()’, чтобы решить, какой набор настроек для конкретного сервера использовать.
В какой-то момент я мог бы упаковать wsgiwrap и выпустить его должным образом (возможно, под другим именем).Тем временем, если вам интересно, вы можете ознакомиться с версией кормов для собак по адресу http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py.
Самая простая в развертывании вещь - это CherryPy.Ваше веб-приложение также может стать автономным веб-сервером.CherryPy также является довольно быстрым сервером, учитывая, что он написан на чистом Python.С учетом сказанного, это не Apache.Таким образом, я нахожу, что CherryPy - хороший выбор для веб-приложений с меньшим объемом.
Кроме этого, я не думаю, что есть какой-то правильный или неправильный ответ на этот вопрос.Множество сайтов большого объема были построены на технологиях, о которых вы говорите, и я не думаю, что вы можете сильно ошибиться в любом из этих способов (хотя я скажу, что согласен с тем, что mod-wsgi не на высоте на каждом сервере, отличном от apache).
Кроме того, я использовал isapi_wsgi исапи_wsgi для развертывания приложений python в IIS.Это далеко не идеальная настройка, но она работает, и вам не всегда удается выбрать что-то другое, когда вы живете в мире, ориентированном на Windows.
Обратный прокси-сервер Nginx и статический общий доступ к файлам + XSendfile + uploadprogress_module.Ничто не сравнится с этим по назначению.
На стороне WSGI либо Apache + mod_wsgi, либо сервер cherrypy.Мне нравится использовать cherrypy wsgi server для приложений на серверах с меньшим объемом памяти и меньшим количеством запросов.
Рассуждения:
Я проводил бенчмарки с помощью разных инструментов для разных популярных решений.
У меня больше опыта работы с низкоуровневым TCP / IP, чем с веб-разработкой, особенно с реализациями http.Я более уверен, что смогу распознать хороший http-сервер, чем я могу распознать хороший веб-фреймворк.
Я знаю Twisted гораздо больше, чем Django или Pylons.HTTP-стек в Twisted все еще не дотягивает до этого, но он будет там.
Я использую Google App Engine для приложения, которое я разрабатываю.Он запускает приложения WSGI.Вот пара кусочков информации об этом.
Это первое веб-приложение, над которым я когда-либо по-настоящему работал, поэтому у меня нет основы для сравнения, но если вы поклонник Google, возможно, вы захотите ознакомиться с ним.Мне было очень весело использовать его в качестве основы для обучения.
Турбонаддув (2.0)
Турбонаддув 2.0 уходит Бета в течение следующего месяца (занимался этим достаточно долго).2.0 улучшает серию 1.0 и пытается предоставить вам лучший в своем классе стек WSGI, поэтому он предлагает вам некоторые варианты по умолчанию, если вы хотите меньше всего суеты.
в нем есть tg*
инструменты для тестирования и развертывания в серии 1.x, но теперь преобразованные в paster
эквиваленты в серии 2.0, которые должны показаться знакомыми, если вы сталкивались с pylons
.
tg-admin quickstart —> paster quickstart tg-admin info —> paster tginfo tg-admin toolbox –> paster toolbox tg-admin shell –> paster shell tg-admin sql create –> paster setup-app development.ini
Пилоны
Если вы хотите быть более гибкими в своем стеке WSGI (выбор ORM, выбор шаблона, выбор формы), Pylons становятся консолидированным выбором.Это было бы мой рекомендуемый выбор, поскольку он предлагает отличную документацию и позволяет вам экспериментировать с различными компонентами.
В результате с ним приятно работать, и он работает под управлением Apache (производственное развертывание) или автономно (полезно на этапе тестирования и экспериментов).
из этого следует, что вы можете делать и то, и другое с помощью Пилонов:
2 вариант для этапа тестирования (
python
автономный)4 для масштабируемых производственных целей (
FastCGI
, предполагая, что выбранная вами база данных может идти в ногу со временем)
Интерфейс администратора Pylons очень похож на TurboGears.Вот тебе игрушка автономный пример:
$ paster create -t pylons helloworld $ cd helloworld $ paster serve --reload development.ini
для развертывания производственного класса вы могли бы обратиться к руководству по настройке Apache + FastCGI + mod_rewrite
имеется в наличии здесь.это позволило бы масштабироваться в соответствии с большинством потребностей.
Apache httpd + mod_fcgid с использованием web.py (который является приложением wsgi).
Работает как заклинание.
Мы используем чистую пасту для некоторых наших веб-сервисов.Его легко развернуть (с помощью нашего внутреннего механизма развертывания;мы не используем Paste Deploy или что-то в этом роде), и приятно свести к минимуму разницу между производственными системами и тем, что работает на рабочих станциях разработчиков.Предостережение:мы не ожидаем низкой задержки от самой вставки из-за тяжелого характера наших запросов.В каком-то грубом бенчмаркинге, который мы провели, мы не получили фантастика Результаты;это просто оказалось спорным из-за затрат на наш типичный обработчик запросов.До сих пор это работало нормально.
Статические данные обрабатывались совершенно отдельными (и в некоторой степени "органически" выращенными) стеками, включая использование S3, Akamai, Apache и IIS, различными способами.
Apache+mod_wsgi,
Простой, чистый.(всего четыре строки конфигурации веб-сервера), что позволяет другим системным администраторам легко разобраться.