500 Internal Server Error とは?原因と対処法
500 Internal Server Errorは、Webサーバーがリクエストを受け取ったものの、 内部処理で予期しない問題が発生し、正常な応答を返せなかったことを示します。 「アクセスしようとしたページは表示できませんでした」とだけ出る場合も、詳細な原因はサーバー側のログにあります。
HTTP 500 means the server encountered an unexpected condition while processing the request. Visitors can retry later, while site operators should inspect server and application logs.
TL;DR
- 500はサーバー内部で処理中にエラーが起きたことを示す
- 訪問者は一度再読み込みし、直らなければ時間を置く
- 500表示だけならウイルスの心配は不要
- 運営者は再起動を繰り返す前に、発生時刻とリクエストに対応するサーバーログを見る
- 例外、設定エラー、接続失敗の詳しい手掛かりは必ずサーバー側のログにある
1. 訪問者側でできる対処法
500は基本的にWebサイト側の問題です。端末の設定を大きく変えたり、修復ソフトを導入したりする必要はありません。 次の順に確認してください。
- 一度だけ再読み込みする: 一時的な失敗なら復旧することがあります。決済や送信の直後は二重実行を避け、履歴を先に確認します。
- 数分から数十分待つ: 運営者が障害対応やロールバックを行っている可能性があります。
- 別端末や別回線で確認する: 全員に起きるか、特定のログイン状態だけかを切り分けられます。
- 運営者へ問い合わせる: URL、発生時刻、直前の操作、表示文言を伝えます。パスワード、カード番号、認証トークンは送らないでください。
500エラーはウイルス感染を示す表示ではありません。HTTPの応答コードなので、表示されただけでパソコンやスマートフォンが感染したと心配する必要はありません。 ただし、エラー画面から不審なソフトの導入を促された場合は従わないでください。
2. 500 Internal Server Errorの意味
サーバーは入力を受け取り、アプリ実行、DB参照、HTML生成などを行います。その途中で未処理例外、 設定ミス、権限エラー、外部サービス接続失敗などが起き、より具体的なコードを返せない場合の一般的な応答が500です。
500は原則としてそのサーバー自身の内部処理の失敗です。一方、502は上流から不正な応答を受けた ゲートウェイ、503は一時的な利用不能、504は上流応答のタイムアウトです。 詳細は502・503・504の比較記事も参照してください。
| コード | 意味 | 主な確認先 |
|---|---|---|
| 500 | サーバー内部の予期しない失敗 | アプリ・Webサーバーログ |
| 502 | 上流から不正な応答 | プロキシ・上流アプリ |
| 503 | 一時的にサービス不能 | 負荷・保守・容量 |
| 504 | 上流の応答待ちでタイムアウト | 処理時間・ネットワーク |
3. 運営者向け:主な原因一覧
「発生直前に何を変更したか」と「同じ時刻のログ」を結び付けます。ブラウザの文言だけで決めつけず、 再現URLとリクエストIDを軸に調査します。
| 原因 | ログの手掛かり | 最初の対処 |
|---|---|---|
| 未処理例外 | スタックトレース、例外名 | 最初の自作コード行と入力を確認 |
| 設定ファイルの記述ミス | syntax error、directive not allowed | 直前の.htaccessや設定差分を戻す |
| パーミッション不正 | permission denied | 所有者と最小限の権限を確認 |
| PHPメモリ上限・非互換 | memory exhausted、fatal error | 原因処理と互換バージョンを確認 |
| DB接続失敗 | connection refused、timeout | 接続先、資格情報、DB稼働を確認 |
| デプロイ直後の不整合 | module not found、schema mismatch | 依存関係と移行順序を確認 |
4. 環境別の切り分け
WordPress / PHP
WordPressではプラグイン、テーマ、.htaccess、PHPバージョン、メモリ上限が代表的な原因です。 直前に更新したプラグインから無効化し、管理画面に入れない場合はFTPやファイル管理で対象ディレクトリ名を一時変更します。
.htaccessを一時退避し、パーマリンク設定から安全に再生成するmemory_limit不足なら、単純な増量だけでなく大量消費の原因を調べる- テーマとプラグインが現在のPHPバージョンに対応しているか確認する
- 検証環境でデバッグログを有効化し、
wp-content/debug.logを確認する
デバッグ情報は公開画面に表示せずログへ出します。調査後は設定を戻し、ログに認証情報や個人情報が残っていないか確認します。
Node.js / Python
Node.jsでは例外名からスタックを下へ読み、最初に現れる自分のアプリのファイルと行番号を探します。 Pythonではトレースバックを追い、最後の例外型とメッセージを確認して呼び出し元へ戻ります。 ライブラリ内部の行だけでなく、その関数へ渡した入力と設定を確認してください。
Read the exception type and message first, then locate the first stack frame that belongs to your application. Correlate it with the request timestamp, route, release, and error ID.
nginx / Apache
nginxの代表的なログは/var/log/nginx/error.log、ApacheはDebian・Ubuntu系で/var/log/apache2/error.log、RHEL系で/var/log/httpd/error_logです。 実際の場所は仮想ホストやコンテナ構成で変わるため、error_logやErrorLog設定も確認します。
nginxが500を生成したのか、PHP-FPMやアプリから500を受け取ったのかを区別します。同じ時刻のアクセスログで URL、ステータス、リクエストIDを特定し、対応するエラーログを読みます。
5. エラーログ確認のコマンド例
次の例はLinuxサーバー向けです。権限やログ管理方式は環境に合わせ、機密情報を共有チャットへ貼り付けないでください。
直近のnginxエラーを見る
sudo tail -n 100 /var/log/nginx/error.log
sudo journalctl -u nginx --since "15 minutes ago"ApacheとPHP-FPMのログを見る
sudo tail -n 100 /var/log/apache2/error.log
sudo journalctl -u php8.3-fpm --since "15 minutes ago"コンテナの直近ログを見る
docker compose ps
docker compose logs --since 15m app
docker compose logs --since 15m nginx時刻、URL、HTTPメソッド、デプロイ版、リクエストIDを揃えると、アクセスログとアプリログを横断して同じ失敗を追跡できます。 ログが大量なら、まず時間範囲とサービスを絞ってください。
6. 正しい500エラーの返し方
利用者向け応答は短く一貫させ、スタックトレース、ファイルパス、SQL、環境変数、内部ホスト名を含めません。 詳細は構造化ログへ記録し、利用者には問い合わせに使えるランダムなエラーIDだけを返します。
{
"error": "internal_server_error",
"message": "処理を完了できませんでした",
"errorId": "err_7J4K2M"
}| 出力先 | 含める情報 | 含めない情報 |
|---|---|---|
| 利用者への応答 | 一般的な説明、エラーID | 例外詳細、秘密情報 |
| 内部ログ | 例外、スタック、リクエストID、版 | パスワード、トークン、個人情報 |
| 監視通知 | 発生率、影響範囲、ログへのリンク | 全ログ本文、顧客入力 |
単発の500だけでなく、エラー率、対象ルート、レイテンシ、デプロイとの相関を監視します。 しきい値を超えたらアラートを送り、担当者がエラーIDからログへ到達できる運用にします。
7. アンチパターン
- 詳細エラーを本番画面に表示する: 攻撃者に構成やコードの手掛かりを与えます。
- 失敗を200で包んで返す: 監視、キャッシュ、クライアントのエラー処理が壊れます。内部の失敗には正しく500を返します。
- ログを見ず再起動だけ行う: 原因と証拠が消え、同じ障害が再発します。必要なら先に時刻、メトリクス、ログを保存します。
8. よくある質問 / FAQ
500エラーは自分のせいですか?
多くの場合はサイト側の問題です。特定の入力でだけ起きる場合も、入力を安全に処理して適切な4xxを返す責任はサーバー側にあります。 再読み込みで直らなければ運営者へ情報を伝えてください。
「アクセスしようとしたページは表示できませんでした」と出たらどうしますか?
ブラウザやサービス独自の500エラー文言である可能性があります。一度だけ再読み込みし、続くなら時間を置きます。 運営者にはURL、時刻、直前の操作、表示文言を伝えてください。
500と503はどう違いますか?
500は予期しない内部処理の失敗です。503は過負荷、保守、依存サービス停止など、一時的に提供できない状態です。 503では復旧見込みをRetry-Afterで示せます。
9. English summary
500 Internal Server Error means the server failed while processing a request and could not provide a more specific response. Visitors should retry once, wait, and report the URL, time, and action if the error continues. A 500 page alone does not indicate a virus infection.
Site operators should correlate the request with application, nginx, Apache, PHP-FPM, or container logs. Check recent deployments, exceptions, configuration syntax, permissions, memory limits, runtime compatibility, and database connectivity. Return a generic message and an error ID; keep stack traces in protected logs, and never hide failures behind HTTP 200.
よくある質問 / FAQ
- 500エラーは自分のせい?
- 多くの場合、訪問者の端末ではなくWebサイトのサーバー内部で起きた問題です。再読み込みしても続く場合は、時間を置くか運営者へ連絡してください。
- ウイルスの心配は?
- 500エラーが表示されただけで、端末がウイルスに感染したことを意味しません。500はサーバー内部の処理失敗を示すHTTPステータスです。
- WordPressで500が出た時に最初にやることは?
- 直前に変更したプラグインやテーマを無効化し、サーバーのerror.logとwp-content/debug.logを確認します。管理画面に入れない場合はプラグインのディレクトリ名を一時変更します。
- What does 500 Internal Server Error mean?
- It means the server encountered an unexpected condition and could not complete the request. The exact cause should be investigated in the application or web server logs.
- 500と503の違いは?
- 500はサーバー内部の予期しない処理失敗、503は過負荷やメンテナンスなどによる一時的なサービス利用不能を示します。
- 運営者に問い合わせる時に伝えるべき情報は?
- エラーが出たURL、発生時刻、直前に行った操作、表示された文言を伝えてください。個人情報やパスワードは送らないでください。