web-dev-qa-db-ja.com

HAProxyの背後にあるPassengerを持つNginxは503エラーを引き起こします

先月、私はサーバーの構成、統合、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は、一部の要求を処理するために使用できるサーバーがないと主張するのでしょうか。

私の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とポートはxesに置き換えられます。

P.S.私はこのようなことは得意ではなく、進むにつれて学びます。

更新

siegeを使用してサーバーのベンチマークを行ったところ、約58の同時セッションを実行すると503を再現できることがわかりました。このような場合の成功率はわずか54%です。

アップデート2

503を取得するたびにnginxアクセスログが"-" 400 0 "-" "-" "-"を出力することがわかりました。

アップデート3

Cookieが大きすぎると、nginxは「400BadRequest」エラーを出すと誰もが言っています。ただし、large_client_header_buffersディレクティブを設定しても修正されませんでした。

アップデート4

サーバーでsiegeを実行し、リッスンポートで直接nginxをターゲットにしたところ、nginxは以前の503を返すのと同じパターンで499個のエラーを返し始めました。 Siegeは、それが発生すると接続がタイムアウトしたと私に言い続けます。近づいているようです。

アップデート5

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.

3
Max Chernyak

HAProxyから 構成ガイド サーバー宣言のmaxconnパラメーターを増やす必要があります。

サーバーに「maxconn」パラメーターが指定されている場合、それは同時接続の数が決して多くならないことを意味します。さらに、「minconn」パラメーターがある場合は、バックエンドの負荷に続く動的制限を示します。その場合、サーバーは常に少なくとも接続を受け入れ、それを超えることはありません。バックエンドの接続数が同時未満の場合、制限は両方の値の間のランプになります。これにより、通常の負荷時にサーバーの負荷を制限できますが、例外的な負荷時にサーバーに過負荷をかけることなく、重要な負荷に対してさらにプッシュします。

そこにはalotの良い情報があるので、ドキュメント全体を読むことを強くお勧めします。

1
Zypher