スポンサーリンク

Laravel Homestead 問題対処まとめ

Web系

Vagrantで動作するLaravelの開発環境であるHomesteadにおいて、私が躓いたことをまとめています。同じような問題で困っている方の解決策となれば幸いです。

マイグレーション実行時等に”Access denied for user ‘root’@’localhost'”のエラーが発生する

Homestead.yamlに記載されているデータベース接続情報を下記のように修正します。

DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

“npm install”を実行した時に”ENOENT: no such file or directory,…”のエラーが発生する

HomesteadにSSHで接続したコンソール上(仮想環境上)ではなく、別で起動したコンソール(コマンドプロンプトやPowerShellなど)でホスト上のLaravelアプリケーションディレクトリまで移動して、コマンドを実行します。

HomesteadにphpMyAdminを導入した際、大量のwarningが表示される

下記を参考にphpMyAdminを導入してみました。

laravelのhomesteadにphpmyadminを導入した - Qiita
前に導入したものが動かなくなり入れなおそうとしたら手順を忘れていたのでここに書くことで調べる手間を省こうと思う 前提 os win 10 vagrant /Oracle VM VirtualBox/composer が導入済みで...

しかし、http://homestead.phpmyadmin にアクセスすると、大量のwarningが表示され、まともに使える状況ではありませんでした。

これを解決するには、下記を参考にして手動でphpMyAdminのバージョンアップを行います。

How to Manually Upgrade phpMyAdmin | DevAnswers.co
How to manually update phpMyAdmin to the latest version. This may be necessary if the repository has an older version and you're having compatibility issues.

再度、phpMyAdminのログイン画面へアクセスするとwarningが消えました。なお、「tmpへのアクセスが出来ない」という警告が出ると思いますが、これは下記コマンドをHomestead上で実行することで解決します。

$ sudo chmod a+w /var/lib/phpmyadmin/tmp/

Homestead + Xdebug + VisualStudioCodeで上手くデバッグ出来ない

VSCodeのデバッグ設定ファイル(launch.js)の編集

※Homeateadの”code”ディレクトリ内において”Laravel”というディレクトリ名でプロジェクトを作成(Laravelをインストール)した場合の記述です。個々の環境に合わせて下さい。

{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9001,
      "pathMappings": {
        "/home/vagrant/code/Laravel": "${workspaceRoot}"
      }
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "program": "${file}",
      "cwd": "${fileDirname}",
      "port": 9001
    }
  ]
}

Homestead.yamlでPHPバージョンを指定(任意)

指定しないと自動的に最新バージョンが使われます。

※Homeateadの”code”ディレクトリ内において”Laravel”というディレクトリ名でプロジェクトを作成(Laravelをインストール)した場合の記述です。個々の環境に合わせて下さい。

sites:
    - map: homestead.test
      to: /home/vagrant/code/Laravel/public
      php: "7.2"

Homestead(vagrant上)でxdebug.iniの編集

PHPのバージョンにあったファイルを編集します。※ここでは7.2

$ sudo vi /etc/php/7.2/fpm/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9001
xdebug.max_nesting_level = 512
$ php-fpm7.2 -i | grep xdebug

下記のようにxdebugがenabledになっていることを確認出来ればデバッグ可能であるはずです。

/etc/php/7.2/fpm/conf.d/20-xdebug.ini,
xdebug
xdebug support => enabled
xdebug.auto_trace => Off => Off
:
:

設定を終えてもブレークポイントで止まらない場合

WindowsではVSCodeが仮想環境のサーバーと初めて通信される際に、Windowsファイアウォールの警告が表示されるはずです。私は「プライベートネットワーク」にのみチェックを入れたことが原因で問題が発生しました。

コントロールパネルの「Windows Defender ファイアウォール」を開くと、プライベートネットワークは”接続されていません”で、パブリックネットワークは”接続されています”になっていました。確かにこの状態では繋がらないはずです。

「Windows Defender ファイアウォール」設定画面の左サイドバーにある「Windows Defender ファイアウォールを介したアプリまたは機能を許可」をクリックして”code.exe”を探し、”パブリック”にチェックを入れたことにより通信が許可され、デバッグ出来るようになりました。

メール送信時に”Cannot send message without a sender address”のエラーが発生する

Homesteadの場合は、”.env”ファイルを下記のように記述します。

MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

さらに、Laravel6では「送信者アドレスなしでメッセージを送信できない」という仕様の為、送信元メールアドレス(適当でOK)も追記します。

MAIL_FROM_ADDRESS=user@example.com

Homedteadでの開発環境にてメール送信の処理を実行してもメールが届かない

外部SMTPを使って送信しなければ、仮想環境内にメールが溜まります。

下記にアクセスすればメールを確認出来ます。なお、仮想環境の終了や再起動と共に蓄積されたメールは消えます。

http://homestead.test:8025

ファイルアップロードの処理を実行した際に”413 Request Entity Too Large”というエラーが発生する

HomesteadのNginxの設定を変更します。

$ sudo vi /etc/nginx/nginx.conf

下記を追記して下さい。※数値は目安です

http {
    client_max_body_size 100M;
}

NginxまたはHomesteadを再起動すれば完了です。

ログイン時の認証などで419エラーが出る

下記の環境で発生します。

  • envの”SESSION_SECURE_COOKIE”が”true”
  • httpで通信する

私の場合は、ローカルの開発環境で作業してから本番デプロイ前に”SESSION_SECURE_COOKIE”を”true”に変更し、その後で開発環境にて作業を続行しようとした際に問題が発生しました。(セキュリティ強化の為にCookieはセキュアに配信すべきです。)

Homesteadではhttpで通信していましたが、secure属性のCookieはhttpsの時しか送信されなくなります。よって、トークンミスマッチが発生し、エラーになります。

対策としては、下記どちらかになります。

  • 自己証明書を入れてhttpsで通信できるようにする
  • envを分けて開発環境と本番環境で設定値を変える

後者について参考になる記事があります。

[Laravel 5.5] 読み込む.envファイルを環境ごとに切り替える - Qiita
2通りの方法 方法1 サーバー環境変数APP_ENVを設定しておく。 方法2 bootstrap/app.phpで、loadEnvironmentFromメソッドで読み込む.envファイルを指定する。 どちらにしても、各環境用...