HTTPエラー500 Internal Server Errorの原因と解決方法

HTTPエラー500とは?
HTTPエラー500(Internal Server Error)は、Webサーバーがリクエストの処理中に予期しないエラーに遭遇したことを示すサーバー側のステータスコードです。最も汎用的なサーバーエラーであり、サーバーが'何かが壊れたが、正確な原因はわからない'と伝えている状態です。
HTTP仕様(RFC 9110、セクション15.6.1)によれば、500レスポンスは、問題をより具体的に説明する5xxステータスコードが見つからない場合に使用されるべきとされています。503エラー(一時的な状態を示す)とは異なり、500エラーは問題が一時的なものか恒久的なものかについて何も示しません。
重要なのは、500エラーはほぼ常にサーバー側のコードのバグ、設定ミス、またはクラッシュが原因であり、訪問者の操作に問題があるわけではないということです。修正はウェブサイトの管理者またはサーバー管理者が行う必要があります。
500エラーの表示例
500エラーは、Webサーバー、ホスティングプロバイダー、CMSによって異なる表示になります。よく目にするメッセージの例を以下に示します。
500 Internal Server Error — 標準的なメッセージ
HTTP Error 500 — ブラウザのアドレスバーでよく表示される
Internal Server Error — ステータスコードなしの汎用テキスト
The server encountered an internal error or misconfiguration — Apacheのデフォルトメッセージ
500 Internal Server Error - nginx — Nginxの最小限のエラーページ
このサイトで重大なエラーが発生しました — WordPress(バージョン5.2以降)
HTTP Error 500.19 - Internal Server Error — IISのサブステータスコード付きメッセージ
500. That's an error. — GoogleのエラーPageで表示される
HTTPエラー500の主な原因
500エラーは、さまざまなサーバー側の問題によって引き起こされます。発生頻度の高い順に、最も一般的な原因を紹介します。
.htaccessファイルの破損 — .htaccessの1文字のタイプミスや無効なディレクティブで、Apacheが即座にクラッシュします。共有ホスティングでの原因第1位です。
PHPの致命的エラー — 構文エラー、キャッチされていない例外、未定義の関数の呼び出しがスクリプトの実行を停止させ、500を発生させます。
PHPメモリ制限の超過 — memory_limit(デフォルト128M)を超えるスクリプトは警告なしにクラッシュします。大きな画像処理や複雑なデータベースクエリがよくあるトリガーです。
ファイル権限の誤り — ファイルは644、ディレクトリは755が正しい設定です。制限が厳しすぎる場合も、危険なほど緩い777の場合も問題を引き起こします。
プラグインやテーマの競合 — 新しく更新された、または互換性のないプラグインがアプリケーション全体をクラッシュさせることがあります。WordPress固有の原因として最も多いものです。
データベース接続の失敗 — 認証情報の間違い、データベースサーバーのクラッシュ、接続数の上限超過により、アプリケーションが実行できなくなります。
スクリプトのタイムアウト — 長時間実行されるスクリプトがmax_execution_time(デフォルト30秒)を超過し、サーバーに強制終了されます。
CMSコアファイルの破損 — アップデートの失敗やファイル転送の中断により、重要なファイルが不完全な状態になります。
PHP-FPMプロセスのクラッシュ — ワーカープロセスがメモリ問題で停止したり、pm.max_childrenの制限に達すると、Nginxが500を返します。
サーバーの設定ミス — 誤ったPHPバージョン、無効なバーチャルホスト設定、不正なNginxサーバーブロックのいずれもが500エラーを引き起こします。
ディスク容量の枯渇 — サーバーのディスク容量がなくなると、ログファイルや一時ファイルの書き込みができず、クラッシュの原因になります。
CGI/Perlスクリプトのエラー — ファイルモード(バイナリ vs ASCII)の誤り、不正な改行コード、不足しているモジュールが原因です。
訪問者向けの対処法
他の人のウェブサイトで500エラーが表示された場合、問題はサーバー側にあります。あなたの側の問題ではありません。ただし、諦める前にいくつか試せることがあります。
ページを再読み込みする — 30秒待ってから、F5キーまたはCtrl+R(Macの場合はCmd+R)を押してください。多くの500エラーは一時的なサーバーの不具合が原因で、自然に解消されます。
スーパーリロードする — Ctrl+Shift+R(Macの場合はCmd+Shift+R)を押して、ブラウザキャッシュをバイパスし完全に新しいコピーを取得してください。
ブラウザキャッシュとCookieをクリアする — ブラウザの設定からキャッシュファイルを削除してください。破損したキャッシュデータが表示の問題を引き起こすことがあります。
シークレットモードで試す — プライベート/シークレットウィンドウを開いて、ブラウザ拡張機能やキャッシュ状態が問題を引き起こしていないか確認してください。
サイトが全員に対してダウンしているか確認する — DNS RobotのHTTPヘッダーツールを使って、サーバーのレスポンスステータスコードを確認しましょう。
時間をおいて再度アクセスする — 問題はサーバー側にあるため、ウェブサイトの管理者が修正する必要があります。15〜30分後にもう一度確認してください。
ウェブサイトの管理者に連絡する — エラーが数時間続く場合は、お問い合わせページやSNSを通じて管理者に知らせてください。
対処法1:サーバーのエラーログを確認する
エラーログは500エラーをデバッグするための最も重要なツールです。何が問題だったか、ファイルパス、行番号、エラーメッセージを正確に教えてくれます。他の対処法を試す前に、必ずまずログを確認してください。
# Apache error log
tail -100 /var/log/apache2/error.log
# Nginx error log
tail -100 /var/log/nginx/error.log
# PHP-FPM error log
tail -100 /var/log/php-fpm/error.log
# WordPress debug log (if WP_DEBUG_LOG enabled)
tail -100 /path/to/wordpress/wp-content/debug.log対処法2:.htaccessをテスト・修復する
破損または設定ミスのある.htaccessファイルは、Apacheサーバーでの500エラーの最も一般的な原因です。1つのタイプミス、サポートされていないディレクティブ、不正なRewriteRuleがサイト全体をダウンさせる可能性があります。
最も簡単なテスト方法は、ファイルを一時的にリネームすることです。リネーム後にサイトが表示されれば、.htaccessが原因です。
# Rename to disable .htaccess
mv .htaccess .htaccess_backup
# If site loads, regenerate a clean .htaccess
# For WordPress, go to Settings > Permalinks and click Save対処法3:ファイル権限を修正する
ファイル権限が正しくないと、Webサーバーがファイルの読み取りや実行ができなくなります。標準的な権限はファイルが644、ディレクトリが755です。権限を777に設定しないでください。セキュリティリスクであり、多くのホスティングプロバイダーがブロックします。
# Set correct directory permissions
find /path/to/webroot -type d -exec chmod 755 {} \;
# Set correct file permissions
find /path/to/webroot -type f -exec chmod 644 {} \;
# WordPress wp-config.php (extra security)
chmod 440 wp-config.php対処法4:PHPのメモリと実行時間の制限を引き上げる
メモリ制限や最大実行時間を超過したPHPスクリプトは、サーバーによってサイレントに強制終了され、500エラーが発生します。デフォルトのmemory_limit 128Mとmax_execution_time 30秒は、複雑なアプリケーションには不十分な場合が多いです。
サーバー環境に応じて、以下のいずれかの方法で制限を引き上げることができます。
# Option 1: php.ini (best method)
memory_limit = 256M
max_execution_time = 300
# Option 2: .htaccess (Apache only)
php_value memory_limit 256M
php_value max_execution_time 300
# Option 3: .user.ini (FastCGI/Nginx)
memory_limit = 256M
# Option 4: wp-config.php (WordPress)
define( 'WP_MEMORY_LIMIT', '256M' );対処法5:プラグインとテーマを無効化する(CMS)
WordPressやJoomlaなどのCMSを使用している場合、不具合のあるプラグインやテーマが500エラーの最も一般的な原因の一つです。最も素早いテスト方法は、すべてのプラグインを一括で無効化し、一つずつ再有効化することです。
# Disable all WordPress plugins (via file system)
cd /path/to/wordpress/wp-content
mv plugins plugins_disabled
# Or use WP-CLI
wp plugin deactivate --all
# Switch to default theme
wp theme activate twentytwentyfour対処法6:データベース接続を確認・修復する
アプリケーションがデータベースに接続できない場合、500エラーが発生します。認証情報の間違い、データベースサーバーのダウン、テーブルの破損などが原因です。
まず設定ファイル(WordPressならwp-config.php、Laravelなら.env)でデータベースの認証情報を確認してください。次に接続をテストし、必要に応じて破損したテーブルを修復しましょう。
# Test MySQL connection
mysql -u username -p -h localhost database_name -e "SELECT 1;"
# Repair and optimize all tables
mysqlcheck -u username -p --auto-repair --optimize database_name
# WordPress: add to wp-config.php, then visit /wp-admin/maint/repair.php
define( 'WP_ALLOW_REPAIR', true );対処法7:PHPバージョンの互換性を確認する
古いPHPバージョン向けに書かれたコードを新しいPHPリリースで実行する(またはその逆)と、致命的なエラーが発生します。非推奨の関数、変更されたデフォルト動作、削除された機能が、PHPアップグレード後の一般的な原因です。
現在のPHPバージョンを確認し、アプリケーションの要件と比較してください。
# Check PHP version
php -v
# List loaded PHP modules
php -m
# Check current memory limit
php -i | grep memory_limit対処法8:ディスク容量を確認する
サーバーのディスク容量がなくなると、ログファイル、一時ファイル、セッションデータの書き込みができなくなり、500エラーが発生します。見落とされがちですが、ログファイルが際限なく増大した場合など、意外とよくある原因です。
# Check disk usage
df -h
# Find large files eating disk space
du -sh /var/log
du -sh /tmp
# Clear old log files if needed
truncate -s 0 /var/log/nginx/error.log500 vs 502 vs 503 vs 504:それぞれの違い
最も重要な違い:500 = サーバーが内部的に壊れた。 502 = プロキシがバックエンドから不正なデータを受け取った。503 = サーバーは動作しているが処理しきれない。504 = プロキシが待ちきれなかった。サーバーが返す正確なステータスコードは、DNS RobotのHTTPヘッダーツールで確認できます。
| コード | 名前 | 意味 | 一般的な原因 |
|---|---|---|---|
| 500 | Internal Server Error | サーバー自体がクラッシュした、またはキャッチされていない例外が発生した | PHPの致命的エラー、.htaccessの不具合、メモリ枯渇 |
| 502 | Bad Gateway | プロキシがバックエンドから無効なレスポンスを受信した | PHP-FPMのクラッシュ、バックエンド未起動、ソケット切断 |
| 503 | Service Unavailable | サーバーが一時的に過負荷またはメンテナンス中 | トラフィック急増、計画的メンテナンス、リソース制限 |
| 504 | Gateway Timeout | プロキシがバックエンドのレスポンスを待ちきれずタイムアウトした | 遅いデータベースクエリ、長時間実行スクリプト、応答しないアップストリーム |
500エラーがSEOに与える影響
500エラーは、他の多くのHTTPエラーよりもSEOへの影響が深刻です。知っておくべきポイントを紹介します。
2日以内にインデックスが削除される可能性があります。 GoogleのJohn Mueller氏は、持続的な500エラーにより、わずか2日でURLがインデックスから削除される可能性があることを確認しています。これは、Googleが一時的なものとして扱う503エラーよりも速い対応です。
500エラーはクロールバジェットを浪費します。 404エラー(Googleが最終的に再クロールを停止する)とは異なり、500エラーは曖昧です。ページが復活する可能性があるため、Googlebotは積極的にリトライし続けます。これにより、何も返さないページにクロールバジェットが浪費されます。
ランキングは素早く低下しますが回復も可能です。 問題を修正すれば、Googleは通常数日以内にクロールを再開します。ただし、ランキングの回復には数週間かかることがあり、すぐに元の順位には戻りません。
計画的なメンテナンスには500ではなく503を使用してください。 Retry-Afterヘッダー付きの適切な503レスポンスは、ページを削除せずに後で再訪問するようGoogleに伝えます。500にはそのようなシグナルはありません。
500エラーを予防する方法
予防はデバッグよりも効果的です。ウェブサイトで500エラーのリスクを最小限に抑えるためのベストプラクティスを紹介します。
稼働監視を設定する — UptimeRobotやPingdomなどのツールで1〜5分ごとにサイトを監視しましょう。500エラーが発生したら即座にアラートを受け取れます。
変更は必ずステージング環境でテストする — 本番環境に直接デプロイしないでください。プラグインの更新、PHPのアップグレード、設定変更は、まずステージング環境でテストしましょう。
バージョン管理(Git)を使用する — すべての変更をコミットし、問題のあるデプロイを1つのコマンドで即座にロールバックできるようにしましょう。
適切なエラーハンドリングを実装する — データベースクエリやAPI呼び出しをtry-catchブロックで囲みましょう。すべてのエラーの完全なスタックトレースをサーバー側にログ記録してください。
ディスク容量とサーバーリソースを監視する — ディスク使用率80%超、高CPU、メモリ圧迫時のアラートを設定しましょう。
ソフトウェアを最新に保つ — 古いCMSバージョン、プラグイン、サーバーソフトウェアには、クラッシュの原因となる既知のバグが含まれています。
自動バックアップを維持する — 復元手順を定期的にテストしましょう。テストしたことのないバックアップはバックアップではありません。
PHPの制限値を適切に設定する — memory_limitとmax_execution_timeは、デフォルト値ではなく、実際のワークロードに基づいて設定しましょう。
CI/CDパイプラインを使用する — デプロイ前にテストを自動化しましょう。テストが失敗した場合、デプロイを実行すべきではありません。
サーバーのレスポンスを確認する
DNS Robotの無料HTTPヘッダーツールを使って、サーバーが返すステータスコードの確認やすべてのレスポンスヘッダーを検査できます。
Try HTTP Headers CheckerFrequently Asked Questions
HTTPエラー500(Internal Server Error)は、Webサーバーがリクエストの処理中に予期しないエラーに遭遇したことを意味します。サーバー側で何かがクラッシュしたが、正確な原因を特定できない場合に表示される汎用的なエラーです。