Вопрос по apache, django, mod-wsgi – Джанго + WSGI: Обновление проблем?

7

Я разрабатываю сайт Django. Я делаю все свои изменения на живом сервере, просто потому, что так проще. Проблема в том, что время от времени ему нравится кэшировать один из * .py файлов, над которыми я работаю. Иногда, если я нажимаю «обновить», он переключается между старой версией страницы и новой версией.

Моя установка более или менее похожа на ту, что описана в руководствах по Django:http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

яугадывание он делает это потому, что запускает несколько экземпляров обработчика WSGI, и в зависимости от того, на какой обработчик отправляется http-запрос, я могу получать разные версии страницы. Кажется, перезапуск apache решает проблему, но это раздражает.

Я действительно не знаю много о WSGI или MiddleWare или о других вещах, обрабатывающих запросы. Я пришел из PHP фона, где все это просто работает :)

В любом случае, каков хороший способ решения этой проблемы? Будет ли облегчить проблему запуск обработчика WSGI в «режиме демона»? Если да, то как мне заставить его работать в режиме демона?

Ваш Ответ

4   ответа
2

не редактируя свой код на живом сервере. Серьезно, этому нет оправдания. Разрабатывайте локально, используя контроль версий, и, если необходимо, запустите свой сервер из оперативной проверки с помощью ловушки после фиксации, которая проверяет вашу последнюю версию и перезапускает Apache.

да, но иногда prod environment ведет себя не так, как встроенный сервер dev, поэтому выбора нет :) jujule
Множество причин, почему люди пишут код на живом сервере. Вы не в состоянии сказать ему иначе. Просьба придерживаться темы. Randy Greencorn
это так много работы для репликации серверной среды! мой сервер работает под управлением Ubuntu / Apache2 / Postgres, а мой домашний компьютер использует Win7 ... и я даже не пытался установить два других. предполагая, что я запустил это, как я перенесу базу данных в производство? mpen
Не говоря уже о том, что перезапуск Apache вызывает несколько драгоценных секунд простоя. Harel
@jujule: вы можете настроить тестовый домен на сервере prod, чтобы вы могли тестировать то, что разрабатываете локально. Я не могу придумать никаких оправданий, которые могли бы оправдать редактирование кода на сервере prod. shanyu
17

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

Интерпретатор Python каждого процесса будет загружать ваши модули (ваши пользовательские файлы Python) всякий раз, когда выполняется «модуль импорта». В контексте django это произойдет, когда потребуется новый view.py из-за веб-запроса. Как только модуль загружен, он находится в памяти, поэтому любые изменения, внесенные в файл, не будут отражены в этом процессе. По мере поступления новых веб-запросов интерпретатор Python процесса будет просто использовать версию модуля, уже загруженную в память. Вы видите несоответствия между обновлениями, поскольку каждый ваш веб-запрос может обрабатываться различными процессами. Некоторые процессы могли загружать ваши модули Python во время более ранних ревизий вашего кода, в то время как другие могли загружать их позже (поскольку эти процессы не получили веб-запрос).

Простое решение: каждый раз, когда вы изменяете свой код, перезапустите процесс Apache. В большинстве случаев это так же просто, как запускать от имени root из оболочки "/etc/init.d/apache2 restart". Я считаю, что простая перезагрузка также работает, что быстрее, "/etc/init.d/apache2 reload"

Решение демона: если вы используете mod_wsgi в режиме демона, то все, что вам нужно сделать, это нажать (команда unix) или изменить файл сценария wsgi. Чтобы прояснить статью на scrompt.com, внесение изменений в исходный код Python не приведет к перезагрузке mod_wsgi вашего кода. Перезагрузка происходит только после изменения файла сценария wsgi.

Последнее замечание: я говорил только о том, что wsgi использует процессы для простоты. wsgi фактически использует пулы потоков внутри каждого процесса. Я не чувствую, что эта деталь имеет отношение к этому ответу, но вы можете узнать больше, читая оmod_wsgi.

Кстати, режим демона может помочь, так как он позволяет вам запустить монитор кода, как описано в документации mod_wsgi, на которую есть ссылка в другом ответе. Таким образом, любое изменение в коде Python, а не только в файле сценария WSGI, может автоматически инициировать перезапуск группы процессов демона. Graham Dumpleton
Хорошее объяснение! Благодарю. Является ли этот пул потоков выгоднее / быстрее, чем то, что делает тогда PHP? mpen
При использовании многопоточности вы должны бороться с Python GIL. Таким образом, для интенсивного вычисления кода обработчика запросов вы можете немного пострадать от невозможности использовать несколько процессоров / ядер в одном процессе. Если код обращается к базам данных и другим модулям, которые выпускают GIL, это не такая большая проблема. Во всяком случае, гораздо сложнее, чем это. Предлагаю вам прочитать 'blog.dscpl.com.au/2007/09/...». Graham Dumpleton
5

ваши изменения не будут видны автоматически. Вы видите их время от времени, потому что Apache иногда запускает новые экземпляры обработчиков, которые ловят обновления.

Вы можете решить эту проблему, используя режим демона, как описаноВот, В частности, вы захотите добавить следующие директивы в вашу конфигурацию Apache:

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
Мне не нужны виртуальные хосты для этой работы? mpen
Ты просто сохрани мой день! :) Nico Coallier
Я предполагаю, что вы можете просто поместить объявления в тот же контекст, что и WSGIScriptAlias. Edward Dale
Это, кажется, не имеет никакого эффекта, кстати. mpen
5

а не полагайтесь на минимальную информацию для хостинга mod_wsgi, содержащуюся на сайте Django. В частности, прочитайте:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

Это точно говорит о том, как происходит перезагрузка исходного кода в mod_wsgi, включая монитор, который вы можете использовать для реализации такой же перезагрузки исходного кода, что и сервер запуска Django. Также посмотрите, что говорит о том, как применить это к Джанго.

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html

Похожие вопросы