Как ВЫ развертываете свое приложение WSGI? (и почему это лучший способ) - PullRequest
42 голосов
/ 22 февраля 2009

Развертывание приложения WSGI. Есть много способов снять шкуру с этой кошки. В настоящее время я использую apache2 с mod-wsgi, но я вижу некоторые потенциальные проблемы с этим.

Так как это можно сделать?

  1. Apache Mod-wsgi (другие мод-wsgi, похоже, не стоят того)
  2. Чистый веб-сервер Python, например, паста, вишня, Spawn, Twisted.web
  3. как 2, но с обратным прокси из nginx, apache2 и т. Д., С хорошей статической обработкой файлов
  4. Преобразование в другой протокол, такой как FCGI с мостом (например, Flup) и работающий на обычном веб-сервере.

Подробнее

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

Ответы [ 9 ]

27 голосов
/ 22 февраля 2009

Как всегда: зависит; -)

Когда мне не нужны какие-либо функции apache, я использую чистый веб-сервер на python, такой как paste и т. Д. Какой именно зависит от вашего приложения, я думаю, и его можно решить, выполнив некоторые тесты. Я всегда хотел сделать что-то, но никогда не приходил к этому. Я предполагаю, что у Spawning могут быть некоторые преимущества в использовании неблокирующего ввода-вывода из коробки, но у меня иногда были проблемы с этим из-за исправления, которое это делает.

Вы всегда можете также нанести лак впереди.

Если требуется Apache, я обычно использую решение 3, чтобы можно было разделять процессы. Вы также можете легче переносить процессы на другие серверы и т. Д. Мне просто нравится хранить вещи отдельно.

Для статических файлов я сейчас использую отдельный сервер для проекта, который просто обслуживает статические изображения / css / js. Я использую lighttpd в качестве веб-сервера, который имеет отличную производительность (в этом случае у меня больше нет лака впереди).

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

Я дополнительно использую buildout для управления своими развертываниями и изолированными программными средами разработки (вместе с virtualenv ).

13 голосов
/ 08 марта 2009

Я бы очень хотел, чтобы вы утомили меня подробностями о том, что и почему, о конкретных приложениях и т. Д.

Хо. Ну, вы просили об этом!

Как и Даниэль, я лично использую Apache с mod_wsgi. Он по-прежнему достаточно новый, поэтому его развертывание в некоторых средах может быть проблематичным, но если вы все равно все компилируете, это довольно просто. Я нашел это очень надежным, даже ранние версии. Реквизит Грэму Дамплтону для того, чтобы держать его под контролем.

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

Подход, который я принял, заключается в следующем:

  • вся логика приложения в модулях / пакетах, предпочтительно в классах

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

  • все настройки развертывания для конкретного сервера (например, фабрика соединений с базой данных, настройки ретрансляции почты) в качестве параметров класса __init __ ()

  • один сценарий верхнего уровня «application.py», который инициализирует класс Application с правильными настройками развертывания для текущего сервера, а затем запускает приложение таким образом, чтобы оно могло работать, развернутое как сценарий CGI, mod_wsgi WSGIScriptAlias ​​(или Passenger, который, по-видимому, работает так же), или с ним можно взаимодействовать из командной строки

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

Итак, как выглядит application.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.Wrapper проверяет каждые 10 секунд, чтобы увидеть, был ли обновлен какой-либо из модулей приложения в libdir, и если да, то какая-нибудь противная магия sys.modules надежно выгружает их все. Затем appfactory () будет вызван снова, чтобы получить новый экземпляр обновленного приложения.

(Вы также можете использовать инструменты командной строки, такие как

./application.py setup
./application.py daemon

для запуска любых хуков установки и фоновых задач, предоставляемых вызываемым приложением - немного похоже на то, как работает distutils. Он также реагирует на запуск / останов / перезапуск, как сценарий инициализации.)

Еще одна хитрость, которую я использую, заключается в том, чтобы поместить параметры развертывания для нескольких серверов (разработка / тестирование / производство) в один и тот же сценарий application.py и отнюдь "socket.gethostname ()", чтобы решить, какой набор параметров для конкретного сервера следует выполнить. использовать.

В какой-то момент я мог бы упаковать wsgiwrap и выпустить его должным образом (возможно, под другим именем). В то же время, если вам интересно, вы можете увидеть версию для разработки dogfood в http://www.doxdesk.com/file/software/py/v/wsgiwrap-0.5.py.

13 голосов
/ 22 февраля 2009

Абсолютно самая простая вещь для развертывания - CherryPy. Ваше веб-приложение также может стать автономным веб-сервером. CherryPy также довольно быстрый сервер, учитывая, что он написан на чистом Python. С учетом сказанного, это не Apache. Таким образом, я считаю, что CherryPy является хорошим выбором для веб-приложений меньшего объема.

Кроме этого, я не думаю, что есть правильный или неправильный ответ на этот вопрос. Множество крупных сайтов было построено на технологиях, о которых вы говорите, и я не думаю, что вы можете ошибиться любым из этих способов (хотя я скажу, что я согласен с тем, что mod-wsgi не собирается нюхать не-apache сервер).

Кроме того, я использовал isapi_wsgi для развертывания приложений Python под IIS. Это далеко не идеальная установка, но она работает, и вы не всегда можете выбирать иначе, когда живете в мире, ориентированном на Windows.

6 голосов
/ 11 марта 2009

Обратный прокси-сервер Nginx и обмен статическими файлами + XSendfile + uploadprogress_module. Ничто не сравнится с этой целью.

На стороне WSGI либо Apache + mod_wsgi, либо сервер cherrypy. Мне нравится использовать сервер cherrypy wsgi для приложений на серверах с меньшим объемом памяти и меньшим количеством запросов.

Обоснование:

Я провел тесты с различными инструментами для разных популярных решений.

У меня больше опыта работы с TCP / IP более низкого уровня, чем с веб-разработкой, особенно с реализацией http. Я уверен, что могу распознать хороший http-сервер, чем хороший веб-фреймворк.

Я знаю Twisted гораздо больше, чем Django или Pylons. Стек http в Twisted все еще не до этого, но он будет там.

4 голосов
/ 10 марта 2009

TurboGears (2.0)

TurboGears 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 доступно здесь . это будет соответствовать большинству потребностей.

4 голосов
/ 24 февраля 2009

Я использую Google App Engine для разрабатываемого приложения. Он запускает приложения WSGI. Вот пара битов информации об этом.

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

3 голосов
/ 05 марта 2009

Apache httpd + mod_fcgid с использованием web.py (который является приложением wsgi).

Работает как шарм.

1 голос
/ 06 марта 2009

Apache + mod_wsgi,

Просто, чисто. (только четыре строки конфигурации веб-сервера), легко для других системных администраторов.

1 голос
/ 05 марта 2009

Мы используем чистую вставку для некоторых наших веб-сервисов. Его легко развернуть (с нашим внутренним механизмом развертывания; мы не используем Paste Deploy или что-то в этом роде), и приятно минимизировать разницу между производственными системами и тем, что работает на рабочих станциях разработчиков. Предостережение: мы не ожидаем низкой задержки из-за самой вставки из-за тяжелого характера наших запросов. В некоторых грубых тестах мы не получили фантастических результатов; это просто оказалось спорным из-за расходов нашего типичного обработчика запросов. Пока все работает нормально.

Статические данные обрабатывались совершенно разными (и несколько «органически» выращенными) стеками, включая использование S3, Akamai, Apache и IIS, различными способами.

...