Модули перезагрузки mod_wsgi

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

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

Ответ 1

Документация по перезагрузке кода - это лучший вариант для ответа. mod_wsgi

Ответ 2

Ссылка:

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

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

Ответ 3

Следующее решение предназначено только для пользователей 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 script. Конечно, вам не нужно менять его содержимое, но, скорее,

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

сделал бы трюк.

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

Это особенно полезно при автоматическом развертывании сценариев и не нужно перезапускать сервер Apache при развертывании.

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

Ответ 4

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

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 install inotify'

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

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