Laravelで500エラーが発生する原因は?調査方法を解説

Laravel

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()

storageディレクトリへの書き込み権限がないときは、laravel.logファイル自体が出力できません。storageディレクトリ内のオーナー・グループをapacheに設定して、ログファイルがLaravelから出力できるようにします。または、.env ファイルで APP_DEBUG=true に設定すると、エラーの内容が画面上に表示されるようになります。

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のエラー画面ではなく、ブラウザのエラー画面が表示されるので、エラー画面から判別することもできます。

Laravelのスターターアプリでは、vendorディレクトリが.gitignoreに指定されています。スターターアプリをベースに開発したアプリケーションの場合、GitからCloneしただけではvendorディレクトリはありません。

.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ファイルの構文エラーがないかを確認する

.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ファイルの設定エラーに注意

「どのページもエラー」という場合は、.envやvendorディレクトリなど、環境設定を重点的にチェックしましょう。