有沒有辦法讓mod_wsgi在每個負載上重新加載所有模塊(可能位於特定的目錄中)?mod_wsgi強制重載模塊
在處理代碼時,每次更改某個東西時重新啓動apache都非常煩人。目前爲止,我發現的唯一選擇是將modname = reload(modname)
放置在每個進口下方..但是這也非常煩人,因爲這意味着我將不得不在日後將其全部刪除。
有沒有辦法讓mod_wsgi在每個負載上重新加載所有模塊(可能位於特定的目錄中)?mod_wsgi強制重載模塊
在處理代碼時,每次更改某個東西時重新啓動apache都非常煩人。目前爲止,我發現的唯一選擇是將modname = reload(modname)
放置在每個進口下方..但是這也非常煩人,因爲這意味着我將不得不在日後將其全部刪除。
mod_wsgi documentation on code reloading是你最好的答案。
鏈接:
http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode
應引起重視。還應該強調,在UNIX系統中必須使用mod_wsgi的守護進程模式,並且必須實現文檔中描述的代碼監視器。整個進程重新加載選項將不適用於UNIX系統上mod_wsgi的嵌入模式。即使在Windows系統中,唯一的選擇是嵌入模式,但通過從代碼監視腳本觸發Apache的內部重新啓動來完成同樣的事情也是有可能的。這也在文檔中描述。
下面的解決方案是針對只有Linux用戶,並已經過測試,在Ubuntu服務器的工作12.04.1
下守護模式下運行WSGI,你需要在你的Apache配置文件來指定WSGIProcessGroup
和WSGIDaemonProcess
指令,例如
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
我知道這是一個古老的線程但是這可能幫助別人。殺死你的進程時,某些目錄下的文件進行寫操作,您可以使用這樣的事情:
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>)
如果你的主服務器上的文件中包含的所有文件的目錄,你可以去,如:
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
我讀的是..雖然沒有那麼有用:( – Ian 2009-04-20 02:55:45
伊恩,這是因爲你在Windows上還是在嵌入模式下使用mod_wsgi?因爲否則該頁面有一些自動重啓的代碼,並且完美地工作。 – 2009-04-20 04:07:51
不,這是在Linux上。 自動重新加載僅適用於正在訪問的腳本,而不是腳本隨後調用的模塊。 – Ian 2009-04-22 12:30:50