Laravelステージング環境でHTTP 500エラーが出た原因と解決記録

症状

Laravelステージング環境にアクセスすると、

  • ブラウザ:HTTP 500 エラー(Laravelが用意したエラーページでない)
  • Apacheログにも原因が出ない

CLIでは Laravel は正常に動作していた。

php artisan route:list → OK

つまり、Laravel自体は動いているが、Webアクセスだけ失敗するという状態だった。

結論(原因)

今回の500エラーの原因は .env ファイルをWebサーバー(apacheユーザー)が読めてなかった。

その結果、

MissingAppKeyException
No application encryption key has been specified

が発生してLaravelが起動できず、HTTP 500になっていた。

さらに、storage と bootstrap/cache の書き込み権限不足も重なり、上記のエラーログが出ず原因特定が難しくなっていた。

実際のログはこれ

production.ERROR: No application encryption key has been specified.
MissingAppKeyException

APP_KEYは .env に書いてあったが、Web実行ユーザー apache が .env を読めなかったため「存在しない扱い」になっていた。

問題だった権限状態

-rw-r----- ユーザ名 ユーザー名 .env

Web実行ユーザーは apache:apache なので apache は .env を読めない。

解決手順

1. .env を apache が読めるようにする

sudo chgrp apache /var/www/html/naming-dic-laravel/.env
sudo chmod 640 /var/www/html/naming-dic-laravel/.env

これで次のようになり読み取り可能。

-rw-r----- ユーザー名 apache .env

2. Laravel必須ディレクトリの権限修正

sudo chown -R apache:apache storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache

Laravelは以下に書き込めないと正常に動かない

  • storage/logs
  • cache
  • compiled views
  • sessions

3. キャッシュクリア

php artisan optimize:clear

なぜ最初は原因が見えなかったのか

今回の500エラーはLaravel側の設定ミスだったが、最初はApacheの問題のように見えた。理由はシンプルでLaravelがログを書けない状態だったから。

storage と bootstrap/cache に書き込み権限がなかったため、

  • laravel.log が更新されない
  • 例外が記録されない
  • Laravelのエラー画面も出ない
  • Apache側の500に見える

という状態になっていた。

今後、LaravelのHTTP 500エラーが起こった時は、LaravelログとApacheログの両方を確認する。どちらにもエラーが残ってない場合、権限の問題でLaravelログが書き込めない状態になっている可能性を疑う。storage や bootstrap/cache が書き込み可能かを確認して権限を変更する。

タイトルとURLをコピーしました