2

WSGI を使用して同じサーバーから 2 つの django プロジェクトを提供しようとしていますが、1 つを example.com/ (app1 と呼びましょう) から実行し、もう 1 つを example.com/foo/ (app2) から実行する必要があります。Graham のコメントhereで説明されているように、個別のデーモン プロセスでこれを設定しようとしましたが、パスの 1 つが他のパスのサブディレクトリである場合は機能しないようです。example.com/foo/... に対するすべてのリクエストは、まだ app1 によって処理されています。

2 つのプロジェクトを 1 つに結合する必要なく (これは難しい作業です)、探しているものを達成する方法はありますか?

これは、現在サイト構成にあるものです。

WSGIDaemonProcess app1 \
    python-path=<path for app1's virtualenv>
WSGIDaemonProcess app2 \
    python-path=<path for app2's virtualenv>
WSGIScriptAlias / <path to app1's wsgi.py>
WSGIScriptAlias /foo/ <path to app2's wsgi.py>

<Location />
WSGIProcessGroup app1
</Location>

<Location /foo/>
WSGIProcessGroup app2
</Location>

アップデート:

Location の代わりに LocationMatch を使用して、/foo で始まらないパスへのすべての要求を app1 に委任し、app2 に委任しようとしましたが、何らかの理由で機能しません。現在、/foo/... へのリクエストは、エラー ログに次の行で 500 エラーになります。

mod_wsgi (pid=12032): Exception occurred processing WSGI script '<app1's wsgi.py>'.

何か案は?

上記の下部は次のように変更されました

<LocationMatch "^/(?!foo.*)">
WSGIProcessGroup app1
</LocationMatch>

<LocationMatch "^/foo.*">
WSGIProcessGroup app2
</LocationMatch>

更新 2:

エラー ログをさらに調べたところ、/foo/... への要求は app1 の wsgi.py ファイルによって処理されているように見えますが、app2 の python パスを使用しているため、正しい WSGIProcessGroup ディレクティブが適用されています。したがって、問題は ScriptAlias の衝突にあるようです。/foo... が / に一致しないことを確認するために、このエイリアスを正規表現にすることは可能ですか?

4

2 に答える 2

2

使用する:

WSGIDaemonProcess app1 \
    python-path=<path for app1's virtualenv>
WSGIDaemonProcess app2 \
    python-path=<path for app2's virtualenv>

WSGIScriptAlias /foo <path to app2's wsgi.py>
WSGIScriptAlias / <path to app1's wsgi.py>


WSGIProcessGroup app1

<Location /foo>
WSGIProcessGroup app2
</Location>

WSGIScriptAlias ディレクティブの順序は重要です。最も深くネストされた URL パスが最初に来る必要があります。

この特定の順序の問題は、次のドキュメントに記載されています。

于 2012-12-14T06:17:07.850 に答える
-1

正規表現が解決策であることが判明しました。WSGIScriptAliasMatch は、パスの先頭だけでなく、パスの特定の正規表現に一致させることができます。これにより、明らかに両方のパスが / で始まるため、衝突が発生しました。

後世のために、最終的な構成は次のとおりです。

WSGIDaemonProcess app1 \
    python-path=<path for app1's virtualenv>
WSGIDaemonProcess app2 \
    python-path=<path for app2's virtualenv>
WSGIScriptAliasMatch "^/(?!foo.*)" <path to app1's wsgi.py>
WSGIScriptAlias /foo <path to app2's wsgi.py>

<LocationMatch "^/(?!foo.*)">
WSGIProcessGroup app1
</LocationMatch>

<LocationMatch "^/foo.*">
WSGIProcessGroup app2
</LocationMatch>
于 2012-12-14T05:55:28.147 に答える