私は、時々ajaxリクエストがある静的なHTMLページで主に構成されるサイトを持っています。サイトはApacheで実行されており、ajaxはTomcatによって処理されます。
Tomcatの応答が遅くなった場合(Javaがデータベースサーバーに接続できない、または何らかの理由でリクエストの処理に時間がかかる)-サイト全体がダウンします。すべての静的HTMLページの読み込みに非常に長い時間がかかります(同じです)画像、CSS、JS)。
ここで、Tomcatを手動で停止しただけでは、すべてが正常に機能しています。サイトは高速で応答性が高く、ajaxリクエストだけが機能していません。
応答の遅いTomcatがすべてのApacheリソースを使用しないようにするにはどうすればよいですか?したがって、静的ページはTomcatで何が起こっていても常に機能しますか?応答性の高いhtmlページは、私の場合、ajaxを機能させないことよりもはるかに重要です。
httpd.conf:
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule prefork.c>
StartServers 16
MinSpareServers 10
MaxSpareServers 40
ServerLimit 512
MaxClients 512
MaxRequestsPerChild 4000
</IfModule>
workers.properties
worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000
server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8081" />
<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100" maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
何らかの理由でTomcatがajaxリクエストを高速に処理しない場合、Apacheが処理できるリクエストの数が減少します。 Tomcatは400リクエストを並行して処理するように設定されており、デフォルトのacceptCount
には100もあります。そのため、Tomcatは500リクエストを消費できます。 。
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000
..tells mod_jkは、ソケット操作で約1.7日(socket_timeoutは秒単位)、Tomcatからの単一ネットワークパケットで2分間待機します。 Tomcatが遅い場合にmod_jkができるだけ早くエラーを返すように、これらの値を調整する必要があります。
Ajaxリクエストが通常2秒以内の外れ値で1秒以内に処理されると仮定します。 beeingが処理された後、応答はすぐに返送されます。次にworker.worker1.reply_timeout=2500
を設定できます。 socket_timeout
は大まかな値なので、省略されることもあります。 socket_connect_timeout
は、Apache/mod_jkからTomcatに接続するのにかかる時間を定義し、worker.propertiesに追加して、非常に低い値に設定する必要があります。 100.両方が同じサーバー上にあるため。詳細は Apache Tomcat Connector -Reference を参照してください。
ApacheからTomcatに送信されるすべてのリクエストは、MaxClients
in httpd.confで構成したものをカウントします。 Tomcatでスタックされる要求が多いほど、静的コンテンツのApacheによる処理が少なくなる可能性があります。その状況でTomcatをシャットダウンすると、静的コンテンツが再び高速で配信されます。これにより、mod_jkおよびApacheでのリクエスト処理のためにリソースが解放されます。
Httpd.confでprefork.c
とworker.c
を同時に設定しました。 MaxClients
が512に設定されているので、prefork.c
がアクティブだと思います。これは、あなたの観察と私の解釈に一致します。;-)
Tomcatへの長時間実行されるリクエストを早期に中止するようmod_jkに指示することは大きな助けになるかもしれませんが、Apacheが処理するクライアントリクエストの数(MaxClients
)とTomcatが処理するリクエストの数(<connector maxThreads=...
)並列。これらの数値は、通常の操作中に何が起こるかとバランスを取る必要があります。ページの読み込みを追跡すると、これらの値の比率を確認するのに役立ちます。絶対値は、サーバーの仕様、ネットワークの状況、クライアントの数などによって異なります。
可能な並列リクエストの絶対数が少なすぎると、サーバーの処理能力が不足しているのに、ページの読み込みが遅いことに不満が出ます。それが高すぎる場合、実際に必要なメモリより多くのメモリを使用し、速度が低下するだけでなく、サブシステムの問題から迅速に回復できません。データベース。 Apacheが時間内に処理するよりもはるかに多くの要求をTomcatに送信すると、一部の要求がタイムアウトになる一方で、他の要求は許容時間内に処理されることがわかります。 ApacheとTomcatで同様の値を使用して開始することは、タイムアウト設定により、遅いまたは応答しないTomcatがApacheの首の障害となることがない限り、問題ありません。
ワーカーを1つだけ定義したようです。つまり、Apacheはその1つのインスタンスを介してのみTomcatと通信できます。通常のJK構成には8〜16個のワーカーが含まれます。ダウンロードできるデフォルトのJK構成ファイルを見てください。