症状
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 が書き込み可能かを確認して権限を変更する。
