0

編集:WSGIDaemonProcessの「プロセス」を削除した後、動作するようになりました

私はメモリ使用量の問題を抱えていて、dozer と呼ばれる wsgi ミドルウェアを使用してメモリ リークの可能性を監視したいと考えていました: http://pypi.python.org/pypi/Dozer

Apache エラー ログは次のとおりです。

AssertionError: Dozer ミドルウェアはマルチプロセス環境では使用できません

wsgi.py のコード スニペットは次のとおりです。

from django.core.wsgi import get_wsgi_application
from dozer import Dozer
application = get_wsgi_application()
application = Dozer(application)

このコードはすべて manage.py のシェルで実行され、エラーはありませんでした。

表示される具体的なエラーは次のとおりです。

サーバーで内部エラーまたは構成ミスが発生したため、リクエストを完了できませんでした。サーバー管理者 [アドレスなし] に連絡して、エラーが発生した時刻と、エラーの原因となった可能性のある操作を知らせてください。このエラーの詳細については、サーバー エラー ログを参照してください。

インストールされたドーザーの卵は最新 (python 2.7) です。おそらく、このようなもののためにサーバーを特別に構成する必要がありますか?

これが私のwsgi設定です:

ServerRoot "/path/django/apache2"
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so

KeepAlive Off
Listen 28861
MaxSpareThreads 3
MinSpareThreads 1
ServerLimit 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
WSGIDaemonProcess django threads=12 python-path=/path/django:/path/django/DareHut:/path/django/lib/python2.7
WGIProcessGroup django
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIScriptAlias / /path/django/DareHut/DareHut/wsgi.py

私は何をすべきか?ありがとう

4

2 に答える 2

3

mod_wsgi 構成を Apache から投稿し、以下を読みます。

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

それが機能するためには、マルチプロセス構成を使用できません。

これは、UNIX システムで mod_wsgi 組み込みモードを使用できないことを意味します。

デーモンモードを使用する場合でも、デーモンプロセスグループ内のプロセスが 1 つのみの構成を使用する必要があります。

ただし、それを行うには注意事項があります。これを行うために、WSGIDaemonProcess に 'processes=1' オプションを使用しないでください。「プロセス」オプションを完全に省略して、デフォルトで単一のプロセスにする必要があります。

'processes' オプションを使用すると、'wsgi.multiprocess' に True のフラグが立てられ、Dozer が文句を言います。そのフラグをトリガーする値が「1」であっても、そのオプションを使用することは設計によるものであるため、複数の Apache サーバー間で負荷を分散するときに、単一のプロセスであっても、サーバーにマルチプロセス配置の一部としてフラグを立てることができます。

だから使用:

WSGIDaemonProcess mygroup
WSGIProcessGroup mygroup

「processes」オプションを使用したか、WSGIProcessGroup を忘れて、実際にはデーモン モードではなく組み込みモードで誤って実行している可能性があります。

ところで、ブラウザのタブ ラベルに「200 エラー」と表示されている場合は、mod_wsgi 3.4 の小さなバグです (それを使用している場合)。返される HTTP ステータス コードは依然として 500 であるため、すべてが適切に解釈されますが、mod_wsgi はステータス ラインを適切にクリアしていないため、Apache はそれを独自の 500 ステータス ラインに置き換え、ステータス ラインはタブで使用されます。ラベルが間違っています。

于 2012-10-05T21:40:02.847 に答える
1

を使用してローカルで実行しますmanage.py runserver

Dozer ( pdbまたは IDE を使用) のブレークポイントを、 の先頭Dozer.__init__や の先頭など、いくつかの戦略的な場所に配置しDozer.__call__ます。Dozerで定義されていdozer/leak.pyます。

例外がスローされるまでステップスルーします。

簡単な答えではありませんが、問題は見つかります。

于 2012-10-05T17:07:32.550 に答える