Solaris x86ボックスのTomcatの前でhaproxyを実行しようとしていますが、断続的にエラーが発生します。一見ランダムな間隔で、haproxyが接続をタイムアウトするまでリクエストはハングします。
自分のアプリかもしれないと思っていたのですが、Tomcatマネージャーアプリで再現できて、Tomcatを直撃しても全く問題ありません。
カールで繰り返し叩くと、10〜15回以内にエラーが発生します
curl -ikL http://admin:admin@<my server>:81/manager/status
haproxyはポート81で実行され、Tomcatはポート7000で実行されます。haproxyはクライアントに504ゲートウェイタイムアウトを返し、これをログファイルに入れます。
Sep 7 21:39:53 localhost haproxy[16887]: xxx.xxx.xxx.xxx:65168 [07/Sep/2009:21:39:23.005] http_proxy http_proxy/Tomcat7000 5/0/0/-1/30014 504 194 - - sHNN 0/0/0/0/0 0/0 "GET /manager/status HTTP/1.1"
Tomcatは何も表示せず、ログにエラーも表示されず、要求がTomcatサーバーに到達したことを示すものもありません。リクエスト数は増加しません。マネージャーアプリは1つのスレッドでのみアクティビティを表示し、マネージャーアプリを提供します。
これが私のhaproxyとTomcatコネクタの設定です。私は両方とも問題を追跡しようとかなり遊んでいるので、理想的ではないかもしれませんが、間違いなくこのエラーを引き起こすとは思われません。
server.xml
<Connector
port="7000" protocol="HTTP/1.1"
enableLookups="false" maxKeepAliveRequests="1"
connectionLinger="10"
/>
haproxy config
global
log loghost local0
chroot /var/haproxy
listen http_proxy :81
mode http
log global
option httplog
option httpclose
clitimeout 150000
srvtimeout 30000
contimeout 3000
balance roundrobin
cookie SERVERID insert
server Tomcat7000 127.0.0.1:7000 cookie server00 check inter 2000
Tomcatが完全なガベージコレクションを一時停止していると思われます。そのため、Tomcatは応答もログも記録していません。この問題の詳細については、 ここ を参照してください。
さて、何が起こっているのかを理解するために、haproxyとnetcatの間でtcpdumpを実行する必要があります。 Haproxyは、応答が得られなかったと述べています。これについては議論の余地がありますが、接続して要求を送信したことは明らかです。そうでない場合、ヘッダーを待つことができませんでした。少なくともhaproxyのバグを受け入れて応答がタイムアウトする可能性があるため、Tomcatが着信要求を認識しないという事実は問題ですが、Tomcatはそれを考慮しないため、応答する理由がないと言っています。リクエストがありました。 Tomcat自体にバグがあるか、ネットワークに何か奇妙なものがあります(同じIP上の2つのサーバー?)。少なくとも、接続と要求を受信したことが通知されるはずです。 Tcpdumpはそれを非常に簡単に分類します。また、どのバージョンのhaproxyを実行していますか? 1.3.16と1.3.19の間のバージョンにはいくつかの問題があり、その中で最後の応答パケットでランダムなタイムアウトが発生しました(ただし、Tomcatは応答しなかったと言っていますが、とにかく修正したほうがよいです)。
ウィリー
Haproxy統計サーバーをオンにすると、追加情報がデバッグに役立つ場合があります