nginxのロードバランサに割り当てたバックエンドのサーバがダウンしていることは、タイムアウトで判定される。タイムアウトする時間は以下のパラメータで調整できる。
- proxy_connect_timeout 接続自体のタイムアウト
- proxy_send_timeout バックエンドサーバへのデータ送信をタイムアウトする時間
- proxy_read_timeout バックエンドサーバからデータを受信をタイムアウトする時間
長く設定すると、タイムアウトの検出が遅れるが、短く設定すると誤検知が増える。
仮にタイムアウトが誤検知されると、最初のバックエンドにも、次のバックエンドにもPOSTが送信され、複数のサーバで同じリクエストを多重に処理してしまうことがある。そのため、バックエンドは、誤検知を避けるより、同じPOSTを複数受けても状態が変わらないように設計しておく必要がある。
タイムアウトの処理は、fail_timeoutで指定した時間内にmax_failsの回数だけタイムアウトすると、fail_timeoutで指定した時間のあいだ、そのサーバにはアクセスしないようになる。
適当に設定ファイルを書くと以下のような形になる。
upstream backend { server express1:3000 max_fails=1 fail_timeout=60s; server express2:3000 max_fails=1 fail_timeout=60s; server express3:3000 max_fails=1 fail_timeout=60s; } server { listen 80 default_server; location / { proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_pass http://backend; } }
これでnginxを使ってバックエンドサーバの冗長化構成を組むことができる。 ただし、nginx自体の冗長化については別途検討が必要である。