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

7

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

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

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

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

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

Ваш Ответ

4   ответа
5

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

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

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

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

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

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

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

2

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

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

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

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