500 Internal Server Error

サーバーで問題が発生しました。

使いどころ

未処理の例外。詳細はログに記録し、クライアントには漏らさないようにします。

よくある原因と対処法

500 は、サーバー上で処理されない例外が発生したか、設定に誤りがあることを意味します。まずはリクエスト時刻のログを確認しましょう。アプリケーションのスタックトレース、PHP や Python のエラーログ、journalctl、docker logs、CloudWatch などです。よくある原因は、null や undefined の値、データベースクエリの失敗や未適用のマイグレーション、本番環境での環境変数の欠落、.htaccess の構文エラー、スクリプトのパーミッションの誤りです。

500 をデバッグしやすくしましょう。リクエスト ID をヘッダーとボディで返し、スタックトレースとともにログに記録し、Sentry のようなトラッカーにエラーを送ります。本番環境では、スタックトレースをクライアントに見せてはいけません。クライアントの誤りに 500 を使わないでください。検証の失敗は 4xx に属するものであり、そうすることで 5xx のアラートが意味を保てます。バックオフ付きの再試行は一時的な障害には効果がありますが、決定的なバグは毎回失敗します。

サーバーエラー (5xx)

5xx はサーバーエラーです。リクエストに問題がなくても、サーバーやその背後の何かが失敗しています。アラートを設定しておく価値があります。

レスポンスでの表示

HTTP/1.1 500 Internal Server Error

返し方

Node.js / Expressres.status(500).end()
Python / Flaskreturn '', 500
nginxreturn 500;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く