IT用語集

500エラーとは? 10分でわかりやすく解説

水色の背景に六角形が2つあるイラスト 水色の背景に六角形が2つあるイラスト
アイキャッチ
目次

UnsplashMarkus Spiskeが撮影した写真 

Webサイトが突然「Internal Server Error」と表示され、ページが開けなくなる――その代表例がHTTPステータスコードの500(Internal Server Error)です。500は「サーバー側で想定外の状態が起き、リクエストを完了できなかった」ことを示す汎用的なエラーで、画面だけでは原因が分かりません。この記事では、500の意味を押さえた上で、起きやすい原因、調査・対処の手順、再発防止の実務ポイントまでをまとめて解説します。

500エラーとは何か

500エラーの定義と意味

500(Internal Server Error)は、HTTPステータスコードの一種であり、サーバーが予期しない状況に遭遇し、リクエストを完了できなかったことを示します。より具体的には、アプリケーションの未処理例外、設定不備、依存先(DBや外部APIなど)の失敗、リソース枯渇といった要因で、サーバーが正常なレスポンス(HTMLやJSONなど)を返せなかったときに返される「汎用(catch-all)」のエラーです。

重要なのは、500自体は「サーバー側で失敗した」という結果を示すだけで、原因を特定する情報を含まない点です。原因特定には、エラーログ、アプリケーションログ、監視指標(CPU・メモリ・ディスク・DB接続数など)、直前の変更(デプロイ・設定変更)といった周辺情報が不可欠になります。

HTTPステータスコードにおける500エラーの位置づけ

HTTPステータスコードは、Webサーバーからクライアントに返す応答の状態を示す3桁の数字です。大きく以下の5つに分類され、500は「5xx(サーバーエラー)」に属します。

  1. 1xx(情報):リクエストを受信し、処理を継続している
  2. 2xx(成功):リクエストが受理され、処理に成功した
  3. 3xx(リダイレクト):追加の操作(別URLへの移動など)が必要
  4. 4xx(クライアントエラー):リクエストの誤りにより処理できない
  5. 5xx(サーバーエラー):サーバー側の都合で処理できない

500は「サーバー側の処理失敗」を表す代表的なコードであり、適切に切り分けできないまま500を返し続けると、障害対応が遅れたり、利用者の不信感を招いたりします。運用では「どの層(Web/アプリ/依存先)で失敗しているか」を最短で判断できる情報設計が重要です。

500エラーが発生する一般的な原因

500エラーは「サーバー内部で何かが失敗した」状態の総称なので、原因は多岐にわたります。実務でよく遭遇する代表例をカテゴリ別に整理すると次のとおりです。

  1. アプリケーション例外(未処理例外、Null参照、型変換ミス、テンプレートの変数未定義、想定外の入力で落ちる など)
  2. 設定不備(環境変数の欠落、秘密情報の参照先誤り、権限設定ミス、ルーティング/リバプロ設定の誤り、.htaccessの誤設定 など)
  3. 依存先の失敗・遅延(DBの接続上限、外部APIのタイムアウト、キャッシュ障害、ストレージ権限不備 など)
  4. リソース枯渇(メモリ不足、CPU飽和、ディスク逼迫、ファイルディスクリプタ枯渇、スレッド/ワーカー枯渇 など)
  5. デプロイ起因(互換性のないリリース、依存ライブラリ差し替え、マイグレーション失敗、ロールバック不備 など)

原因特定では「いつから」「どのURL/機能で」「どのユーザー/条件で」「直前に何が変わったか」をセットで確認すると、ログを読む範囲が一気に狭まり、手戻りが減ります。

500エラーとほかのエラーコードの違い

500は汎用コードですが、実務では状況に応じて別のステータスコードの方が切り分けしやすい場合があります。違いを押さえると、調査と復旧が速くなります。

エラーコード主な意味実務での見立て
400 Bad Requestリクエストが不正入力・形式・JSON不正など(本来はサーバーで弾く領域)
401 Unauthorized認証が必要ログイン・トークン不備、認証フローの問題
403 Forbiddenアクセス拒否権限・WAF・IP制限・ACLなど
404 Not Foundリソースが存在しないURL誤り、ルーティング不備、公開漏れ
500 Internal Server Errorサーバー内部の想定外の失敗アプリ例外、設定不備、依存先処理失敗のハンドリング不備など
501 Not Implemented機能が未実装要求メソッド/機能をサーバーが実装していない(構成・設定不足を含む)
502 Bad Gatewayゲートウェイ/プロキシが上流から不正な応答を受けたリバプロ/LB配下の上流障害・設定不整合・上流が落ちている
503 Service Unavailable一時的に利用不可メンテナンス、過負荷、起動中、意図的に落としている状態
504 Gateway Timeoutゲートウェイ/プロキシが上流の応答待ちでタイムアウトDBや外部API遅延、上流処理の停滞、タイムアウト値不適切

運用上は「本当は502/504に寄せた方が早いのに、アプリが握りつぶして500になっている」ケースもあります。切り分けしやすいステータス設計は、再発防止にも直結します。

500エラーが発生した際の対処法

500エラー対応のゴールは「いま復旧させる(一次対応)」と「原因を潰して再発を防ぐ(二次対応)」を分けて達成することです。ここでは、現場で迷いにくい順番で進め方を整理します。

手順1:影響範囲と再現条件を切り分ける

  • いつから発生しているか(監視アラート時刻、最初の報告時刻)
  • どこで発生しているか(特定ページのみ/全体/特定APIのみ)
  • 誰に起きているか(全ユーザー/特定ロール/特定IP帯)
  • 何をしたとき起きるか(特定入力、検索条件、ファイルアップロード、決済、ログイン直後など)

ここが曖昧だと、ログを見ても候補が広がりすぎます。まずは「再現できる条件」を短時間で作ることが、復旧までの最短ルートです。可能なら、発生時刻・対象URL・ユーザー条件をメモとして残し、以後の調査の基準点にします。

手順2:Webサーバー/リバプロ/ロードバランサのログを確認する

次に、Webサーバー(Apache/Nginx)やリバースプロキシ、ロードバランサのログを確認します。ログには、時刻、対象URL、ステータス、上流への転送先、タイムアウトや接続エラーなどの手がかりが残ります。

  • Apache:error_log / access_log
  • Nginx:error.log / access.log
  • リバプロ/LB:upstreamの接続失敗、タイムアウト、ヘルスチェック結果、再試行の有無

運用で効果が大きいのは、入口でリクエストIDを付与し、全ログに出すことです。たとえば X-Request-ID をLB/リバプロで付与し、Webログにもアプリログにも同じIDを出すと、Web→アプリ→DB→外部APIまで追跡が一気に楽になります。

手順3:アプリケーションログと例外スタックを確認する

500の直接原因は、アプリ側の未処理例外であることが少なくありません。アプリケーションログを見て、例外メッセージとスタックトレース(どの処理で落ちたか)を確認します。

  • フレームワークログ(例:Laravelならstorage/logs、Djangoならlogging設定、Springならアプリログ)
  • APM(Datadog / New Relic / OpenTelemetry等)のエラー・トレース
  • 直前の差分(リリースノート、設定変更、マイグレーション、依存ライブラリ更新)

ここで見るべきポイントは「どの入力・どの条件で落ちたか」です。例外種別だけでなく、可能な範囲で入力の要点(個人情報は避け、サイズや種別など)がログに残る設計にしておくと、再現と修正が速くなります。

手順4:依存先(DB/外部API/ストレージ)の状態を確認する

Webとアプリに明確な手がかりがない場合、依存先の遅延・障害・枯渇を疑います。依存先が失敗したときにアプリが適切にハンドリングできない(タイムアウト処理不足、例外処理不足)と、結果として500になりやすい点にも注意が必要です。

  • DB:接続数上限、ロック、スロークエリ、ディスク容量、レプリケーション遅延
  • キャッシュ:接続エラー、メモリ逼迫、eviction多発
  • 外部API:ステータスページ、タイムアウト増、レート制限、認証エラー
  • ストレージ:権限/署名期限切れ、IO遅延、容量逼迫

特に「特定ページだけ500」「アクセス増のタイミングで500」が重なる場合は、DBや外部APIの遅延がトリガーになっていることが多いです。まずはタイムアウト・接続数・待ち行列(ワーカー枯渇)が増えていないかを確認します。

手順5:一次復旧(止血)を実施する

原因究明に時間がかかるときは、サービス継続を優先して一次対応を行います。代表的な手段は次のとおりです。

  • 直前リリースのロールバック(最優先で検討)
  • リソース増強(スケールアウト/アップ、ワーカー増、DBの接続枠見直し)
  • 問題機能の一時停止(フラグでOFF、該当エンドポイントの一時遮断)
  • タイムアウト/リトライ方針の調整(上限回数、指数バックオフ、サーキットブレーカ等とセットで)

一次復旧の目的は「ユーザー影響を止血すること」です。復旧後は、必ず二次対応(恒久対策)に進みます。一次対応の内容と判断理由を簡潔に記録しておくと、振り返りと再発防止が進めやすくなります。

500エラー発生を防ぐためのベストプラクティス

500の再発防止は、コード品質だけでなく「運用設計」とセットで考えるのが現実的です。ここでは、効果が出やすい順に整理します。

例外処理を適切に実装し、ログに残す

例外を握りつぶさず、適切に捕捉してログに残すことが基本です。ユーザー向けには過度に詳細を出さず、運用側には原因追跡できる情報(例外種別、スタック、リクエストID、処理名、依存先の状態)を記録します。とくに「同じ例外が急増した」ことを検知できる形にすると、初動が速くなります。

入力値バリデーションと依存先エラーの扱いを分ける

不正入力は本来4xxで返すべき領域です。バリデーションを徹底し、「入力が悪いのか」「サーバー内部が悪いのか」をレスポンスで分けると、500の濫発を防げます。また外部APIやDBの失敗は、可能なら502/503/504など適切なコードに寄せ、運用で切り分けしやすくします(アプリ側で“依存先の失敗”を明確に扱う設計がポイントです)。

監視・アラート・トレーシングを整備する

500は「起きた後」に気づくのが一番痛いタイプの障害です。最低限、次の観測点を揃えると、調査の入口が定まります。

  • 5xx率、レイテンシ(p95/p99)、スループット、エラー種別のダッシュボード
  • アプリ例外の集計(同一例外の急増を検知)
  • リクエストIDで追えるログ設計(Web→アプリ→依存先)

運用では「どこで詰まったか」を早く判断することが重要です。監視指標は“きれいな平均”よりも、p95/p99やキューの増大など、詰まりを示す指標を優先します。

負荷テストと容量計画を行う

高負荷時に何が先に壊れるかを事前に把握しておくと、500の大量発生を避けられます。負荷テストでは、ピーク時の同時接続、DB接続上限、ワーカー枯渇、タイムアウト設定の妥当性、キャッシュの効果(逆にキャッシュ障害時の挙動)などを確認します。

定期的なアップデートと安全なデプロイ手順

OS、Webサーバー、ランタイム、フレームワーク、ライブラリの更新は、脆弱性対策だけでなく安定性の観点でも重要です。あわせて、段階的デプロイ(カナリア等)、ロールバック手順、マイグレーションの互換性確保(前方互換)を整えると、リリース起因の500を減らせます。

ユーザー向けエラーページと問い合わせ導線を整備する

500が出たとき、ユーザーは「自分が悪いのか」「待てば直るのか」が分かりません。エラーページには、謝意、再試行の案内、障害告知ページへの導線、問い合わせ窓口、発生時刻や問い合わせ用の識別子(リクエストIDなど)を表示すると混乱が減ります。表示内容は最小限にしつつ、運用側が追える情報を確保するのがポイントです。

500エラーに関するよくある質問

Q.500エラーはユーザー側の操作で直せますか?

根本原因はサーバー側にあるため、ユーザー操作だけでの恒久解決はできません。

Q.500と503の違いは何ですか?

500は想定外の内部エラー、503はメンテナンスや過負荷などで一時的に提供できない状態です。

Q.500が特定ページだけで起きるとき、何を疑うべきですか?

そのページ固有の処理(テンプレート、DBクエリ、プラグイン、外部API呼び出し)の例外やタイムアウトを疑います。

Q.500の原因特定で最初に見るべきログはどれですか?

まずWebサーバー/リバプロのエラーログ、次にアプリケーションログの例外スタックを確認します。

Q.500が急増したときの一次対応は何が有効ですか?

直前リリースのロールバック、問題機能の停止、スケールアウトなどで影響を止血します。

Q.外部API障害でも500になりますか?

なります。依存先の失敗を適切に扱えないと、アプリ例外として500が返ることがあります。

Q.500エラーページはカスタマイズした方が良いですか?

はい。謝意と案内に加え、問い合わせ導線と時刻・リクエストIDなどの手がかりを用意すると混乱が減ります。

Q.Apacheで500エラーページを指定するには?

設定例はErrorDocument 500 /errors/500.htmlで、サーバー内のURLパスを指定して配置します。

Q.Nginxで500エラーページを指定するには?

設定例はerror_page 500 502 503 504 /50x.html;で、必要ならlocation = /50x.html { internal; }を併用します。

Q.500の再発防止で最も効果が出やすい取り組みは?

ログ・監視・トレーシングを整え、原因特定と復旧のスピードを上げることです。

まとめ

500(Internal Server Error)は、サーバーが想定外の状態に遭遇してリクエストを完了できなかったことを示す汎用的なHTTPステータスコードです。原因はアプリ例外、設定不備、依存先の失敗、リソース枯渇、デプロイ起因など多岐にわたるため、影響範囲の切り分け→Web/リバプロログ確認→アプリ例外確認→依存先確認の順に調査すると効率的です。再発防止には、例外処理の整備に加え、ログ設計(リクエストID)、監視・トレーシング、安全なデプロイ手順、ユーザー向け案内の整備を組み合わせ、原因特定と復旧のスピードを上げることが重要です。

記事を書いた人

ソリトンシステムズ・マーケティングチーム