• システム開発に関わる内容をざっくりと書いていく

IIS / Kestrel 502 / 503 のざっくり切り分け

ASP.NET Core を IIS の裏で動かしていると、502.3503 が突然出ることがある。アプリ例外というより「ゲートウェイ/プロセス側」の失敗であることが多い。

先に結論

  • 502 … IIS(ANCM)が Kestrel と話せない/応答待ちで切れた
  • 503 … アプリプール停止・起動失敗・過負荷で受け付けられない
  • まず Event Viewer・stdout ログ・アプリプール状態を見る
  • コードの NullReference だけ見ていても終わらないことが多い

502 のよくある型

  • 起動失敗(依存欠落・設定ミス・ポート衝突)で Kestrel が上がらない
  • 起動はするが最初の要求で落ちる(DI 未登録など)
  • ANCM の requestTimeout 超過(遅い処理・デッドロック待ち)
  • web.config の processPath / arguments ミス

503 のよくある型

  • アプリプールが Stopped / 連続失敗で無効化
  • 同時接続・キュー溢れ
  • デプロイ中のリサイクルと要求がぶつかる

切り分け手順

  1. IIS マネージャでサイト/プールの状態を確認
  2. stdoutLogEnabled で起動ログを取る(失敗理由がそのまま出ることが多い)
  3. Windows イベントログ(Application)の .NET Runtime / IIS AspNetCore Module を見る
  4. 同じマシンで dotnet アプリ.dll を直接起動して単体確認
  5. 遅いならタイムアウト設定と DB/外部依存の詰まりを疑う

対策の型

  • 起動時検証(設定・DI)を有効にして「落ちるなら起動で落とす」
  • ヘルスチェック/ウォームアップでリサイクル直後の 502 を減らす
  • 長い処理は非同期化・タイムアウト見直し(闇雲な延長は最後)
  • デプロイはアトミック(ロック付きコピーやスロット入れ替え)

関連: EF Core DbUpdateException(DB 起因で応答が返らずゲートウェイが切れるケース)

ざっくりまとめ

  • 502=前段とアプリの会話失敗、503=受け付けられない状態
  • stdout とイベントログが最短ルート
  • アプリ例外ログだけでは足りないことが多い

関連記事