Vagrant＋VirtualBoxで作った仮想環境(CentOS)にLaravel環境構築

[10]: https://rpms.remirepo.net/wizard/ "Remi's RPM repository - Configuration wizard"
[20]: https://qiita.com/takeshi_nozawa/items/ee01981b4fc338209437 "CentOSのyumレポジトリ: EPEL, Remi, Software Collectionsの違いとまとめ"
[30]: https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94 "PHP開発でComposerを使わないなんてありえない！基礎編"

# はじめに
以前参画していたプロジェクトにて、コンテナ内のLaravelログをCloudWatch Logsに出力したいという要望があった。
参画しておきながら、あまり開発環境構成などの理解が浅く、この機会にLinux環境にLaravel環境を構築する手順を身につける。

# 目次

 - Vagrant、VirtualBoxのインストール
 - 仮想環境（CentOS）の構築
 - PHPのインストール
 - composerのインストール
 - Laravelのインストール

# Vagrant、VirtualBoxのインストール
* Vagrant
\\https://www.vagrantup.com/downloads.html

* VirtualBox
\\https://www.virtualbox.org/wiki/Downloads

# 仮想環境（CentOS）の構築
コマンドプロンプトを起動し、適当なフォルダへ移動します。

```
> d:
> cd d:\work
```

CentOSのイメージをダウンロードします。（これ、結構かかります）

```
> vagrant box add centos/7
```

CentOS起動用のVagrantfileの雛形を作成します。

```
> vagrant init centos/7
```

作成したVagrantfileの雛形をカスタマイズします。
D:\work フォルダに Vagrantfileファイルが出来ているので、テキストエディタで開いて、以下の編集を行います。
以下の行のコメントアウトを解除するだけです。

```lang:Vagrantfile
35|  config.vm.network "private_network", ip: "192.168.33.10"
```

 - 35行目の編集は、後ほどCentOS上で起動されたLaravelのビルドインWebサーバーへ接続する為に必要になります。

さあ、Vagrantを起動しましょう。

```
> vagrant up
```
カレントフォルダのvagrantfileを参照して、そこに記載してある仮想環境を構築、起動します。

仮想環境（CentOS）が起動しているので、仮想環境にSSHで接続しましょう。

```
> vagrant ssh
```

# PHPのインストール
最新のLaravel 5.8 では、PHP 7.1.3 以上が必要なので、ここでは PHP 7.2をインストールすることにします。
通常なら、yum install でphpを指定すればよいのですが、既定のリポジトリには PHP7.2系が配布されていない為、リポジトリを追加する必要があります。

今回はPHP7.2を配布しているRemiリポジトリを追加しますが、Remiリポジトリを追加する為に、EPELリポジトリを追加する必要があります。
このあたりの手順は、RemiさんのWebサイトの[設定ウィザード][10]で対象OSなどを選択して、確認するのが一番かと思います。

以下で行う `yum install` コマンドには全て `-y` オプションをつけていますが、これは途中の確認を全てYESで答えるオプションです。

では、EPELリポジトリの追加から行っていきます。

```
$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```
Remiリポジトリを追加します。

```
$ sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
```
yum-config-managerコマンド用にyum-utilsをインストールします。

```
$ sudo yum -y install yum-utils
```
remiリポジトリの有効化を行います。

```
$ sudo yum-config-manager --enable remi-php72
```
PHP 7.2 と関連パッケージをインストールします。

```
$ sudo yum -y install php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-zip php-unzip
```
インストールを確認します。

```
$ rpm -qa | grep php
$ php -v
PHP 7.2.21 (cli) (built: Jul 30 2019 14:46:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
```

無事 PHP 7.2.21 がインストールできました。

### 余談（Software Collections(SCL)リポジトリ）
[こちらの記事][20]によると、PHP 7.xを配布する公式のリポジトリ Software Collections(SCL) もあるそうですが、これで配布されたPHPを利用するには、ログイン毎、ソフトウェア毎に'scl enable'コマンドでSCLを有効化する必要があり、後々面倒になりそうなので、今回の手順ではRemiリポジトリからインストールしました。

# PHPの設定
PHPの設定ファイル、/etc/php.ini をviで編集します。

```
$ sudo vi /etc/php.ini
```

編集箇所は以下の通りです。

```php.ini
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none 
```

# composerをインストール
composerは、PHPのライブラリ管理ツールです。
今回はLaravelのインストールに使いますが、このLaravelのインストール時に必要なPHPライブラリを自動でインストールしてくれます。

参考：[PHP開発でComposerを使わないなんてありえない！基礎編][30]

PHPのインストールほど面倒ではないです。

```
# curl -sS https://getcomposer.org/installer | php
```
curlでダウンロードしてきたインストーラをPHPで実行しています。

ダウンロードとインストールが完了すると、カレントディレクトリに`composer.phar`というファイルができます。
これが実行ファイルなので、パスの通ったディレクトリに移動します。

```
$ mv composer.phar /usr/local/bin/composer
```
これで、`composer`コマンドが使えます。
早速バージョン確認してみましょう。

```
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
```
インストール完了です。

# Laravelのインストール
composerを使ってインストールします。

```
$ composer global require "laravel/installer"
```
今回は `/var/www` 配下にプロジェクトを作成していこうと思います。
Laravelの新規プロジェクトを作成する際のコマンド`composer`は、一般ユーザー権限で実行されますが、`/var/www`ディレクトリの書き込み権限が無いので、このディレクトリの所有者変更と書き込み権限付与を行います。

```
$ ls -al /var/www
total 0
drwxr-xr-x.  4 root root  33 Aug 28 09:31 .
drwxr-xr-x. 19 root root 265 Aug 28 09:31 ..
drwxr-xr-x.  2 root root   6 Jul 29 17:19 cgi-bin
drwxr-xr-x.  2 root root   6 Jul 29 17:19 html
$ cd /var/www
$ sudo chown -Rv root:$USER .
changed ownership of ‘./cgi-bin’ from root:root to root:vagrant
changed ownership of ‘./html’ from root:root to root:vagrant
changed ownership of ‘.’ from root:root to root:vagrant
$ sudo chmod -Rv g+rw .
mode of ‘.’ changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of ‘./cgi-bin’ changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of ‘./html’ changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
```
では、新しいLaravelプロジェクトを作成します。

```
$ composer create-project --prefer-dist laravel/laravel blog "5.6.*"
```
※プロジェクトが作成されると、最後にキーが同時に作成されるので、残しておきましょう。

動作確認します。

```
$ cd blog
$ php artisan --version
Laravel Framework 5.6.39
```
Laravelのバージョンが表示されればプロジェクトの作成は無事完了です。

あとは、PHPのビルドインWebサーバーを使用して動作確認するだけですが、CentOSにはSELinuxが導入されており、これが動作確認の邪魔になります。
一時的にアクセス制御を無効化して、動作確認をします。(恒久的に無効化する方法もありますが、ここでは割愛します）

```
$ sudo setenforce 0
$ php -S 0.0.0.0:8000 -t public
PHP 7.2.21 Development Server started at Wed Aug 28 11:04:35 2019
Listening on http://0.0.0.0:8000
Document root is /var/www/blog/public
Press Ctrl-C to quit.
```
この状態で、ホストOSのブラウザで、`http://192.168.33.10:8000` にアクセスしてください。
![laravel_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477633/09a0f6ae-89d8-d973-d3ca-efa003d49355.png)

# おわりに
次は、Laravelの環境をBuildしてコンテナ化する手順を身につけたい

# 参考
https://qiita.com/inexp_eng4432/items/ec818f151b8ad516988b
https://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e
https://qiita.com/takeshi_nozawa/items/ee01981b4fc338209437
https://rpms.remirepo.net/wizard/
https://eng-entrance.com/linux-selinux