2009-04-20 5 views
10

각로드마다 mod_wsgi가 모든 모듈을 리로드 (특정 디렉토리에있을 수 있음) 할 수있는 방법이 있습니까?mod_wsgi force reload modules

코드를 작업하면서 뭔가가 바뀔 때마다 아파치를 다시 시작하는 것은 매우 짜증나게합니다. 지금까지 찾은 유일한 옵션은 모든 가져 오기 아래에 modname = reload(modname)을 넣는 것입니다.하지만 나중에 다시 살펴 봐야 할 것이므로 의미가 있습니다.

답변

5

mod_wsgi documentation on code reloading은 답을 얻기위한 최선의 방법입니다.

+2

나는 그걸 읽고 있었다 : ( – Ian

+0

이안, 당신이 Windows에 있거나 임베디드 모드에서 mod_wsgi를 사용하기 때문에이게 뭐야? 그렇지 않으면 페이지가 자동으로 다시 시작될 수있는 코드가 있기 때문에 완벽하게 작동합니다. –

+0

아니, 이것은 리눅스에있다. 자동 다시로드는 액세스중인 스크립트에만 적용되며 스크립트가 호출하는 모듈에는 적용되지 않습니다. – Ian

11

링크 :

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

이 강조되어야한다. 또한 UNIX 시스템에서 mod_wsgi의 데몬 모드를 사용해야하며 설명서에 설명 된 코드 모니터를 구현해야한다는 사실을 명심해야합니다. UNIX 시스템에서 mod_wsgi의 임베디드 모드에서는 전체 프로세스 재로드 옵션이 작동하지 않습니다. Windows 시스템에서 유일한 옵션은 임베디드 모드이지만, 코드 모니터링 스크립트에서 Apache를 내부적으로 다시 시작함으로써 동일한 작업을 수행하는 것은 약간의 속임수를 통해 가능합니다. 이 내용은 설명서에도 설명되어 있습니다.

9

다음 솔루션은 단지 리눅스 사용자를 대상으로하고, 데몬 모드에서 WSGI를 실행하려면 12.04.1

우분투 서버에서 작동하도록 테스트되었습니다, 당신은 당신의 아파치 설정 파일에 WSGIProcessGroupWSGIDaemonProcess 지시를 지정해야 당신이 샘에서 여러 WSGI 사이트를 실행하는 경우, 예를 들어

WSGIProcessGroup my_wsgi_process 
WSGIDaemonProcess my_wsgi_process threads=15 

자세한 내용은 보너스 추가 http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

에서 사용할 수있는 여분의 안정성입니다 e 서버에 VirtualHost 지시어를 추가 할 수 있습니다. 데몬 프로세스를 사용하지 않고 두 개의 Django 사이트가 서로 충돌하여 500 개의 내부 서버 오류가 발생하는 것을 발견했습니다. 그것은 단지

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

처럼, 당신은 WSGIScriptAlias을 사용하여 지정된 파일을 시계하지만이 시점에서

는, 서버가이 말은 WSGI 데몬 프로세스를 강제 할 수 있다는 것을 의미, 이미 변화에 대한 귀하의 WSGI 사이트를 모니터링 사실입니다 WSGI 스크립트를 변경하여 다시로드하십시오. 물론 내용을 변경할 필요가 없습니다.

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

트릭을 수행합니다.

위의 방법을 사용하면 전체 Apache 서버를 다시 시작하거나 다시로드하거나 프로덕션 환경에서 안전하지 않은 코드 변경 모니터링을 수행하도록 WSGI 스크립트를 수정하지 않고도 프로덕션 환경에서 WSGI 사이트를 자동으로 다시로드 할 수 있습니다.

이 기능은 배포 스크립트를 자동화하고 배포시 Apache 서버를 다시 시작하지 않으려는 경우 특히 유용합니다.

개발하는 동안, 당신은 내가 오래된 스레드 알고 변경 예를 들어, 사이트 변경에 따라 touch wsgi.py 때마다 모듈을 호출 인 watcher 파일 시스템, pywatch

2

를 사용할 수 있지만이 사람을 도움이 될 수 있습니다.특정 디렉토리에있는 모든 파일, 당신은 같은 것을 사용할 수 있습니다에 기록 될 때 당신의 프로세스를 종료하려면 서버 시작에

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() 

를,이 같은 전화 :

서버

: 주 서버 파일의 모든 파일이 들어있는 디렉토리에있는 경우

import monitor 

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

을 평, 당신은 같이 갈 수있다 https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes

이는이다 : 다른 폴더를 추가

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

당신이 여기에 코드에서 cribbed했다

'inotify를 설치 PIP'해야합니다 ... 운동으로 남아 여기에 내 중복 질문에 대한 답변 : WSGI process reload modules