scipyのインストール後の応答のないApache + mod_wsgi


10

私は現在、Apache 2.2.15とmod_wsgi 3.2を備えたCentos 6.4サーバーを実行しています。サーバーはdjangoベースのサイト(django 1.5.1、python 2.6.6)をホストしています。私がpip経由でscipy 0.12.0をインストールするまで、すべてがうまくいきました。ここで、djangoアプリをロードしようとすると、サーバーが応答せず、生成された子httpdプロセスがハングしたように見えます。ログ(/ var / logs / httpd / error_log、vhost error.log、およびシステムログ)を調べても、エラーは発生しません。

django manage.pyシェルを介してモデルなどをロードした場合、すべてが正常に機能し、それがmod_wsgiの問題であると思われます。

これをトラブルシューティングする方法について何か考えはありますか?

回答:


22

C拡張モジュールを使用するPythonの一部のサードパーティパッケージ(scipyとnumpyを含む)は、Pythonメインインタープリターでのみ機能し、サブインタープリターではデフォルトでmod_wsgiとして使用できません。その結果、スレッドのデッドロック、不正な動作、またはプロセスのクラッシュが発生する可能性があります。これらの詳細は次のとおりです。

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_API

回避策は、以下を使用して、プロセスのメインインタープリターでWSGIアプリケーションを強制的に実行することです。

WSGIApplicationGroup %{GLOBAL}

同じサーバーで複数のWSGIアプリケーションを実行している場合、一部のフレームワークでは複数のインスタンスを同じインタープリターで実行できないため、デーモンモードを使用して調査を開始する必要があります。これはDjangoの場合です。したがって、デーモンモードを使用して、それぞれが独自のプロセス内にあるようにし、それぞれをそれぞれのデーモンモードプロセスグループのメインインタープリターで強制的に実行します。


こんにちはGrahamさん、mod-wsgiの最新バージョンのコンテキストでこの回答を更新できますか?具体的には、mod_wsgi-expressを使用してapacheを構成した場合、これはデフォルトで問題になるはずですか?生成されたhttpd.confファイルでWSGIApplicationGroupは、使用されません。ただし、ブロックapplication-group=${GLOBAL}には<IfDefine ONE_PROCESS>あり<IfDefine !ONE_PROCESS>ます。生成されたhttpd.confファイルにWSGIDaemonProcessディレクティブが表示されます。それはデフォルトですでにデーモンモードを使用しているということですか?
Kal

mod_wsgi-express start-servermod_wsgi-expressにDjango統合を使用する場合、デフォルトとしてデーモンモードで実行され、メインインタープリターを使用します。したがって、この場合は問題ありません。Apacheを手動で構成する場合は、まだ問題があります。このONE_PROCESS部分は、強制的にデバッグモードにした場合にのみ使用できます。その場合、シングルプロセスの組み込みモードで実行されます。それでもメインインタープリターで実行されます。
Graham Dumpleton 2017

application-group上のオプションは、WSGIScriptAlias使用する代替ですWSGIApplicationGroup
Graham Dumpleton 2017

3

WSGIを構成する私の方法に適合する別のソリューションは、WSGIScriptAlias行を変更することでした。

WSGIDaemonProcess website user=user group=group python-path=/path/to/venv/website:/path/to/venv/lib/python2.7/site-packages
WSGIScriptAlias /website /path/to/venv/website/wsgi.py process-group=website application-group=%{GLOBAL}

<Location /website>
        WSGIProcessGroup website
</Location>

<Directory /path/to/venv/website>
        WSGIScriptReloading On
        <Files wsgi.py>
                Allow from all
                Require all granted
        </Files>
</Directory>

属性に注意してください

process-group=website application-group=%{GLOBAL}

通常は必要ありません


1
WSGIScriptReloadingディレクティブは、デフォルトでオンになっているため、通常はオフにする必要がないため、ドロップできます。WSGIScriptAliasのプロセスグループオプションを使用するため、WSGIProcessGroupディレクティブを削除することもできます。
Graham Dumpleton 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.