問題の概要
URLにアクセスしてホームページが表示されるのを期待した際、無機質な Service Unavailable メッセージが表示されることがあります。IISにおいて、これはほぼ間違いなくアプリケーションプールがクラッシュしたか停止していることを意味します。手動で開始しても、ページを更新した瞬間に再び停止してしまうこともあります。
分析:なぜ503エラーが発生するのか
503ステータスコードは、「ページ」のエラーではなく「サービス」のエラーです。IIS環境では、HTTP.sysドライバがリクエストを受信しますが、それを処理するためのアクティブなワーカープロセス(w3wp.exe)が見つからない場合に発生します。これにはいくつかの特定の理由があります:
- 資格情報の期限切れ: 企業環境では、サービスアカウントのパスワードが30〜90日ごとに変更されます。アプリケーションプールの識別子(Identity)が更新されていない場合、ログインに失敗します。
- 急速失敗保護(Rapid-Fail Protection): デフォルトでは、5分間に5回アプリがクラッシュすると、IISはCPUリソースを保護するためにプールを強制停止します。
- ランタイムの不足: コードの実行に ASP.NET Core Hosting Bundle が必要であるにもかかわらず、.NET Runtime しかインストールされていない場合などです。
- フォルダへのアクセス権限: サービスアカウントに、Webサイトの物理パスに対する「読み取り」権限が不足している場合に発生します。
ステップ1:識別子のリセット
503エラーの約70%は資格情報の問題が原因です。ドメインアカウントや特定のローカルユーザーを使用している場合、最近のパスワード変更によりサイトが即座にダウンします。
- IIS マネージャーを起動します。
- 左側のナビゲーションからアプリケーション プールを選択します。
- 対象のプールを右クリックし、詳細設定を選択します。
- プロセス モデルセクションにある識別子の行を探します。
- カスタムアカウントを使用している場合は、**設定...**をクリックし、更新されたパスワードを入力します。
- プールを再起動し、サイトを更新して確認します。
ステップ2:イベントビューアーの確認
推測はやめて、ログを確認しましょう。Windowsはプロセスが開始できなかった正確な理由を記録しています。これは試行錯誤するよりもはるかに迅速です。
Win + Rキーを押し、eventvwr.mscと入力して実行します。- Windows ログを展開し、システムを選択します。
- ソースを WAS (Windows Process Activation Service) でフィルタリングします。
- イベント ID 5021(無効な識別子)または 5059(アプリケーションプールの失敗)を探します。
# 一般的なエラーログの例:
アプリケーション プール 'ProductionPool' は無効にされました。
Windows プロセス アクティブ化サービス (WAS) でエラーが発生しました。
ステップ3:急速失敗保護のサイクルを解除する
IISはサーバーを「クラッシュループ」から保護します。起動直後にアプリがクラッシュする場合、IISは数回の試行後に停止します。根本的なコードエラーを確認するには、一時的にこのセーフティネットを無効にする必要があります。
- アプリケーションプールの詳細設定を開きます。
- 急速失敗保護セクションまでスクロールします。
- 有効を
Falseに変更します。 - プールをリサイクル(再起動)します。これでサイトは「開始」状態を維持し、バグのあるコードや不足しているDLLを特定するための詳細な 500.xx エラーが表示されるようになります。
ステップ4:フォルダ権限の修正
アプリケーションプールには有効なログインだけでなく、Webフォルダに対する「読み取りと実行」権限が必要です。ApplicationPoolIdentity を使用している場合でも、ファイルへの特定のアクセス権が必要です。
# PowerShellを使用して特定のアプリケーションプールに権限を付与する
icacls "C:\inetpub\wwwroot\my-app" /grant "IIS AppPool\MyPoolName:(OI)(CI)(RX)"
ステップ5:ポートの競合を確認する
他のアプリケーションがポート80または443を使用している可能性があります。503エラーでは稀ですが、NginxやApacheのようなプロキシが同じマシンで動作し、IISとトラフィックを奪い合っている場合に発生することがあります。
# ポート80でリスニングしているプロセスを確認する
etstat -ano | findstr :80
# 最後の列のPIDを使用してプロセス名を特定する
tasklist /fi "pid eq [YOUR_PID]"
修正の確認
HTTPヘッダーを確認して修正を確定します。ブラウザのキャッシュ問題を避けるため、コマンドラインツールを使用してください。
- アプリケーションプールを手動で開始します。
- 次のコマンドを実行します:
curl -I http://localhost/ - 修正が成功していれば
HTTP/1.1 200 OKが返されます。 - 5分間待ちます。プールがまだ動作していれば、急速失敗保護の問題も解決されています。

