Vagrant上にAmazonLinux2のLaravel開発環境構築

#前提
virtualboxとvagrantはインストール済み
Homestead使えばいいんだけど、本番と同じようにする必要があるっぽいので作成

- AmazonLinux2
- PHP7.4
- Apache 2.4
- MySQL5.7
- Composer
- Nodejs

#1.Vagrantfile作成
作業フォルダを`prj`とする

```bash
vi Vagrantfile
```

下記を記載

```bash
Vagrant.configure("2") do |config|
  config.vm.box = "gbailey/amzn2"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

VagrantHubで公開されているAmazonLinux2のboxを拝借します。

#2.起動
`prj`(Vagrantfile)と同階層で

```bash
vagrant up
```

起動後box内へ接続

```bash
vagrant ssh
```

#3.PHPインストール

```bash
amazon-linux-extras list
```

php好きなのインストール
今回は7.4

```bash
sudo amazon-linux-extras install php7.4
```

必要な拡張インストール

```bash
sudo yum install php-mbstring php-gd php-xml php-opcache php-bcmath
```

#4.Apacheインストール

```bash
sudo yum install httpd
```

起動

```bash
sudo systemctl start httpd
```

確認
`active(running)`になっていればOK

```bash
sudo systemctl status httpd
```

自動起動

```bash
systemctl enable httpd
```

#5.MySQLインストール
MySQLの5.7を入れる

```bash
sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
sudo yum install mysql-community-server
```

起動

```bash
sudo systemctl start mysqld.service
```
自動起動するように設定

```bash
sudo systemctl enable mysqld.service
```

rootユーザの初期パスワード確認

```bash
sudo cat /var/log/mysqld.log | grep root@localhost
```
このように出力されるのでパスワードをコピーしておく
` [Note] A temporary password is generated for root@localhost: 【ランダム文字列】`

次にMySQLにログイン
先ほど控えたパスワードを入力します

```bash
mysql -u root -p
```

ローカル開発なのでパスワード設定を緩めます

```sql
#パスワードの最低長
SET GLOBAL validate_password_length=4;
#ポリシーを緩める
SET GLOBAL validate_password_policy=LOW;
```

rootユーザのパスワードを変更

```sql
set password for root@localhost=password('ここに好きなパスワード');
```

`exit`してMySQLからログアウト

#6.Nodeインストール

Laravelでフロントやったりするときに使うので入れておく

リポジトリ追加

```bash
sudo curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
```

インストール

```bash
sudo yum install nodejs
```

確認

```bash
node -v
```

#7.Composer インストール

セットアップスクリプトを取得します

```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```

取得後、実行します

```bash
php composer-setup.php
```

実行完了後、ダウンロードできているのでセットアップスクリプトの削除

```bash
php -r "unlink('composer-setup.php');"
```

どこでも使えるように移動する

```bash
sudo mv composer.phar /usr/local/bin/composer
```

確認

```bash
composer -v
```

#8.フォルダ同期とか設定
一度状態を保存をできるようにしておきます

box停止

```bash
vagrant halt
```
saharaのインストール

```bash
vagrant plugin install sahara
```

vagrantfileに同期フォルダの記載
ついでに同期してるフォルダをドキュメントルートにすると、httpdのほうが起動早くてフォルダ無いって言われて死ぬので
起動するシェルを追加する

```bash
Vagrant.configure("2") do |config|
  config.vm.box = "gbailey/amzn2"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./src","/var/www/html/src", create:"true", group:"apache", :mount_options => ['dmode=775', 'fmode=775']
  config.vm.provision "shell", run: "always", inline: <<-SHELL
    systemctl restart httpd.service
  SHELL
end
```
記載内容を反映して起動

```bash
vagrant up --provision
```

saharaでロールバックできるように起動
これで設定等やらかしたりしても大丈夫

```bash
vagrant sandbox on
```

box内に接続

```bash
vagrant ssh
```
`/var/www/html/src`とローカルの`prj/src`が同期するのでここにLaravelをインストールすれば
ローカルにもできます

#9.Laravelインストール

同期しているディレクトリへ移動

```bash
cd /var/www/html/src
```

Composer からLaravelのインストール

```bash
composer create-project --prefer-dist laravel/laravel . "6.*"
```

`Cannot allocate memory`が出た場合
[こちら](https://qiita.com/ntm718/items/88d3fc787f4f18ad1f20)を参考にswap領域の確保をしてください

ダウンロード完了後、Laravelの初期設定

```bash
chmod -R 777 storage && chmod -R 777 bootstrap/cache
cp .env.example .env
php artisan key:generate
```

ドキュメントルートの設定するのでバックアップを取っておく

```bash
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.old
```

変更

```
sudo vi /etc/httpd/conf/httpd.conf
```

`/DocumentRoot`で編集箇所へ

```bash
DocumentRoot "/var/www/html/src/public"

<Directory "/var/www/html">
  AllowOverride ALL#NONEから変更
</Directory>
```

Apache再起動

```
sudo systemctl restart httpd
```

あとは`.env`にMySQLの接続情報記載したら終了
Vagrantfileに記載したIPにアクセスするとLaravelの画面が表示されればOK
![000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/69b5f008-adc5-2948-48f5-e5fdb01c0a7d.jpeg)


saharaをコミットしておく

```
vagrant halt
vagrant sandbox commit
vagrant sandbox off
```

何かしらインストールする際は再度`vagrant sandbox on`をして、やらかしたら`vagrant sandbox rollback`で戻しましょう

#10.配布

ほかの人に配布します

```
vagrant package default --output AmazonLinux2_LAMP
```

`AmazonLinux2_LMAP`の個所は好きに決定してください

`AmazonLinux2_LMAP.box`が出力されているのでVagrantfileとともに渡し、

```
vagrant box add Lamp AmazonLinux2_LMAP
```

適当にbox名を決め、追加する元のboxを指定し起動

```
vagrant up
```




#参考

https://qiita.com/2no553/items/952dbb8df9a228195189

https://dev.classmethod.jp/articles/vagrant-sahar/

http://vdeep.net/vagrant-package

https://github.com/nodesource/distributions/blob/master/README.md

https://mossa.dev/post/vagrant_virtual_box/