先月、私はサーバーの構成、統合、AWSなどについて多くのことを学ぶことを余儀なくされました。私はこれまでこれらを行ったことがありません。
私は自分のアプリですべてを正常に稼働させました(主に http://github.com/wr0ngway/rubber gemと#rubberec2 IRC channel)の助けに感謝します)。しかし、私は(私にとって)不思議な問題に直面しています。
HAProxyの背後でNginx + Passengerを実行しています。これまでのところ、使用されているNginx + Passenger Hostは1つだけなので、HAProxyはまだあまり機能していませんが、将来的にはさらにアプリサーバーを追加する予定です。
1日の特定の時間(負荷が高いとき?)に迷惑になるときどき503エラーが発生します。これらのエラーは、静的アセットとルーティングされたURLの両方で発生しています。ページとそのヘッダーは/etc/haproxy/errors/503.httpにあるものと同じであるため、それらをスローするのはHAProxyであると判断しました。
Nginxは、受信するリクエストの数を気にせず、独自のキューを持ち、乗客が正しく配信するため、すべてを処理できると思いました。では、なぜHAProxyは、一部の要求を処理するために使用できるサーバーがないと主張するのでしょうか。
global
log 127.0.0.1 local0 warning
maxconn 1024
defaults
log global
mode http
retries 3
balance roundrobin
option abortonclose
option redispatch
option httplog
contimeout 4000
clitimeout 150000
srvtimeout 30000
listen passenger_proxy x.x.x.x:x
option forwardfor
server web01 web01:xxxx maxconn 20 check
注:IPとポートはx
esに置き換えられます。
P.S.私はこのようなことは得意ではなく、進むにつれて学びます。
siege
を使用してサーバーのベンチマークを行ったところ、約58の同時セッションを実行すると503を再現できることがわかりました。このような場合の成功率はわずか54%です。
503を取得するたびにnginxアクセスログが"-" 400 0 "-" "-" "-"
を出力することがわかりました。
Cookieが大きすぎると、nginxは「400BadRequest」エラーを出すと誰もが言っています。ただし、large_client_header_buffers
ディレクティブを設定しても修正されませんでした。
サーバーでsiege
を実行し、リッスンポートで直接nginxをターゲットにしたところ、nginxは以前の503を返すのと同じパターンで499個のエラーを返し始めました。 Siegeは、それが発生すると接続がタイムアウトしたと私に言い続けます。近づいているようです。
Nginxがシステムの2つの場所にログインしていて、包囲攻撃で「接続がタイムアウトしました」と表示されるたびにこのメッセージを返すエラーログがあったことに気付きました。
file=ext/nginx/HelperAgent.cpp:574 time=2011-09-15 07:43:22.196 ]: Couldn't forward the HTTP response back to the HTTP client: It seems the user clicked on the 'Stop' button in his browser.
HAProxyから 構成ガイド サーバー宣言のmaxconn
パラメーターを増やす必要があります。
サーバーに「maxconn」パラメーターが指定されている場合、それは同時接続の数が決して多くならないことを意味します。さらに、「minconn」パラメーターがある場合は、バックエンドの負荷に続く動的制限を示します。その場合、サーバーは常に少なくとも接続を受け入れ、それを超えることはありません。バックエンドの接続数が同時未満の場合、制限は両方の値の間のランプになります。これにより、通常の負荷時にサーバーの負荷を制限できますが、例外的な負荷時にサーバーに過負荷をかけることなく、重要な負荷に対してさらにプッシュします。
そこにはalotの良い情報があるので、ドキュメント全体を読むことを強くお勧めします。