#前置き
もう各所で散々書かれている内容だから私が書かなくても…と思ったのですが、
「すでにネット上に同じ情報があるのだからQiitaに書くべきでない」という主張を目にすることがあるが、僕は反対の立場を取る。
— suin❄️PHPでオブジェクト指向 (@suin) 2019年4月1日
技術の再発明ならぬ「技術の再説明」が大事だと思うからだ。学んだことは気にせずどんどん書いていったほうがいいと思う。
というsuinさんのツイートに背中を押されたので書くことにしました。
七転八倒したポイントを重点的に書けばいいよね。うんうん。
#環境
※ 構築したのは2019年1月頃
- Windows10
- Oracle VM VirtualBox 6.0
- vagrant 2.2.2
- PHP 7.2
- Laravel 5.7.21
#準備
- VirtualBox インストール
- Vagrant インストール
- 上記2つをインストールしたら一旦PCを再起動してください
- Git Bashがあると便利
- Git for Windows公式
#BOX追加
Git Bashまたはコマンドプロンプトを起動して以下を入力
cd c:\
vagrant box add laravel/homestead
ここで「Enter your choice:」と出るので、
3(virtualbox) を入力してEnterします。
しばらく待って、以下のような表示が出ればOK
==> box: Successfully added box 'laravel/homestead' (v6.4.0) for 'virtualbox'!
#Homesteadダウンロード(git clone)
公式からcloneします。
ディレクトリ名はお好きに。今回は特に何も考えずHomesteadにしました。
git clone https://github.com/laravel/homestead.git ~/Homestead
#設定の初期化
cd ~/Homestead
./init.sh
# Homestead initialized! と表示されたらOK
#Homestead.yamlの修正
foldersとsitesを修正します
# 場所は ~/Homestead のまま
vi Homestead.yaml
# (中略)
folders:
- map: D:\homestead\Laravel # ローカルディレクトリ
to: /home/vagrant/code # vagrant上のディレクトリ
sites:
- map: homestead.test # host名(起動後のドメイン名)
to: /home/vagrant/code/public # web上に公開するディレクトリ(Apachで言うところのhtdocs)
##(補足) sites:mapに記載するドメイン名について
後で構築した環境をブラウザで確認するとき、
取り急ぎ https://
ではなく http://
でアクセスする場合は
homestead.app ではなく homestead.test を指定する方が無難です。
http://homestead.app
は https://homestead.app
とリダイレクトされるのですが、
Chromeだと自己署名証明書がエラーとなるためアクセスできないためです。
ただ、昨今の情勢としてはSSL通信で動かすことがベターだと思うので、
余裕があれば自己証明が通るよう設定した方がいいかもしれません。
(私はまだやってない……)
#SSH鍵ファイル作成
Homestead.yaml の authorize と keys にあたるファイルを作成します
authorize: ~/.ssh/id_rsa.pub # 公開鍵
keys:
- ~/.ssh/id_rsa # 秘密鍵
cd ~
# 鍵が既にあるかどうか
ls -la .ssh
# 無ければ以下を実行
mkdir .ssh
cd .ssh # ~/.ssh へ移動
# 鍵ファイル作成
ssh-keygen -t rsa
# id_rsa.pub と id_rsa が作成されたことを確認する
ls -l
#hostsファイル修正
C:\Windows\System32\drivers\etc\hosts
にホスト追加します。
これはGit Bashで編集できなかったのでサクラエディタでやっちゃいました。
# Homestead.yamlの ip と sites:map を紐づける感じです
192.168.10.10 homestead.test
#いざ、起動!
# Vagrantfileがある場所に移動
cd Homestead/
# 起動 ちょっと時間かかります
vagrant up
502 Bad Gateway になった
起動して vagrant ssh
もできる状態になったのですが、
http://homestead.test
をブラウザで開くと502の表示……
どうやら原因はnginxの方にあるらしい
502 Bad Gateway nginx (1.9.7) in Homestead [ Laravel 5 ]
というわけで、nginxの設定を見ていきます
# homestead環境にログイン
vagrant ssh
# nginxの設定ファイルはこちら
less /etc/nginx/nginx.conf
「Virtual Host Configs」の項に何がincludeされているか書いてます
http {
# (中略)
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
includeしているディレクトリを見ると、
どうやら /etc/nginx/sites-available/homestead.test
がhomestead環境の設定ファイルのようです。
server {
# (中略)
access_log off;
error_log /var/log/nginx/homestead.test-error.log error;
エラーログの場所が分かったので、そちらを見ます。
(と言いつつ、調査当時のメモによるとなぜか homestead.app-error.log
の方を見ている私…)
2019/01/17 04:20:09 [crit] 1603#1603: *1 connect() to unix:/var/run/php/php7.2-fpm.sock failed (2: No such file or
directory) while connecting to upstream, client: 192.168.10.1, server: homestead.app, request: "GET / HTTP/1.1", up
stream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "homestead.test"
php-fpmの方に原因がありそう。
類似のエラーを対処した方の記事を見ながら修正してみます。
nginxでphpのパッケージを追加したら’502 Bad Gateway’になってしまったときの対処法
sudo vi /etc/php/7.2/fpm/pool.d/www.conf
# www.confのlistenを修正
;listen = /run/php/php7.2-fpm.sock
listen = /var/run/php/php7.2-fpm.sock
そしてphp-fpmとnginxを再起動します
sudo service php7.2-fpm restart
sudo service nginx restart
これで502エラーが解消されました!
##No input file specified が表示される
こちら によると
Homestead.yaml
の sites:to
のディレクトリが間違っているかもということで確認しましたが、私の場合その問題ではなさそうです。
ls -l ~/code/public/index.php
-rwxrwxrwx 1 vagrant vagrant 1823 Jan 17 04:56 /home/vagrant/code/public/index.php
# Homestead.yamlの設定は以下のようになっているので問題なし
sites:
- map: homestead.test
to: /home/vagrant/code/public
というわけで、エラーログをtailしながら http://homestead.test
に再度アクセス。
2019/01/17 05:16:18 [error] 7864#7864: *6 FastCGI sent in stderr: "Unable to open primary script: /home/vagrant/code/test/public/index.php (No such file or directory)" while reading response header from upstream, client: 192.168.10.1, server: homestead.app, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "homestead.test"
なぜか /home/vagrant/code/test/public
を見に行っている模様。
実は最初の頃Homestead.yamlを以下のように設定していた時期があり、その時の設定が適用されたままだったようです。
sites:
- map: homestead.app
to: /home/vagrant/code/test/public
エラーログが homestead.app-error.log
の方に出ていたのもそれが原因です。
強制プロビジョニングで解消しました。
vagrant up --provision
これで例の初期画面が表示されました。
その後、エラーログも /var/log/nginx/homestead.test-error.log
の方に出力されるようになりました。
お疲れ様でした……!
#その他参考
- Laravel 5.7 Laravel Homestead
- これだけを見て何とかしたかったですね(何とかならなかった)
- Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する
- Windows10でLaravel Homestead環境構築
- Laravel 開発環境の構築 ( VirtualBox + Vagrant + Homestead + Composer + Eclipse ) 第1回 -前編-
- 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer)
- Homestead で、Laravel 開発環境を構築する手順
- 【Vagrantドキュメント意訳】09.プロビジョニング