55

Tomcat6とApachemod_proxy2.2.3でWebアプリを実行しています。このような502のエラーがたくさん見られます:

悪いゲートウェイ!プロキシサーバーがアップストリームサーバーから無効な応答を受信しました。

プロキシサーバーはリクエストGET/the/page.doを処理できませんでした。

理由:リモートサーバーからの読み取り中にエラーが発生しました

これがサーバーエラーであると思われる場合は、ウェブマスターに連絡してください。

エラー502

Tomcatにはたくさんのスレッドがあるので、スレッドに制約はありません。アプリに対してJMeter経由で2400人のユーザーをプッシュしています。すべてのボックスは、高速でアンロードされたネットワークのファイアウォールの内側にあるため、ネットワークに問題はありません。

誰かが見たり試したりすることについて何か提案がありますか?次にtcpdumpに向かいます。

UPDATE 10/21/08:まだこれを理解していません。負荷がかかっている状態でこれらのごく少数しか見られません。以下の答えは魔法の答えを提供していません...まだ。:)

4

10 に答える 10

47

いくつかの特定の設定を追加するためだけに、同様の設定を行いました (Tomcat 5.0.27 への Apache 2.0.63 リバース プロキシを使用)。

特定の URL では、Tomcat サーバーがページを返すのにおそらく 20 分かかる場合があります。

最終的に、Apache 構成ファイルの次の設定を変更して、プロキシ操作でタイムアウトしないようにしました (Tomcat がページを返すのに時間がかかった場合に備えて、オーバー スピル要因が大きくなります)。

Timeout 5400
ProxyTimeout 5400

いくつかの背景

ProxyTimeoutだけでは十分ではありませんでした。Timeoutのドキュメントを見ると、Apache が Tomcat からの応答を待っている間、Apache とブラウザ (または http クライアント) の間でトラフィックが流れていないためだと思います (よくわかりません) Apache はブラウザへの接続を閉じます。

タイムアウト設定をデフォルト (300 秒) のままにしておくと、Tomcat へのプロキシされたリクエストが応答を取得するのに 300 秒以上かかる場合、ブラウザに「502 プロキシ エラー」ページが表示されることがわかりました。このメッセージは、ブラウザへの接続を閉じる前に、Apache がリバース プロキシとして機能していることを認識して、Apache によって生成されたものだと思います (これは私の現在の理解です - 欠陥がある可能性があります)。

プロキシエラーページには次のように書かれています:

プロキシ エラー

プロキシ サーバーがアップストリーム サーバーから無効な応答を受け取りました。プロキシ サーバーがリクエスト GET を処理できませんでした。

理由: リモート サーバーからの読み取りエラー

...これは、短すぎるのは ProxyTimeout 設定であることを示唆していますが、調査の結果、Apache のタイムアウト設定 (Apache とクライアント間のタイムアウト) もこれに影響していることが示されています。

于 2010-03-05T16:59:00.510 に答える
15

だから、ここで私自身の質問に答えます。最終的に、Tomcatスレッドのタイムアウトが原因でロードバランサーに502および503エラーが発生していると判断しました。短期的には、タイムアウトを増やしました。長期的には、最初にタイムアウトを引き起こしていたアプリの問題を修正しました。ロードバランサーでTomcatのタイムアウトが502および503エラーとして認識されていた理由は、まだ少し謎です。

于 2008-12-01T15:30:52.560 に答える
12

proxy-initial-not-pooled を使用できます

http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.htmlを参照してください:

この変数が設定されている場合、クライアント接続が初期接続である場合、プールされた接続は再利用されません。これにより、プロキシによる接続チェックの後、プロキシによって送信されたデータがバックエンドに到達する前に、バックエンド サーバーがプールされた接続を閉じたという競合状態によって発生する「proxy: error reading status line from remote server」エラー メッセージが回避されます。この変数を設定すると、特に HTTP/1.0 クライアントのパフォーマンスが低下することに注意してください。

私たちもこの問題を抱えていました。追加して修正しました

SetEnv proxy-nokeepalive 1
SetEnv proxy-initial-not-pooled 1

keepAliveすべてのサーバーの電源をオフにします。

mod_proxy_http はほとんどのシナリオで問題ありませんが、重い負荷で実行しているため、理解できないタイムアウトの問題がまだいくつかあります。

ただし、上記のディレクティブがニーズに合っているかどうかを確認してください。

于 2009-08-17T12:23:42.097 に答える
4

Apache conf のサンプル:

#Default value is 2 minutes
**Timeout 600**
ProxyRequests off
ProxyPass /app balancer://MyApp stickysession=JSESSIONID lbmethod=bytraffic nofailover=On
ProxyPassReverse /app balancer://MyApp
ProxyTimeout 600
<Proxy balancer://MyApp>
    BalancerMember http://node1:8080/ route=node1 retry=1 max=25 timeout=600
    .........
</Proxy>
于 2009-12-03T05:58:01.630 に答える
3

mod_proxy_http (またはプロキシ バランサー) を使用していると思います。

Tomcat のログ (localhost.log、または catalina.log) を調べてください。Web スタックで例外が発生し、Tomcat ワーカーが接続されているソケットが閉じられている可能性があります。

于 2008-10-04T03:17:01.673 に答える
2

この問題は、タイムアウトと proxyTimeout パラメータを 600 秒に設定することで解決できるはずです。しばらく戦った後、それは私のために働いた。

于 2012-02-06T15:17:24.023 に答える
1

ほとんどの場合、apache confのTimeoutパラメーターを増やす必要があります(デフォルト値は120秒)。

于 2009-12-02T11:16:55.893 に答える