概要
AWS ELB(ALB/NLB/CLB)と nginx のタイムアウト設定を一覧化し、対応関係をまとめておく
(すぐ忘れてしまう...orz)
AWS ELB のタイムアウト設定
| 設定項目 | デフォルト | 説明 |
|---|---|---|
| ALB idle timeout | 60秒 | クライアント↔ALB、ALB↔ターゲット双方のアイドル接続の最大時間 |
| ALB request timeout | 60秒 | リクエスト全体の処理時間(HTTP/2 keepalive 含む) |
| ALB connection draining | 300秒 | ターゲット登録解除時の既存接続の保持時間 |
| NLB TCP idle timeout | 350秒 | TCP 接続のアイドル時間(変更不可) |
| NLB UDP idle timeout | 120秒 | UDP フローのアイドル時間(変更不可) |
| CLB idle timeout | 60秒 | フロント・バックエンド両方向のアイドル時間 |
nginx のタイムアウト設定
| 設定項目 | デフォルト | 対象方向 | 説明 |
|---|---|---|---|
| keepalive_timeout | 75秒 | クライアント↔nginx | クライアントとの keep-alive 接続維持時間 |
| client_header_timeout | 60秒 | クライアント→nginx | リクエストヘッダ受信のタイムアウト |
| client_body_timeout | 60秒 | クライアント→nginx | リクエストボディ受信のタイムアウト |
| send_timeout | 60秒 | nginx→クライアント | レスポンス送信時の連続無通信タイムアウト |
| proxy_connect_timeout | 60秒 | nginx→upstream | upstream への接続確立タイムアウト(最大75秒) |
| proxy_send_timeout | 60秒 | nginx→upstream | upstream へのリクエスト送信タイムアウト |
| proxy_read_timeout | 60秒 | upstream→nginx | upstream からのレスポンス読み取りタイムアウト |
| upstream keepalive_timeout | 60秒 | nginx↔upstream | upstream との keep-alive 接続維持時間 |
同じ目的・対応する設定の対応表
| 観点 | AWS ELB 側 | nginx 側 | 備考 |
|---|---|---|---|
| クライアント↔フロント (ALB/nginx) のアイドル | ALB idle timeout (60秒) | keepalive_timeout (75秒) | ALB が前段なら ALB 側で制御 |
| フロント↔バックエンド (ALB→nginx) のアイドル | ALB idle timeout (60秒) | keepalive_timeout (75秒) | nginx の keepalive_timeout > ALB idle timeout にすべき |
| アプリ応答待ち | ALB request timeout (60秒) | proxy_read_timeout (60秒) | バックエンド処理時間に依存 |
| コネクション確立 | (ELB 側は内部処理) | proxy_connect_timeout (60秒) | nginx→upstream の TCP 接続確立 |
| デプロイ時の接続維持 | connection draining (300秒) | (nginx は graceful shutdown) |
nginx -s quit に相当 |
構成パターン別の注意点
「ALB → nginx (リバプロ) → アプリ」構成の場合
-
ALB idle timeout (60秒) < nginx の keepalive_timeout (75秒以上推奨)
- 逆だと nginx 側から先に FIN を送り、ALB が再利用した接続で 502 エラーが発生する
-
nginx の proxy_read_timeout ≥ ALB request timeout
- バックエンドの応答待ち時間を ALB より長めに設定する
-
NLB を使う場合は idle timeout が 350秒固定
- nginx keepalive_timeout を 350秒より長く(例: 360秒)設定する
長時間処理がある場合
ファイルアップロードやレポート生成など長時間処理がある場合は、以下を揃えて引き上げる必要がある。
- ALB idle timeout
- nginx の proxy_read_timeout
- アプリ側のタイムアウト
基本原則
上流(クライアント側)のタイムアウトを短く、下流(バックエンド側)のタイムアウトを長く設定することで、切断のきっかけが必ず上流側から発生するようにする。