1

フロントエンド Apache サーバーが mod_proxy/AJP を介して Tomcat にリクエストを転送する、かなり標準的な設定をしています。Apache/mod_proxy をセットアップして、Tomcat に最大 N (N=4) の同時要求のみを転送するにはどうすればよいですか? Apache に着信する他の同時要求は拒否されるべきではなく、後で Tomcat に送信されるようにキューに入れられるべきです。

PS 1: これは、属性を使用して Tomcat レベルで実行できることに注意してください。ただしmaxThreads、Apache レベルでこれを処理することを好みます。

PS 2: Apache にはMaxClients構成があり、探していることを実行しているようです。しかし、Apache ごとの MaxClient ではなく、mod_proxy が転送するサーバーごとに MaxClient を設定する方法が明確ではありません。つまり、Apache がリクエストを 4 台の Tomcat マシンのクラスタに転送する場合、Apache が特定の Tomcat に転送される同時リクエストの数を N (たとえば、N=4) に制限するようにします。

4

1 に答える 1

1

解決策は、 ProxyPassディレクティブにパラメーターを追加することによる mod_proxyです。設定したいのはおそらくmaxです。ただし、これはすぐにエラーをスローし、 maxに達したときにリクエストをキューに入れません。

本当にキューに入れたい場合は、mod_proxy_balancer も使用する必要があります。たとえば、最大 4 つの接続を許可します。

ProxyPass / balancer://appservers/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://appservers>
    BalancerMember ajp://192.168.0.100:8009 max=4
    BalancerMember ajp://192.168.0.101:8009 max=4
    BalancerMember ajp://192.168.0.102:8009 max=4
    BalancerMember ajp://192.168.0.103:8009 max=4
</Proxy> 

残念ながら、Apache では、 の値maxはプロセスごとです。したがって、バックエンド サーバーへの接続数を効果的に制限できるのは、Apache に 1 つのプロセスがあり、プロセスではなくスレッドを使用して複数の接続を処理する場合のみです。これは、Apache が使用しているMPMによって異なります。

  • Windows では、 winnt MPMは 1 つのプロセスを使用し、そのプロセスがスレッドを作成してリクエストを処理するため、問題はなく、ほとんどの場合、これについて心配する必要はありません。
  • UNIXで、OS に付属の Apache を使用している場合、残念ながら、リクエストごとに 1 つのプロセスを作成するMPM Apache をプリフォークしている可能性が高く、max パラメータが機能しません。

    1. 使用している MPM を確認するには、 を実行しますapachectl -l
    2. リストにworker.cまたはが表示event.cされている場合は、ほぼ問題ありません。あとは、Apache がプロセスを 1 つだけ作成するようにするだけです。このために、ThreadsPerChildMaxClientsを同じ値に設定します。これは、Apache が処理できる同時接続の合計数になります。またServerLimit、1 に設定します。
    3. リストに が表示されている場合はprefork.c、最初に Apache をワーカーまたはイベント MPM Apache に置き換える必要があります。これを行うには、自分で Apache を再コンパイルするか (MPM は実行時の構成パラメーターではありません)、プラットフォーム用の既存のパッケージを取得します。次に、ステップ 2 に進みます。
于 2011-02-06T19:49:17.820 に答える