Джанго + WSGI: Обновление проблем? - PullRequest
7 голосов
/ 28 октября 2009

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 05 декабря 2009

Запуск процесса в режиме демона не поможет. Вот что происходит:

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 .

5 голосов
/ 28 октября 2009

Читайте документацию по mod_wsgi, а не полагайтесь на минимальную информацию для хостинга 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

5 голосов
/ 28 октября 2009

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

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

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
2 голосов
/ 28 октября 2009

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

...