Laravelのサイトにアクセスしたときに500エラーが発生することがありますよね。
基本的には、エラーログを見れば原因がわかるのですが、厄介なのがログには何も出力されないというケース。
そこで、Laravelで500エラーが発生する原因とその調べ方をまとめます。
Laravelのエラーログを確認する
500エラーが発生したら、まずはLaravelのエラーログを確認します。
Laravelのログは、標準設定だと <Laravelルート>/storage/logs/laravel.log に出力されます。
例えば、Laravelのルートディレクトリが /var/www/laravel のときは、/var/www/laravel/storage/logs/laravel.log となります。
以下は、DBのIPアドレスやポートが間違っていた時に出力されるエラーの例です。
[2021-04-18 05:42:42] production.ERROR: SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users` where `email` = info@egatech.net limit 1) {"exception":"[object] (Illuminate\\Database\\QueryException(code: 2002): SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users` where `email` = info@egatech.net limit 1) at /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php:678)
[stacktrace]
#0 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(752): Illuminate\\Database\\Connection->runQueryCallback()
#1 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(732): Illuminate\\Database\\Connection->tryAgainIfCausedByLostConnection()
#2 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(641): Illuminate\\Database\\Connection->handleQueryException()
#3 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Connection.php(346): Illuminate\\Database\\Connection->run()
#4 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2313): Illuminate\\Database\\Connection->select()
#5 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2301): Illuminate\\Database\\Query\\Builder->runSelect()
#6 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2796): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}()
#7 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2302): Illuminate\\Database\\Query\\Builder->onceWithColumns()
#8 /var/www/laravel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(588): Illuminate\\Database\\Query\\Builder->get()
vendorディレクトリの内容を確認する
laravel.logに何も出力されていない場合は、別の方法で調査します。
Laravelが参照する各種PHPライブラリがvendorディレクトリに存在するかどうかを確認します。
vendorディレクトリがないときは、composerコマンドでライブラリをインストールします。
$ cd /var/www/laravel
$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 105 installs, 0 updates, 0 removals
- Installing doctrine/inflector (2.0.3): Extracting archive
- Installing doctrine/lexer (1.2.1): Extracting archive
- Installing symfony/polyfill-ctype (v1.22.1): Extracting archive
- Installing webmozart/assert (1.10.0): Extracting archive
- Installing dragonmantank/cron-expression (v3.1.0): Extracting archive
- Installing symfony/polyfill-php80 (v1.22.1): Extracting archive
- Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive
- Installing symfony/var-dumper (v5.2.6): Extracting archive
- Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive
- Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive
- Installing symfony/string (v5.2.6): Extracting archive
- Installing psr/container (1.1.1): Extracting archive
- Installing symfony/service-contracts (v2.2.0): Extracting archive
- Installing symfony/polyfill-php73 (v1.22.1): Extracting archive
- Installing symfony/console (v5.2.6): Extracting archive
- Installing psr/log (1.1.3): Extracting archive
- Installing monolog/monolog (2.2.0): Extracting archive
(中略)
Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
なお、vendorディレクトリがないときは、Laravelのエラー画面ではなく、ブラウザのエラー画面が表示されるので、エラー画面から判別することもできます。
.envファイルがあるかどうかを確認する
Laravelの設定ファイルは、<Laravelルート>ディレクトリ直下にある .env です。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
(以下略)
.envは環境ごとに変更する設定ファイルになるので、.gitignoreに入れ、Gitでは管理しません。
Laravelセットアップ時は.envを配置し、環境に応じた内容に設定する必要があります。
.envファイルの構文エラーがないかを確認する
.envファイルに構文エラーがないかを確認します。
間違えやすいのが、APP_NAMEのような自由なテキストを記述できる設定項目。
次のような設定は構文エラーとなり、500エラーが発生します。
APP_NAME=Laravel Study
APP_URL=localhost
スペースを含む文字列を値に指定する場合は、””で囲みます。また、APP_URLはドメイン名ではなく、http(s):// から始まるURLを指定します。
以下が正しい設定です。
APP_NAME="Laravel Study"
APP_URL=http://localhost
.envファイルの設定エラーに注意
「どのページもエラー」という場合は、.envやvendorディレクトリなど、環境設定を重点的にチェックしましょう。