PHPのサイトで「HTTP 500」が出たときに、エラーログの見方から.htaccess・PHPの設定・パーミッション・WordPressのプラグインまで、原因を順番に切り分ける手順を、数百件の対応経験をもとに解説します。
こんな悩みありませんか?
「突然サイトにアクセスできなくなった」「真っ白な画面に500 Internal Server Errorと表示される」「お客様からサイトが見れないと連絡があった」
このような経験をお持ちのWeb担当者の方は多いのではないでしょうか。HTTP 500エラーは最も厄介なエラーの一つで、原因の特定が困難なため多くの方が頭を抱えています。
神奈川でWeb制作を20年以上続けてきた弊社では、これまで数百件のHTTP 500エラーに対応してきました。そこで今回は、実際の現場で培ったノウハウを基に、500エラーの原因特定から解決まで体系的にご説明します。
HTTP 500エラーとは?原因の全体像を把握しよう
HTTP 500 Internal Server Errorは「サーバー内部エラー」を意味し、Webサーバーが何らかの理由でリクエストを正常に処理できない状態を示しています。
なぜ500エラーは厄介なのか
通常のHTTPエラー(404 Not Found等)と違い、500エラーは具体的な原因が表示されません。これはセキュリティ上の理由で、サーバーの詳細な情報を外部に晒すことを防ぐためです。
実際のクライアント事例では、ECサイトで500エラーが発生し、1時間で約50万円の売上機会を逃したケースもありました。このような事態を防ぐため、迅速な原因特定と解決が必要です。
主要な原因パターン
弊社の経験では、500エラーの原因は以下の順序で発生頻度が高くなっています:
- .htaccessファイルの記述エラー(35%)
- ファイル・ディレクトリのパーミッション設定(25%)
- PHP設定・メモリ不足(20%)
- プラグイン・スクリプトのエラー(12%)
- サーバー設定の問題(5%)
- その他(3%)
実践的な原因特定手順
Step 1: エラーログの確認
まず最初に行うべきはエラーログの確認です。これが最も確実で効率的な方法です。
Pleskの場合
# Pleskでのエラーログ確認方法
1. Pleskにログイン
2. ドメイン選択
3. 「ログ」→「エラーログ」を確認
cPanelの場合
# cPanelでのエラーログ確認
1. cPanelにログイン
2. 「メトリクス」→「エラー」を選択
3. 最新のエラーを確認
SSHでの直接確認
# Apacheのエラーログ確認(Debian/Ubuntuの場所。RHEL系は /var/log/httpd/error_log)
tail -f /var/log/apache2/error.log
# nginx + PHP-FPMの場合
tail -f /var/log/nginx/error.log
# 特定ドメインのエラーログ(Plesk環境)
tail -f /var/www/vhosts/yourdomain.com/logs/error_log
あるクライアントでは、エラーログを確認することで「.htaccessの3行目でRewriteRuleの記述にエラーがある」ことが即座に判明し、5分で解決できました。
Step 2: 段階的な切り分け
エラーログが確認できない場合は、以下の順序で原因を切り分けます。
2-1. .htaccessファイルのチェック
.htaccessは最も頻繁に500エラーの原因となるファイルです。
# .htaccessファイルを一時的にリネーム
mv .htaccess .htaccess_backup
サイトが正常に表示されれば、.htaccessが原因です。
よくある.htaccessエラーパターン:
# NG例: RewriteEngineの記述ミス(「e」が抜けている)
RewriteEngin On
# OK例
RewriteEngine On
# NG例: 条件なしで全URLを書き換える
# (index.php自体も書き換え対象になり、内部リダイレクトのループで500になる)
RewriteRule ^(.*)$ index.php [QSA,L]
# OK例: 実在するファイル・ディレクトリは書き換えない
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
※.htaccessでは、設定と同じ行にコメント(#)を書けません。行末にコメントを書くと、それ自体が500エラーの原因になります。ループのときは、エラーログに exceeded the limit of 10 internal redirects と出ます。
2-2. ファイルパーミッションの確認
パーミッション設定は2番目に多い原因です。特にFTPでファイルをアップロードした際に発生しがちです。
# 適切なパーミッション設定
find /path/to/website -type f -exec chmod 644 {} \; # ファイル
find /path/to/website -type d -exec chmod 755 {} \; # ディレクトリ
# CGIスクリプトの場合
chmod 755 script.cgi
危険なパーミッション例:
# 絶対にやってはいけない設定
chmod 777 * # セキュリティリスクが高い
# ファイルに実行権限を付与(通常不要)
chmod 755 index.html # HTMLファイルに実行権限は不要
Step 3: PHP関連の問題をチェック
3-1. PHPエラーの表示設定
PHPエラーが原因の場合、以下の設定で詳細を確認できます。
<?php
// デバッグ用の設定(本番では使用禁止)
ini_set('display_errors', 1);
error_reporting(E_ALL);
// この下に問題のあるコードを配置してテスト
?>
ただし、実行中に設定するため、同じファイルの構文エラー(Parse error)は表示されません。 500エラーの原因として多い構文エラーは、まずエラーログ(log_errors)で確認します。画面に出す必要があるときは、php.ini・.user.ini・Pleskの「PHP設定」で一時的に有効にし、確認後すぐ戻してください。
3-2. メモリ不足の解決
PHPメモリ不足も頻繁に発生する問題です。
; php.ini または .user.ini で設定する場合
memory_limit = 512M
// WordPressなら wp-config.php でも指定できます
define('WP_MEMORY_LIMIT', '256M');
注意: .htaccessにphp_value memory_limit 512Mと書く方法は、Apacheのモジュール版PHP(mod_php)でしか使えません。PHP-FPMやFastCGIで動いているサーバー(Pleskの標準など)では、Invalid command 'php_value' というエラーになり、それ自体が500エラーの原因になります。Pleskなら管理画面の「PHP設定」で変えます。
実際の事例では、WordPressサイトでプラグインを大量にインストールしたことでメモリ不足が発生。メモリ制限を128MBから512MBに変更することで解決しました。
3-3. PHPバージョン互換性
古いスクリプトを新しいPHPバージョンで実行すると500エラーが発生することがあります。
// PHP 5.3で非推奨、PHP 7.0で削除された関数の例
// NG: PHP 7.0以降では Fatal error → 500
split('/', $path);
mysql_connect($host, $user, $pass);
// OK: 代替関数を使用
explode('/', $path);
// mysql_* の代わりに PDO か mysqli を使う
// PHP 8.0で削除された関数の例(呼ぶと Fatal error → 500)
// each()、create_function() など
環境別の具体的な解決手順
Plesk + Apache環境での解決法
Plesk環境では以下の手順で体系的に原因を特定できます。
1. Plesk管理画面にログイン
2. 該当ドメインを選択
3. 「ファイル」→「ファイルマネージャー」
4. httpdocsフォルダを確認
5. .htaccessファイルの存在確認
6. 「ログ」でエラー詳細を確認
WordPress特有の500エラー対処法
WordPressでは以下の順序でチェックします:
// wp-config.phpにデバッグ設定を追加(調査が終わったら WP_DEBUG を false に戻す)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true); // wp-content/debug.log に出力される(誰でも見られるので調査後に削除)
define('WP_DEBUG_DISPLAY', false);
# プラグインの一時無効化(wp-content で実行)
mv plugins plugins_disabled
WordPressの500エラー解決手順:
- プラグインを全て無効化
- テーマをデフォルトに変更
- .htaccessを初期化
- wp-config.phpの設定確認
あるクライアントでは、セキュリティプラグインが原因で500エラーが発生。プラグインを一つずつ有効化することで原因を特定し、設定を調整して解決しました。
よくある失敗パターンと対処法
失敗パターン1: パニックになってファイルを削除
よくある失敗: エラーが発生すると慌ててファイルを削除してしまい、かえって状況を悪化させる。
正しい対処:
# 必ずバックアップを取ってから作業
cp -r website_folder website_backup_$(date +%Y%m%d)
# ファイルは削除せず、リネームで無効化
mv .htaccess .htaccess_backup
mv problematic_plugin.php problematic_plugin.php.disabled
失敗パターン2: 複数の原因を同時に修正
よくある失敗: 複数の設定を同時に変更し、何が効果的だったかわからなくなる。
正しい対処:
# 一つずつ段階的に修正
1. .htaccessをチェック → テスト
2. パーミッションをチェック → テスト
3. PHP設定をチェック → テスト
失敗パターン3: chmod 777の乱用
危険な対処:
# 絶対にやってはいけない
chmod 777 -R *
正しいパーミッション設定:
# セキュアな設定
find . -type f -name "*.php" -exec chmod 644 {} \;
find . -type f -name "*.html" -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
# 設定ファイルはより厳格に(PHPの実行ユーザーが読める権限にする。読めないと500になる)
chmod 440 wp-config.php
chmod 440 .env
高度なトラブルシューティング
サーバーリソース監視
# CPU・メモリ使用率確認
top
# ディスク使用量確認
df -h
# Apache プロセス確認
ps aux | grep apache
# 500を返したリクエストをリアルタイム監視(ステータスはアクセスログに記録される)
tail -f /var/log/apache2/access.log | awk '$9 == 500'
.htaccessの段階的テスト
# 最小構成の.htaccessから開始
RewriteEngine On
# 動作確認後、段階的に追加
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 最後に複雑なルールを追加
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
予防策と監視体制の構築
定期的な健全性チェック
#!/bin/bash
# サイト監視スクリプト例
URL="https://yoursite.com"
STATUS=$(curl -sL --max-time 10 -o /dev/null -w "%{http_code}" "$URL")
# 5xx と、つながらなかった場合(000)を記録する
if [ "$STATUS" -ge 500 ] || [ "$STATUS" = "000" ]; then
echo "500エラー検出: $(date)" >> /var/log/site_monitor.log
# メール通知やSlack通知を実装
fi
バックアップ戦略
#!/bin/bash
# 自動バックアップスクリプト
BACKUP_DIR="/backups/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# ファイルバックアップ
tar -czf $BACKUP_DIR/files.tar.gz /var/www/html/
# データベースバックアップ
# (-p はパスワードを聞いてくるため自動実行では止まる。~/.my.cnf に接続情報を置いて読む)
mysqldump --defaults-extra-file=~/.my.cnf --single-transaction database_name > "$BACKUP_DIR/database.sql"
まとめと次のステップ
HTTP 500エラーは確かに厄介ですが、体系的なアプローチにより必ず解決できます。弊社の経験では、適切な手順に従うことで95%以上のケースで1時間以内に解決できています。
重要なのは、パニックにならず段階的に原因を切り分けることです。エラーログの確認から始まり、.htaccess、パーミッション、PHP設定の順で確認することで、効率的に解決できます。
今すぐ実行すべきチェックリスト
より高度な対応が必要な場合
- サーバー設定レベルの問題
- 複雑なアプリケーションエラー
- パフォーマンスチューニング
- セキュリティ関連の設定
これらの問題でお困りの場合は、専門的な知識と経験が必要です。弊社では20年以上のWeb開発・運用実績を基に、迅速かつ確実な解決をサポートいたします。
次のアクション:
- まずは上記のチェックリストを実行
- 解決しない場合は専門家への相談を検討
- 予防策として監視・バックアップ体制を整備
500エラーでお困りの際は、まずは落ち着いて段階的なアプローチを試してみてください。それでも解決しない場合は、お気軽にご相談いただければと思います。
トラブル対応・復旧
自分で直すのが難しいと感じたら
エラーの原因調査から復旧、再発防止まで対応します。急ぎの場合は、フォームで「緊急対応希望」にチェックを入れて送ってください。
関連するエラー解決記事
このサイトでは他にもサーバーエラーの解決記事を公開しています:
- 【解決】HTTP 421 Misdirected Requestエラーの原因と直し方 - SSL証明書やドメイン設定が原因のエラー
- nginx 502 Bad Gatewayエラーの原因と解決方法 - PHP-FPMやプロキシ設定の問題
- SSL証明書エラーの完全対処ガイド - 証明書の期限切れや設定ミス
- WordPress白画面(WSOD)の復旧方法 - 真っ白になった時の対処法
- Laravel SQLSTATEエラー解決ガイド - データベース接続エラー
お困りですか? サーバーエラーでお困りの場合は、無料相談をご利用ください。20年の実績で迅速に解決します。