Nginx ヘルスチェック設定
Nginxでパッシブおよびアクティブヘルスチェックを設定し、障害が発生したバックエンドサーバーを自動検出してトラフィックを迂回させ、高可用性を実現する方法を解説。
詳細な説明
ヘルスチェックにより、Nginxはバックエンドサーバーが異常な状態を検出し、回復するまで自動的にトラフィック送信を停止できます。マルチサーバーの本番環境でアプリケーションの可用性を維持するために重要な機能です。
パッシブヘルスチェック(オープンソース版)
オープンソース版のNginxはパッシブヘルスチェックをサポートし、実際のクライアントリクエストの結果を監視してバックエンドの障害を検出します:
upstream backend {
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.1.12:8080 backup;
}
fail_timeout ウィンドウ内で max_fails 回連続の失敗レスポンスが蓄積されると、Nginxはそのサーバーをタイムアウト期間の残りの間利用不可とマークします。タイムアウト後、Nginxはサーバーが回復したかを確認するため試験的に1つのリクエストを送信します。
障害条件の定義
デフォルトでは、Nginxは接続エラーまたはタイムアウトを「障害」とみなします。proxy_next_upstream ディレクティブで特定のHTTPエラーステータスコードを含むよう定義を拡張できます:
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_502 http_503;
proxy_next_upstream_tries 2;
proxy_next_upstream_timeout 10s;
}
この設定では、現在のサーバーが500、502、503エラーを返した場合、10秒以内に最大2回まで次の利用可能なサーバーで自動的にリトライします。
アクティブヘルスチェック(Nginx Plus)
Nginx Plusはオープンソース版を拡張し、クライアントトラフィックとは独立してバックエンドサーバーを定期的にプローブするアクティブヘルスチェックを提供します:
upstream backend {
zone backend 64k;
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
location / {
proxy_pass http://backend;
health_check interval=5s fails=3 passes=2 uri=/health;
}
アクティブチェックは5秒ごとに専用のヘルスエンドポイントに合成リクエストを送信します。3回連続の失敗でサーバーがダウンとマークされ、2回連続の成功で復旧されます。パッシブ監視より高速な検出を提供します。
DIYアクティブヘルスチェック
オープンソース版では、外部スクリプトでバックエンドを定期的にプローブし設定を更新する基本的なアクティブヘルス監視を実装できます:
#!/bin/bash
for server in 10.0.1.10 10.0.1.11; do
if ! curl -sf "http://$server:8080/health" > /dev/null; then
echo "Server $server is unhealthy"
fi
done
nginx -s reload
ヘルスチェックエンドポイントの設計
ヘルスチェックエンドポイントは、プロセスが実行中であることだけでなく、実際にトラフィックを処理する準備ができているかを検証するよう設計してください。データベース接続、必要な外部サービスの可用性、十分なディスク容量を確認します。完全に正常な場合は200を、リクエストを適切に処理できない場合は503を返します。
監視の統合
Nginxのヘルスチェックを PrometheusやGrafanaなどの外部監視ツールと組み合わせます。Nginxのstub statusモジュールを有効にして、アクティブ接続数、リクエストレート、アップストリーム応答時間のメトリクスをエクスポートし、包括的な可観測性を実現してください。
ユースケース
複数のサーバーで高可用性アプリケーションを運用し、手動介入なしにNginxが障害の発生したバックエンドを自動的に検出しトラフィックを迂回させる必要があります。