2009-04-20 99 views
10

有沒有辦法讓mod_wsgi在每個負載上重新加載所有模塊(可能位於特定的目錄中)?mod_wsgi強制重載模塊

在處理代碼時,每次更改某個東西時重新啓動apache都非常煩人。目前爲止,我發現的唯一選擇是將modname = reload(modname)放置在每個進口下方..但是這也非常煩人,因爲這意味着我將不得不在日後將其全部刪除。

回答

5

mod_wsgi documentation on code reloading是你最好的答案。

+2

我讀的是..雖然沒有那麼有用:( – Ian 2009-04-20 02:55:45

+0

伊恩,這是因爲你在Windows上還是在嵌入模式下使用mod_wsgi?因爲否則該頁面有一些自動重啓的代碼,並且完美地工作。 – 2009-04-20 04:07:51

+0

不,這是在Linux上。 自動重新加載僅適用於正在訪問的腳本,而不是腳本隨後調用的模塊。 – Ian 2009-04-22 12:30:50

11

鏈接:

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

應引起重視。還應該強調,在UNIX系統中必須使用mod_wsgi的守護進程模式,並且必須實現文檔中描述的代碼監視器。整個進程重新加載選項將不適用於UNIX系統上mod_wsgi的嵌入模式。即使在Windows系統中,唯一的選擇是嵌入模式,但通過從代碼監視腳本觸發Apache的內部重新啓動來完成同樣的事情也是有可能的。這也在文檔中描述。

9

下面的解決方案是針對只有Linux用戶,並已經過測試,在Ubuntu服務器的工作12.04.1

下守護模式下運行WSGI,你需要在你的Apache配置文件來指定WSGIProcessGroupWSGIDaemonProcess指令,例如

WSGIProcessGroup my_wsgi_process 
WSGIDaemonProcess my_wsgi_process threads=15 

更多詳情,可在http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

另外一個好處是額外的穩定性,如果你正在運行的SAM下的多個WSGI網站e服務器,可能帶有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

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

在服務器啓動時,把它想:

服務器的.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 process reload modules