mod_wsgi がロードのたびにすべてのモジュール (おそらく特定のディレクトリ内) をリロードする方法はありますか?
コードの作業中、何かが変更されるたびに apache を再起動するのは非常に面倒です。これまでに見つけた唯一のオプションは、modname = reload(modname)
すべてのインポートの下に置くことです..しかし、それは、後でそれらをすべて調べて削除する必要があることを意味するため、本当に面倒です..
リンク:
http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode
強調する必要があります。また、UNIX システムでは mod_wsgi のデーモン モードを使用する必要があり、ドキュメントに記載されているコード モニターを実装する必要があることも強調する必要があります。プロセス全体のリロード オプションは、UNIX システムの mod_wsgi の組み込みモードでは機能しません。Windows システムでは埋め込みモードしか選択肢がありませんが、コード監視スクリプトから Apache の内部再起動をトリガーすることで、ちょっとしたトリックで同じことを行うことができます。これはドキュメントにも記載されています。
次のソリューションは Linux ユーザーのみを対象としており、Ubuntu Server 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をご覧ください。
追加のボーナスは、VirtualHost ディレクティブを使用して、同じサーバーで複数の WSGI サイトを実行している場合の安定性です。デーモン プロセスを使用しないと、2 つの 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
トリックを行うでしょう。
上記の方法を利用することで、Apache サーバー全体を再起動/リロードしたり、WSGI スクリプトを変更して本番環境で安全でないコードの変更を監視したりすることなく、本番環境で WSGI サイトを自動的にリロードできます。
これは、展開スクリプトを自動化し、展開時に Apache サーバーを再起動したくない場合に特に便利です。
開発中、ファイルシステムの変更ウォッチャーを使用してtouch wsgi.py
、サイトの下のモジュールが変更されるたびに呼び出すことができます (例: pywatch )。
コードのリロードに関する mod_wsgi のドキュメントは、答えを得る最善の策です。
私はそれが古いスレッドであることを知っていますが、これは誰かを助けるかもしれません. 特定のディレクトリ内のファイルが書き込まれたときにプロセスを強制終了するには、次のようなものを使用できます。
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 install inotify」が必要です
これは、次のコードから盗用されました: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes
これは私の重複した質問への回答です: WSGI プロセス リロード モジュール