модули принудительной перезагрузки mod_wsgi - PullRequest
11 голосов
/ 20 апреля 2009

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

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

Ответы [ 4 ]

12 голосов
/ 24 июня 2009

Ссылка:

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

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

9 голосов
/ 27 мая 2013

Следующее решение предназначено только для пользователей 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

5 голосов
/ 20 апреля 2009

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

2 голосов
/ 23 августа 2016

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

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

...