web-dev-qa-db-ja.com

1つの仮想ホスト上の複数のmod_wsgiアプリが間違ったアプリにリダイレクトする

2つ(またはそれ以上)を取得しようとしていますDjangoアプリケーションが同じドメインのサブディレクトリに設定されています。例:

http://example.com/site1/
http://example.com/site2/

これは通常、次のようにApache仮想ホストを設定することで正常に機能します。

<VirtualHost *:80>
    ...
    WSGIScriptAlias /site1 /path/to/site1.wsgi
    WSGIScriptAlias /site2 /path/to/site2.wsgi
</VirtualHost>

これで、各サイトが個別に機能することを確認しました。しかし、両方を並行して実行しようとすると、Apacheはワーカープロセスが最初にロードしたサイトに送信します。例:

  1. 6つのスレッドを提供するように構成されたApacheを再起動します。
  2. Example.com/site1/を読み込み、正しいページを取得します
  3. Example.com/site2/を読み込み、正しいページを取得します
  4. 2と3をさらに2回繰り返します。
  5. Example.com/site1/を繰り返し更新し、サイト間を循環する様子を確認します。

実際には、ワーカープロセスの任意の数について、WSGIScriptAliasディレクティブに関係なく、最初にヒットしたプロセスにリクエストを送信するプロセスの総数を循環します。私が何をしても(WSGIProcessGroup、デーモンモードと組み込みモードのどちらを設定するか、ディレクティブを設定しても)、この動作が続きます。

私がここで間違っていることを誰かが指摘できれば、それは驚異的です!

44
Gabriel Hurley

私は単一のApacheインストールで複数のWSGIアプリを実行していて、最も簡単なことは、複数のプロセスグループ(アプリごとに1つ)を用意することです。

1つの欠点は、実際に単一のプロセスで両方(またはそれ以上)のアプリを実行しようとするのではなく、常駐メモリを使用する可能性があることです。しかし、それはそれらをかなりうまく分離し続けて、面倒を避けます。そして、それはあなたにとっては問題ではないかもしれません(私にとってはそうではありませんでした)。

(それはそれほど悪くないかもしれません、彼らは多くのテキストページを共有することができるかもしれませんか?それは単なるアイドルの推測です;私の設定はまったくメモリ不足ではなかったので、私はこれをどのようにも確認していません)

ここに私のhttpd.confのいくつかのスニペットがあります、およそ:

WSGIDaemonProcess khdx_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /khdx /home/galdosd/khdxweb/rel/khdx/Apache/Django.wsgi
<Location /khdx>
WSGIProcessGroup khdx_wsgi
</Location>

WSGIDaemonProcess sauron_wsgi user=galdosd group=galdosd maximum-requests=10000
WSGIScriptAlias /sauron /home/galdosd/finalsauronweb/Django-root/Apache/Django.wsgi
<Location /sauron>
WSGIProcessGroup sauron_wsgi
</Location>
54
Domingo Ignacio

ドミンゴイグナシオの答えは私を正しい軌道に乗せました。それを機能させることについての重要な事実を指摘したいと思います。2つのプロセスグループはsame VirtualHost内にある必要があります。 (これは、Ubuntu 12.04.3 LTS、Apache 2.2.22、およびPythonで書かれたいくつかのWSGIアプリでの私のテストに基づいています。)

たとえば、これはnotで機能し、app1にアクセスできましたが、app2には404エラーが発生しました。

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>
</VirtualHost>

<VirtualHost *>
        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>

中央とタグを削除して、VirtualHostを1つにすることで問題を解決しました。

<VirtualHost *>
        WSGIDaemonProcess app1 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app1 /app1/app1.wsgi

        <Location /app1>
                WSGIProcessGroup app1
        </Location>

        WSGIDaemonProcess app2 user=someuser group=somegroup threads=5
        WSGIScriptAlias /app2 /app2/app2.wsgi

        <Location /app2>
                WSGIProcessGroup app2
        </Location>
</VirtualHost>
13
Steve Saporta

私自身、これで問題が発生しました。 Apacheの設定を正しくする代わりに、単一のWSGIScriptAliasを使用して、リクエストを正しいアプリケーションにルーティングするWSGIミドルウェアを用意することにしました。私のコードは https://github.com/zhemao/flotilla にあります。私はそれをあまりテストしていませんので、注意して使用してください。

1
Zhehao Mao