Веб-хостинг Python: зачем нужен перезапуск сервера? - PullRequest
6 голосов
/ 11 ноября 2009

В настоящее время мы запускаем небольшой сервис общего хостинга для нескольких сотен небольших сайтов PHP на наших серверах. Мы также хотели бы предложить поддержку Python, но, по крайней мере, из нашего первоначального исследования, после каждого изменения исходного кода требуется перезагрузка сервера.

Это действительно так? Если это так, мы просто не сможем предложить поддержку хостинга Python. Предоставить нашим клиентам возможность загружать файлы легко, но мы не можем заставить их перезапустить (общий) серверный процесс!

PHP прост - вы загружаете новую версию файла, новая версия запускается.

Я очень уважаю язык и сообщество Python, поэтому мне трудно поверить, что для обновления кода сайта действительно необходим такой сумасшедший процесс. Пожалуйста, скажи мне, что я не прав! : -)

Ответы [ 3 ]

7 голосов
/ 11 ноября 2009

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

Если вы используете стандартный модуль WSGI, такой как Apache mod_wsgi, вам не нужно перезагружать сервер - просто коснитесь файла .wsgi, и код будет перезагружен. Если вы используете какой-то странный сервер, который не поддерживает WSGI, вы немного удобны в использовании.

4 голосов
/ 11 ноября 2009

Зависит от того, как вы развертываете приложение Python. Если это чистый Python CGI-скрипт, перезапуски не нужны (хотя и не рекомендуется, потому что он будет очень медленным). Если вы используете modwsgi в Apache, есть допустимые способы перезагрузки источника . Modpython, по-видимому, имеет некоторую поддержку и сопутствующие проблемы для перезагрузки модуля.

Существуют и другие способы, кроме Apache, для размещения приложений Python, включая сервер CherryPy, Paste Server, Zope, Twisted и Tornado.

Однако, если у вас нет особых причин не использовать его (поскольку вы, вероятно, пришли из магазина Apache / PHP), я бы настоятельно рекомендовал mod_wsgi для Apache. Я знаю, что Django рекомендует использовать modwsgi на Apache, и большинство других основных сред Python будут работать на modwsgi.

3 голосов
/ 11 ноября 2009

Это действительно так?

Это зависит. Перезагрузка кода очень специфична для хостинга. Большинство серверов предоставляют какой-либо способ автоматической перезагрузки самого сценария WSGI, но стандартизации нет; действительно, вопрос о том, как объект приложения WSGI подключается к веб-серверу, сильно отличается в разных средах хостинга. (Вы можете просто создать один файл сценария, который работает как клей для развертывания CGI, mod_wsgi, passenger и ISAPI_WSGI, но это не совсем тривиально.)

Однако Python действительно борется с перезагрузкой модуля. Что проблематично для приложений WSGI, потому что любое нетривиальное веб-приложение будет инкапсулировать свою функциональность в модули и пакеты, а не в простые автономные сценарии. Оказывается, перезагрузка модулей довольно сложна, потому что, если вы reload() используете их один за другим, они легко могут получить плохие ссылки на старые версии. В идеале дальнейший путь заключается в перезагрузке всего интерпретатора Python при обновлении любого файла, но на практике кажется, что некоторым расширениям C это не нравится, поэтому обычно это не делается.

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

В этом случае вы можете захотеть посмотреть на что-то вроде запуска mod_wsgi в режиме демона с группой приложений для каждой стороны и перезагрузки на уровне процесса и прикоснуться к файлу сценария WSGI при обновлении любого из модулей.

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

...