2017-09-06 10 views
0

私は設定する必要があります。私は、グレースフルシャットダウンが呼び出された後、私のPythonコードにいくつかのことを実行する必要があるためWSGIRestrictSignalオフを。行儀のPython WSGIアプリケーションは、一般に、それ自身の使用signal.signalの任意の信号ハンドラを登録するべきではないドッカーでmod_wsgiを持つApacheベースの環境設定

():ドキュメントから

。これは、WSGIアプリケーションをホストしているWebサーバーが、独自のシグナルハンドラを登録する可能性が高いためです。 WSGIアプリケーションがそのようなシグナルハンドラをオーバーライドする場合、Webサーバーの動作を妨害し、サーバーのシャットダウンや再起動などの処理を妨げる可能性があります。

あなたはドッカーで設定ファイルを変更する方法を知っていますか?
既存のファイルを上書きするだけですか?

これは私のDockerfileです:

FROM grahamdumpleton/mod-wsgi-docker:python-2.7 
ADD requirements.txt requirements.txt 
RUN ["pip", "install", "-r", "requirements.txt"] 

WORKDIR /app 
COPY src/main/scripts/app.wsgi /app/app.wsgi 

ENTRYPOINT [ "mod_wsgi-docker-start" ] 

CMD [ "app.wsgi", "--processes", "1", "--port", "5000" ] 

は、私はこのような何かを置くもの?

ADD "httpd.conf" /tmp/mod_wsgi-localhost:5000:0/httpd.conf 

は、私の知る限りはmod_wsgiを-ドッキングウィンドウスタートがデフォルト」を選択して、すべてを実行している 『』設定を。WSGIRestrictSignalがONに設定されているという事実により

『デフォルトだと』それが不可能である

Server URL   : http://localhost:5000/ 
Server Root  : /tmp/mod_wsgi-localhost:5000:0 
Server Conf  : /tmp/mod_wsgi-localhost:5000:0/httpd.conf 
Error Log File  : /dev/stderr (warn) 
Startup Log File : /dev/stderr 
Request Capacity : 5 (1 process * 5 threads) 
Request Timeout : 60 (seconds) 
Startup Timeout : 15 (seconds) 
Queue Backlog  : 100 (connections) 
Queue Timeout  : 45 (seconds) 
Server Capacity : 20 (event/worker), 20 (prefork) 
Server Backlog  : 500 (connections) 
Locale Setting  : en_US.UTF-8 
[Wed Sep 06 09:37:32.673894 2017] [mpm_event:notice] [pid 14:tid 140686654945024] AH00489: Apache/2.4.25 (Unix) mod_wsgi/4.5.7 Python/2.7 configured -- resuming normal operations 
[Wed Sep 06 09:37:32.674133 2017] [core:notice] [pid 14:tid 140686654945024] AH00094: Command line: 'httpd (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:5000:0/httpd.conf -E /dev/stderr -D MOD_WSGI_MULTIPROCESS -D MOD_WSGI_MPM_ENABLE_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_EVENT_MODULE -D MOD_WSGI_MPM_EXISTS_WORKER_MODULE -D MOD_WSGI_MPM_EXISTS_PREFORK_MODULE -D FOREGROUND' 
^C[Wed Sep 06 09:37:33.106471 2017] [mpm_event:notice] [pid 14:tid 140686654945024] AH00491: caught SIGTERM, shutting down 
[Wed Sep 06 09:37:33.254507 2017] [wsgi:warn] [pid 16:tid 140686654945024] mod_wsgi (pid=16): Callback registration for signal 28 ignored. 
[Wed Sep 06 09:37:33.256509 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/tmp/mod_wsgi-localhost:5000:0/handler.wsgi", line 94, in <module> 
[Wed Sep 06 09:37:33.256546 2017] [wsgi:warn] [pid 16:tid 140686654945024]  recorder_directory=recorder_directory) 
[Wed Sep 06 09:37:33.256563 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/usr/local/python/lib/python2.7/site-packages/mod_wsgi/server/__init__.py", line 1355, in __init__ 
[Wed Sep 06 09:37:33.256642 2017] [wsgi:warn] [pid 16:tid 140686654945024]  exec(code, self.module.__dict__) 
[Wed Sep 06 09:37:33.256720 2017] [wsgi:warn] [pid 16:tid 140686654945024] File "/app/myapp.py", line 325, in <module> 
[Wed Sep 06 09:37:33.256770 2017] [wsgi:warn] [pid 16:tid 140686654945024]  signal.signal(signal.SIGWINCH, on_exit) 

そして、私が解決しても、公式ドキュメントで撮影された情報以下の問題は、私を悩ませている:

、それが発生した場合に信号を取り込みます

などのシグナルハンドラを登録する機能を有効にすると、 WSGIImportScriptディレクティブで識別されるスクリプトファイルをインポートする副作用として が実装されたコード内からの登録が確実に行われることに注意してください。信号ハンドラは のみメインPythonインタプリタスレッドから登録することができるからである、と 要求ハンドラ埋め込みモードとマルチスレッドアパッチ MPMを使用して、一般的に二次スレッドから実行することになります。デーモンモードを使用する場合 同様に、要求ハンドラは、二次 スレッドから実行されることになります。 WSGIImportScriptの副作用として実行コードのみがメインPythonインタプリタスレッドで実行されることが保証 あります。

答えて

0

信号を使用しないでください。 Pythonでatexitモジュールを使用して、コールバックを登録します。プロセスがシャットダウンされると、コールバックが呼び出されます。

関連する問題