Как вы развертываете свое приложение WSGI?(и почему это лучший способ)

StackOverflow https://stackoverflow.com/questions/574068

  •  05-09-2019
  •  | 
  •  

Вопрос

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

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

  1. Apache Mod-wsgi (другой мод-wsgi, похоже, того не стоит)
  2. Чистый веб-сервер Python, например, paste, cherrypy, Spawning, Twisted.web
  3. как 2, но с обратным прокси от nginx, apache2 и т.д., С хорошей статической обработкой файлов
  4. Преобразование в другой протокол, такой как 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,

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top