サイトにアクセスしようとしたら、「500 Internal Server Error」エラーに遭遇することがあります。このエラーが発生すると、「データベース接続確立エラー」や「死の真っ白画面(WSoD)」のようにサイトにアクセスできなくなるため、解決しなければ訪問者や顧客を失い、ブランドの信用に悪影響を与えることになります。

今回は、、「500 Internal Server Error」エラーを取り上げ、原因と解決策をご紹介していきます。

エラーコード HTTP Error 500
エラーの種類 サーバー内部エラー
エラーのバリエーション 500 Internal Server Error
HTTP 500
Internal Server Error
HTTP 500 – Internal Server Error
500 Error
HTTP Error 500
500 – Internal Server Error
500 Internal Server Error. Sorry something went wrong.
500. That’s an error. There was an error. Please try again later. That’s all we know.
The website cannot display the page – HTTP 500.
Is currently unable to handle this request. HTTP ERROR 500.
エラーの原因 ブラウザキャッシュの問題
.htaccessファイルの破損とPHPのメモリ制限
サードパーティプラグインまたはテーマの問題
WordPressのファイルの破損
データベースサーバーの問題

「500 Internal Server Error」エラーとは

ウェブサイトにアクセスする際、ブラウザはサイトがホストされているサーバーにリクエストを送信します。サーバーはこのリクエストを処理し、要求されたリソース(PHP、HTML、CSSなど)をHTTPヘッダーとともに返信します。HTTPには、リクエストの状態(ステータス)を通知するHTTPステータスコードというものが含まれます。ステータスコードには、正常に完了したことを伝える「200」や何らかの問題を伝える「500」など、さまざまな種類があります。

ステータスコード500番台には、500、501502503504など様々な種類があり、今回の「500 Internal Server Error」 は、『予期しない何らかの問題が発生し、サーバーがリクエストを実行できない』ことを意味します。(RFC 7231の第6.6.1条)。

「500 Internal Server Error」エラーの種類

「500 Internal Server Error」エラー
「500 Internal Server Error」エラー

500エラーは、ウェブサーバーやOS、ブラウザによってエラーメッセージが異なります。代表的なものには、以下のようなものがあります。

  • 500 Internal Server Error
  • HTTP 500
  • Internal Server Error
  • HTTP 500 – Internal Server Error
  • 500 Error
  • 500 – Internal Server Error
  • 500 Internal Server Error. Sorry something went wrong.
  • 500. That’s an error. There was an error. Please try again later. That’s all we know.
  • The website cannot display the page – HTTP 500.
  • Is currently unable to handle this request. HTTP ERROR 500.

真っ白な画面上に、以下のようなメッセージが表示されることも(以下英語原文の日本語訳)。

サーバーに内部エラー、または機器設定エラーの発生により、リクエストが処理されませんでした。[email protected]よりサーバー管理者に連絡を取り、エラーが発生したこと、またエラーを引き起こしたと思われる操作について報告してください。サーバーエラーログにさらなる詳細が記録されている可能性があります

Internal Server Errorのメッセージ
Internal Server Errorのメッセージ

FirefoxやSafariでは、ただの空白の画面が表示されることもあります。

Firefoxの500 Internal Server Error
Firefoxの500 Internal Server Error

このエラーは有名サイトでも発生することがあり、例えば、Airbnbでは以下のような「500 Internal Server Error」エラーページが表示されます。

Airbnbの「500 Internal Server Error」エラーページ
Airbnbの「500 Internal Server Error」エラーページ

readmeでは以下のようなページが表示されます。

readmeの「500 Internal Server Error」エラーページ
readmeの「500 Internal Server Error」エラーページ

YouTubeでは、以下のようなエラーページが表示されます。

YouTubeの「500 Internal Server Error」エラーページ
YouTubeの「500 Internal Server Error」エラーページ

IIS 7.0 以降のバージョン(Windows)では、500エラーの原因をより詳しく解く示す追加のHTTPステータスコードが表示されます。

  • 500.0─モジュールまたは ISAPI のエラーが発生しました。
  • 500.11─ Web サーバーでアプリケーションがシャットダウンしています。
  • 500.12─Web サーバーでアプリケーションが再起動のためビジー状態になっています。
  • 500.13─ Web サーバーが非常にビジーです。
  • 500.15─Global.asax に対する直接要求は許可されていません。
  • 500.19─ 構成データが無効です。
  • 500.21─モジュールが認識されません。
  • 500.22─ ASP.NET httpModules 構成は、マネージ パイプライン モードでは適用されません。
  • 500.23─ASP.NET httpHandlers 構成は、マネージ パイプライン モードでは適用されません。
  • 500.24─ASP.NET 偽装の構成は、マネージ パイプライン モードでは適用されません。
  • 500.50─ RQ_BEGIN_REQUEST 通知の処理中に再書き込みエラーが発生しました。 構成または受信規則の実行エラーが発生しました。
    注)受信規則と送信規則の両方に対して分散ルールの構成を読み取ります。
  • 500.51─ GL_PRE_BEGIN_REQUEST 通知の処理中に再書き込みエラーが発生しました。 グローバル構成またはグローバル規則の実行エラーが発生しました。
    注)グローバル ルールの構成を読み取る場所を次に示します。
  • 500.52─ RQ_SEND_RESPONSE 通知の処理中に再書き込みエラーが発生しました。 送信規則の実行エラーが発生しました。
  • 500.53─RQ_RELEASE_REQUEST_STATE 通知の処理中に再書き込みエラーが発生しました。 送信規則の実行エラーが発生しました。 この規則は、出力ユーザー キャッシュが更新される前に実行されるよう構成されています。
  • 500.100─内部 ASP エラー。

「500 Internal Server Error」エラーの原因

「500 Internal Server Error」エラーの原因はさまざまです。一般的には、以下のような(1つまたは複数の)要素がエラーを引き起こします。

  • ブラウザのキャッシュ
  • データベースのログイン認証情報が正しくない
  • データベースが破損している
  • WordPressのファイルが破損している
  • データベースサーバーに問題がある
  • WordPressコアファイルが破損している
  • .htaccessファイルの破損とPHPメモリ制限の超過
  • サードパーティプラグインやテーマの問題
  • サードパーティプラグインによるPHPのタイムアウトまたは致命的なPHPエラー
  • ファイルやフォルダの権限に誤りがある
  • サーバーのPHPメモリ制限の枯渇
  • .htaccessファイルが破損している
  • CGIやPerlスクリプトの問題

500エラーが与えるSEOへの影響

WordPressのメンテナンスモード時に使用され、メンテナンス終了後にGoogleに再度確認を促す503エラーとは異なり、500エラーは放置しておくとSEOに影響を与えます。サイトが10分間ダウンしている場合、その間にGoogleにクロールされてもキャッシュがクロールされます。あるいは、10分程度であれば、Googleはクロールしないかもしれません。この場合には、特に問題はありません。

しかし、例えば6時間以上サイトがダウンしていると、Googleがサイトレベルの問題として扱い、結果として検索結果の表示順位が下がる可能性があります。500エラーが繰り返し発生することが懸念される場合は、まず原因を特定し、以下の解決方法を実践しましょう。

「500 Internal Server Error」エラーの解決方法

WordPressサイトで「500 Internal Server Error」エラーが発生した場合、通常はユーザーエラー(クライアントサイドの問題)またはサーバー自体の異常が原因である可能性が高いです。以下、両方のパターンをご紹介します。

1. ページを再読み込みする

初歩的ですが、「500 Internal Server Error」エラーが発生した際には、まずページを再読み込みしてみてください(F5またはCtrl + F5)。ホストやサーバーに一時的に過負荷がかかっているだけで、すぐに正常通りにサイトが稼働する可能性もあります。また、別のブラウザでアクセスしてみて、ブラウザに原因がないかを確認することもできます。

別の方法として、downforeveryoneorjustme.comにサイトのURLを貼り付けてみるのも有効です。サイトがダウンしているのか、それとも自分の環境に問題があるのかをすぐに確認できます。このツールは、サーバーから返されるHTTPステータスコードを確認でき、「OK(異常なし)」を意味する200以外が返される場合は、それが表示されます。

downforeveryoneorjustme
downforeveryoneorjustme

また、WordPressサイトのプラグインやテーマを更新した直後に発生することもあり、これはホストが正しく設定されていない場合に起こります。これは通常一時的なタイムアウトで、数秒で元に戻ります。数秒待ってから再読み込みしてみてください。

2. ブラウザのキャッシュをクリアする

ブラウザキャッシュのクリアも効果的なトラブルシューティングになり得ます。以下のリソースを参考にキャッシュをクリアしてみてください。

3. サーバーのログを確認する

エラーログを確認することもできます。Kinstaのお客様は、MyKinstaのログビューアで簡単にエラーログを見ることができます。特にプラグインに起因するエラーが発生している場合は有用です。

MyKinstyaのログビューア
MyKinstyaのログビューア

ご利用中のホスティングにこのようなツールがない場合は、以下をwp-config.phpファイルに貼り付けて、WordPressのデバッグモードを有効化することができます。

define( 'WP_DEBUG', true );	 	 
define( 'WP_DEBUG_LOG', true );	 	 
define( 'WP_DEBUG_DISPLAY', false );

ログは通常、/wp-contentディレクトリに格納されていますが、Kinstaのように「logs」という専用フォルダがある場合もあります。

WordPressのエラーログのフォルダ(SFTP)
WordPressのエラーログのフォルダ(SFTP)

また、Apachenginxのログファイルも確認可能です。通常はそれぞれ以下に格納されています。

  • Apache:/var/log/apache2/error.log
  • NGINX:/var/log/nginx/error.log

Kinstaのお客様は、MyKinstaの分析画面で500番台のエラーの発生回数と頻度を把握することができます。トラブルシューティングすべき進行形のエラーなのか、解決済みのエラーなのかを確認できます。

500番台エラーの内訳
500番台エラーの内訳

PHPの致命的な問題が原因で、500エラーが発生している場合、PHPのエラー報告を有効にすることもできます。エラーが出ているファイルに以下のコードを貼り付けるだけでOKです。Google Chromeのデベロッパーツールの「コンソール」タブでファイルを特定ことができます。

ini_set('display_errors', 1);	 	 
ini_set('display_startup_errors', 1);	 	 
error_reporting(E_ALL);

または、php.iniファイルを以下のように変更する必要がある場合もあります。

display_errors = on

4. データベース接続の確立にエラーがないか確認する

「500 Internal Server Error」エラーは、データベースの接続確立エラーが原因で発生することもあります。ブラウザによって異なる場合もありますが、サーバーログでは両方のエラーが500のステータスコードが記録されます。

以下は、「データベース接続確立エラー」の表示例です。接続が正常に動作していないため、ページをレンダリングするためのデータを取得できず、ページが完全に空白になります。これにより、サイトのフロントエンドが破損するだけでなく、WordPressの管理画面にもアクセスできなくなります。

「データベース接続確立エラー」の表示例
「データベース接続確立エラー」の表示例

これには、以下のような原因が考えられます。

  • データベースログイン認証情報の誤り─MySQLデータベースに接続するためのログイン情報は、WordPressサイトのログイン情報とは異なる。
  • データベースの破損─テーマやプラグイン、ユーザーによる削除やインストールなど、多くの可動部分があることによって、データベースが破損することがある。1つのテーブルが欠落または破損しているか、またはたまたま一部の情報が削除された可能性がある。
  • WordPressファイルの破損─ハッキングによって起こることもある。
  • データベースサーバーに関するエラー─トラフィックの急増によりデータベースに過負荷がかかる、同時接続数が限界を超えるなど、ウェブホストの問題が発生している可能性がある。サーバーリソースを複数のユーザーで共有する共用サーバーでは頻繁に発生する。

WordPressサイトの「データベース接続確立エラー」の解決方法はこちらでご紹介しています。

5. プラグインとテーマを確認する

サードパーティのプラグインまたはテーマのインストール、または更新によって、500エラーが発生しているかもしれません。スライダープラグインや広告管理プラグインまで、あらゆるプラグインでエラーが発生する可能性があります。このような事態を防ぐため、プラグインやテーマの更新には、常にステージング環境を使用すること、少なくとも1つずつ更新を実行してください。

トラブルシューティングを行うには、まずすべてのプラグインを無効にします。WordPress管理画面にアクセスできる場合は、「プラグイン」画面を開き、「一括操作」ドロップダウンの「無効化」を選択し、「適用」をクリックすると、すべてのプラグインが無効化されます。

すべてのプラグインを無効化
すべてのプラグインを無効化

これでエラーが解消される場合は、プラグインに原因があることがわかります。プラグインを1つずつ有効化し、その都度サイトを再読み込みします。有効化して「500 Internal Server Error」エラーが再発したものが問題のあるプラグインです。プラグインを特定したら、開発元に問い合わせるか、WordPressリポジトリのサポートを利用してください。

WordPress管理画面にアクセスできない場合は、FTP経由でサーバーにログインし、プラグイン(plugins)フォルダの名前を「plugins_old」などに変更して無効化します。その後、サイトにアクセスしてエラーが消えている場合は、プラグインを1つずつテストしていきます。先ほどのフォルダ名を「plugins」に戻し、中に格納されている各プラグインのフォルダ名を順番に変更します。ステージングサイトするのでもOKです。

プラグインのフォルダ名を変更する
プラグインのフォルダ名を変更する

プラグイン、テーマ、WordPressのコアは、常に最新の状態に保つようにしましょう。また、使用中のPHPバージョンがサポートされていることも確認してください。プラグインのコードに問題がある場合は、WordPress開発者に対応してもらう必要があるかもしれません。

6. WordPressのコアを再インストールする

長年運営しているサイトの場合、WordPressのコアファイルが破損していることもあります。プラグインやテーマに影響を与えずにWordPressのコアだけを再アップロードするのは非常に簡単です。WordPressを再インストールする5つの方法はこちらをご覧ください。実行前にはバックアップの作成をお忘れなく。

7. アクセス権限のエラー

サーバー上のファイルまたはフォルダに対するアクセス権限のエラーにより、500エラーが発生することもあります。WordPressのファイルとフォルダのアクセス権限に関しては以下が推奨されます。

  • すべてのファイルを644(-rw-r–r–)または640に設定する
  • すべてのディレクトリを755(drwxr-xr-x)または750に設定する
  • ディレクトリには777を設定しない
  • wp-config.phpは、サーバー上の他のユーザーが読み取ることができないよう、440または400に設定する

この詳細は、WordPress Codexのファイル権限の変更を参照してください。

FTPクライアントを使用すると、ファイルのアクセス権限を確認しやすくなります(以下参照)。また、ファイルが正しく設定されているかどうか、ホスティング会社のカスタマーサポートに問い合わせ、フォルダおよびファイルの権限をgrepしてもらうこともできます。

SFTPでのファイル権限
SFTPでのファイル権限

8. PHPのメモリ制限

サーバーのPHPメモリ制限を超過することで、エラーが発生しているかもしれません。この場合は、メモリ制限を引き上げてみてください。以下、cPanel、Apache、php.iniファイル、および wp-config.phpファイルでメモリ制限を増やす方法をご紹介します。

cPanelでPHPメモリの制限を増やす方法

cPanelを使用するホスティングをご利用の場合、ユーザーインターフェースから変更可能です。「ソフトウェア」セクションの「Select PHP Version(PHPバージョンの選択)」をクリックします。

PHPバージョンを選択
PHPバージョンを選択

「Switch to PHP Options(PHPオプションを切り替える)」をクリックします。

PHPオプションの切り替え
PHPオプションの切り替え

memory_limit属性をクリックして値を変更し、「Save(保存)」をクリックします。

cPanelでPHPメモリの制限を増やす
cPanelでPHPメモリの制限を増やす

ApacheでPHPメモリの制限を増やす方法

.htaccessファイルは、ディレクトリのレベルまでサーバーの動作を変更できる隠しファイルです。FTPまたはSSH経由でウェブサイトにログインし、ルートディレクトリに.htaccessファイルがあるかを確認します。

.htaccessファイル
.htaccessファイル

.htaccessファイルがある場合は、PHPのメモリ制限を増やす以下のコードを編集します。おそらく64M以下に設定されているため、値を増やしてみてください。

php_value memory_limit 128M

php.iniファイルでPHPメモリの制限を増やす方法

上記の操作が難しい場合は、php.iniファイルを編集してみてください。FTPまたはSSH経由でウェブサイトにログインし、ルートディレクトリにアクセスして、 php.iniファイルを開くか作成します。

php.iniファイル
php.iniファイル

ファイルが既に存在する場合は、以下の3つの設定を検索し、必要に応じて変更してください。ファイルを作成した場合は、以下のコードを貼り付け、必要に応じて値を変更します。

memory_limit = 128M

共用サーバーを利用している場合、この.htaccessファイルの設定を機能させるためには、php.iniファイルにsuPHPディレクティブを追加する必要があるかもしれません。これには、サイトのルートにある.htaccessファイルを編集し、ファイルの先頭に以下のコードを貼り付けます。

<IfModule mod_suphp.c> 
suPHP_ConfigPath /home/yourusername/public_html
</IfModule> 	 

この作業が行えない場合、ホスティング会社がグローバル設定をロックし、.user.iniファイルを使用して設定を行っていることも考えられます。.user.iniファイルを編集するには、 FTPまたはSSH経由でウェブサイトにログインし、ルートディレクトリにアクセスして、.user.iniファイルを開くか作成します。以下のコードを貼り付けてください。

memory_limit = 128M

wp-config.phpでPHPメモリの制限を増やす方法

上記すべての操作が実行できない場合は、FTPまたはSSH経由でウェブサイトにログインし、ルートディレクトリにあるwp-config.phpファイルを見つけます。

wp-config.phpファイル
wp-config.phpファイル

wp-config.phpファイルの先頭に以下のコードを貼り付けます。

define('WP_MEMORY_LIMIT', '128M');

あるいは、メモリ制限を超過しているかどうかをホスティング会社に問い合わせるという方法もあります。Kinstaでは、独自のアプリケーションパフォーマンス監視(APM)ツールやその他のトラブルシューティング方法を活用して、制限を超過するプラグイン、クエリ、またはスクリプトを特定します。独自のNew Relicキーを使用することも可能です。

New Relicを使用しデバッグ
New Relicを使用しデバッグ

9. .htaccessファイルのエラー

Kinstaはnginxのみを利用していますが、Apacheを使用するWordPressホスティングをご利用の場合、.htaccessファイルでエラーが発生しているか、ファイルが破損していることもあります。次の手順に従って、ファイルを作成し直してみてください。

FTPまたはSSH経由でウェブサイトにログインし、.htaccessファイルの名前を.htaccess_oldに変更します。

.htaccessファイルの名前を変更する
.htaccessファイルの名前を変更する

このファイルを再作成するには、通常WordPressのパーマリンクを再保存するだけでOKですが、500エラーによりWordPress管理画面にアクセスできない場合は不可能です。.htaccessファイルを新規作成して以下の内容を貼り付け、サーバーにアップロードする必要があります。

# BEGIN WordPress	 	 
RewriteEngine On	 	 
RewriteBase /	 	 
RewriteRule ^index\.php$ - [L]	 	 
RewriteCond %{REQUEST_FILENAME} !-f	 	 
RewriteCond %{REQUEST_FILENAME} !-d	 	 
RewriteRule . /index.php [L]	 	 
# END WordPress

マルチサイト用のデフォルトの.htaccessファイルなど、そのほかの状況に関してはWordPress Codexを参照してください。

10. CGI/Perlスクリプトのコーディングまたは構文エラー

CGIおよびPerlによる500エラーの発生は、最近ではあまり見られなくなりましたが、ワンクリックCGIスクリプトの多いcPanelを利用している場合には、考慮する価値があります。Stack OverflowのAEMは以下のように述べています(英語原文の日本語訳)。

CGIは、PHPやmod_perlのようなApacheの拡張機能、Java EE、Struts、SpringなどのJavaフレームワーク、PythonベースのDjango、Ruby on Railsやその他のRubyフレームワーク、さらにはMicrosoftのさまざまな技術を含む、多種多様なウェブプログラミング技術に取って代わられました

CGIスクリプトを利用している場合は、以下を参考にしてみてください。

  • 編集時には、AtomSublimeNotepad++などのプレーンテキストエディターを使用することで、ASCII形式を守ることができる。
  • CGIスクリプトとディレクトリでchmod 755の正しい権限が使用されているかを確認する。
  • サーバーのcgi-binディレクトリに、CGIスクリプトをASCIIモードでアップロードする(FTPエディタで選択可能)。
  • スクリプトに必要なPerlモジュールがインストール済みで、サポートされていることを確認する。

11. ホスティング会社にサーバーエラーを確認する

500エラーは、PHPのタイムアウトやサードパーティプラグインの致命的なPHPエラーによって引き起こされることがあるため、ご利用中のホスティング会社に問い合わせるのも有効です。以下のような問題は、専門的になるため、自分ではトラブルシューティングが難しい場合があります。

PHP message: PHP Fatal error: Uncaught Error: Call to undefined function mysql_error()...
PHP message: PHP Fatal error: Uncaught Error: Cannot use object of type WP_Error as array in /www/folder/web/shared/content/plugins/plugin/functions.php:525

Kinstaでは、すべてのお客様のウェブサイトを監視し、このようなエラーの発生時は、自動的に通知を受信します。エラーの検知後、専任エンジニアがすぐに対処を開始します。また各サイトには、LXDで管理されたホストと、LXCソフトウェアコンテナを使用しており、すべてのWordPressサイトが必要なソフトウェアリソース(Linux、nginx、PHP、MySQL)を備えた独自のコンテナで実行されます。完全専用リソースにより、他のユーザーと(自分の他のサイトとすら)共有されることはありません。

この状況では、504エラーが発生する方が一般的ですが、ワーカープロセスの不足がPHPのタイムアウトを引き起こしているかもしれません。ワーカープロセスは、サイトが同時に処理できるリクエストの数を決定するもので、キャッシュされていないリクエストは、すべてワーカープロセスによって処理されます。

ワーカープロセスが忙しくなると、リクエストがキューに溜まります。ワーカープロセスの上限に達すると、キューが古いリクエストを削除し始めるため、これが原因で500エラーが発生したり、リクエストが完了しなかったりすることがあります。ワーカープロセスの詳細はこちらをご覧ください。

ウェブサイトの監視

エラーの再発を防ぐには、updown.ioのようなツールを利用してサイトを監視し、エラー発生時に通知を受け取ることができます。このツールは、定期的にHTTPのHEADリクエストを選択したURL(サイトのトップページ推奨)に送信して監視してくれます。監視頻度は以下から選択可能です。

  • 15秒
  • 30秒
  • 1分
  • 2分
  • 5分
  • 10分

サイトがダウンすると、以下のようなメール通知を受け取ることができます。

500エラーのメール通信
500エラーのメール通信

不備のあるプラグインをデバッグしようとしている場合や、サーバーを混雑させる傾向のある共用サーバーを利用している場合には、特におすすめです。サイトがどのくらいの頻度でダウンしているかを把握することができます。

とはいえ、ウェブサイトの高い稼働率を確保するには、マネージドWordPressホスティングを強くおすすめします。

まとめ

「500 Internal Server Error」エラーの発生は厄介ですが、この記事に従ってトラブルシューティングを行えば、迅速に解決できるはずです。通常このエラーは、サードパーティプラグイン、致命的なPHPエラー、データベース接続確立エラー、.htaccessファイルの制限、PHPのメモリ制限、あるいはPHPのタイムアウトが原因です。

Brian Jackson

Brianの最大の情熱の一つは10年以上使用してきたWordPressです。複数のプレミアムプラグインさえ開発しています。Brianの趣味はブログや映画やハイキングなどです。TwitterでBrianとつながりましょう。