Вопрос

Есть ли способ заставить mod_wsgi перезагружать все модули (возможно, в определенном каталоге) при каждой загрузке?

Во время работы над кодом очень раздражает перезапускать apache каждый раз, когда что-то меняется.Единственный вариант, который я нашел на данный момент, - это поместить modname = reload(modname) ниже каждого импорта..но это также очень раздражает, поскольку это означает, что мне придется просмотреть и удалить их все позже..

Это было полезно?

Решение

мод_wsgi документация по перезагрузке кода это ваш лучший выбор для получения ответа.

Другие советы

Связь:

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

следует подчеркнуть.Также следует подчеркнуть, что в системах UNIX должен использоваться демонический режим mod_wsgi, и вы должны реализовать code monitor, описанный в документации.Опция полной перезагрузки процесса не будет работать для встроенного режима mod_wsgi в системах UNIX.Несмотря на то, что в системах Windows единственным вариантом является встроенный режим, можно с помощью небольшой хитрости сделать то же самое, запустив внутренний перезапуск Apache из скрипта мониторинга кода.Это также описано в документации.

Следующее решение предназначено только для пользователей Linux и было протестировано для работы под управлением Ubuntu Server 12.04.1

Чтобы запустить WSGI в режиме демона, вам необходимо указать WSGIProcessGroup и WSGIDaemonProcess директивы в вашем конфигурационном файле Apache, например

WSGIProcessGroup my_wsgi_process
WSGIDaemonProcess my_wsgi_process threads=15

Более подробная информация доступна в http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

Дополнительным бонусом является дополнительная стабильность, если вы запускаете несколько сайтов WSGI под одним сервером, возможно, с директивами VirtualHost.Без использования демонических процессов я обнаружил, что два сайта Django конфликтуют друг с другом и поочередно выдают 500 внутренних ошибок сервера.

На данный момент ваш сервер фактически уже отслеживает ваш сайт WSGI на предмет изменений, хотя он просматривает только файл, указанный вами с помощью WSGIScriptAlias, как

WSGIScriptAlias / /var/www/my_django_site/my_django_site/wsgi.py

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

$ touch /var/www/my_django_site/my_django_site/wsgi.py

это сделало бы свое дело.

Используя описанный выше метод, вы можете автоматически перезагрузить сайт WSGI в рабочей среде без перезапуска / перезагрузки всего сервера Apache или модификации вашего скрипта WSGI для мониторинга изменений небезопасного для производства кода.

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

Во время разработки вы можете использовать средство наблюдения за изменениями файловой системы для вызова touch wsgi.py например, каждый раз, когда меняется модуль на вашем сайте, часы pywatch

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

monitor.py

import os, sys, time, signal, threading, atexit
import inotify.adapters

def _monitor(path):

    i = inotify.adapters.InotifyTree(path)

    print "monitoring", path
    while 1:
        for event in i.event_gen():
            if event is not None:
                (header, type_names, watch_path, filename) = event
                if 'IN_CLOSE_WRITE' in type_names:
                    prefix = 'monitor (pid=%d):' % os.getpid()
                    print "%s %s/%s changed," % (prefix, path, filename), 'restarting!'
                    os.kill(os.getpid(), signal.SIGKILL)

def start(path):

    t = threading.Thread(target = _monitor, args = (path,))
    t.setDaemon(True)
    t.start()

    print 'Started change monitor. (pid=%d)' % os.getpid()

При запуске вашего сервера назовите это следующим образом:

server.py

import monitor

monitor.start(<directory which contains your wsgi files>)

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

monitor.start(os.path.dirname(__file__))

Добавление других папок оставлено в качестве упражнения...

Вам нужно будет "установить pip inotify"

Это было списано из приведенного здесь кода: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

Это ответ на мой дублирующий вопрос здесь: Модули перезагрузки процесса WSGI

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