Vagrant Amazon Linux で PHP実行環境を構築する

## 概要
Vagrantを利用してAmazon Linux上に PHP の実行環境を構築します。

##環境
* Mac OS X Sierra 10.12.6
* Vagrant 2.0.0
* VirtualBox 5.1.30r118389
* PHP 7.2.X

MacOS上にVagrantを使ってVirtualboxを立てその中に環境構築しています。
OSイメージはAmazon Linuxの[こちら](https://app.vagrantup.com/mvbcoding/boxes/awslinux "こちら")を利用。

## PHPインストール
PHPのインストール方法は複数ありますが、今回は一番簡単な　`yum` によるインストールを行います。

### OSの各パッケージの最新化（yumアップデート）

```
$ sudo yum -y update
```

### epel と remi リポジトリの追加
新しいバージョンのPHPをインストールするためには、`epel` と `remi` リポジトリを追加する必要があります。
AmazonLinuxの場合、 `amzn-main` というyumレポジトリが存在し、
このレポジトリには古いバージョンのPHPがインストールされるように設定されています。

### epelリポジトリについて
Amazon Linux（Amazon Linux AMI release 2017.03）ではデフォルトでepelリポジトリが入っているのでインストールする必要はありません。

epelリポジトリが入っていないAmazon Linuxを利用している場合、以下のコマンドでインストールできます。

```
$ sudo yum install epel-release
```

### remiリポジトリについて
以下のコマンドでインストールを行います。

```
$ yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

### 必要なパッケージをインストール

```
$ yum install httpd libmcrypt libtool-ltdl zlib-devel autoconf automake libevent libevent-devel gcc-c++ libtool
```

### PHP7.2のインストール

```
$ yum install --disablerepo=amzn-main --enablerepo=remi,remi-php72 php
```

バージョンを確認します。エラーにならなければ、完了です。

```
$ php -v
PHP 7.2.3 (cli) (built: Feb 28 2018 08:56:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

```

### 他に必要なパッケージをインストール
今回は、以下のパッケージをインストールします。

| パッケージ | 目的 |
|:-----------|:------------|
| php-devel       | 拡張機能のソースをコンパイルするために必要。|
| php-opcache     | 処理の高速化のため |
| php-mbstring    | マルチバイト文字列関連の関数を使うために必要。|
| php-pdo       　　　　| 複数のデータベースに接続するために必要。 |
| php-mysqlnd     | MySQLを利用するために必要。 |
| php-pecl-xdebug | デバッグ時に必要。|
| php-fpm    　　　　   | 主に高負荷のサイトで有用な追加機能を用意している。 |
| php-xml     　　　　  | xmlを利用するために必要。 |

以下のコマンドでインストールを行います。

```
$ yum install --disablerepo=amzn-main --enablerepo=remi,remi-php72 php-devel php-opcache php-mbstring php-pdo php-mysqlnd php-pecl-xdebug php-fpm php-xml
```

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

### PHP.iniのバックアップを取得
編集前に、`/etc/php.ini` のバックアップを取得します。
php.ini.originというコピーファイルを作成します。

```
$ cp /etc/php.ini /etc/php.ini.origin
```

### エラー表示の設定

- error_reporting

エラー出力レベルを設定します。
開発環境においてはSTRICTを含めたすべてのレポートをさせます。

```
error_reporting = E_ALL | E_STRICT
```

- display_errors

エラーをHTML出力の一部として画面に出力するかどうかを定義します。
エラー内容を表示するように設定します。

```
display_errors = On
```

- log_errors

エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指定します。
有効に設定します。

```
log_errors = On
```

- error_log

スクリプトエラーが記録されるファイル名です。
エラーログを/var/log/php.logに吐くように設定します。

```
error_log = /var/log/php.log
```

### 日本環境にする設定

- default_charset

デフォルトの文字コードをUTF-8に変更します。


```
default_charset = "UTF-8"
```

- mbstring.language

mbstringのデフォルトの言語をJapaneseに設定します。

```
mbstring.language = Japanese
```

- mbstring.internal_encoding

内部文字のエンコーディングのデフォルト値を設定する項目です。

PHP5.6.0以降非推奨となっているので、コメントアウトして使用しません。

```
;mbstring.internal_encoding =
```

- mbstring.encoding_translation

HTTP入力文字のエンコーディングを内部文字のエンコーディングに自動的に変換するかどうかを設定します。
Offを指定し、自動的に変換しないように設定します。

```
mbstring.encoding_translation = Off
```

- mbstring.http_input

HTTP 入力文字エンコーディングのデフォルト値を定義します。
PHP5.6.0以降非推奨となっているので、コメントアウトして使用しません。

```
;mbstring.http_input =
```

- mbstring.http_output

HTTP 出力文字エンコーディングのデフォルト値を定義します。
PHP5.6.0以降非推奨となっているので、コメントアウトして使用しません。

```
;mbstring.http_output =
```

- mbstring.detect_order

文字コードを自動検出する際の優先順位を設定します。

```
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
```

### 日本時間にする設定
タイムゾーンを日本標準時間に変更します。

```
date.timezone = Asia/Tokyo
```

### セキュリティに関する設定

 - expose_php

HTTPのレスポンスにPHPのバージョン情報を出力するX-Powered-Byヘッダを含めるかどうかを設定します。
OnだとPHPのバージョン情報などが露呈しまうので、Offを設定します。

```
expose_php = Off
``` 

### パフォーマンスに関する設定

 - memory_limit

PHPが利用できるメモリの最大サイズを設定します。
post_max_sizeよりも大きく する必要があります。
今回は、デフォルト値である「128M」を指定します。

```
memory_limit = 128M
```

 - post_max_size

POSTリクエストのデータの最大サイズを設定します
memory_limitの設定値に合わせて「128M」を指定します。

```
post_max_size = 128M
```

 - upload_max_filesize

ファイルをアップロードする際のアップロードファイルの最大サイズを設定します。
memory_limit、post_max_sizeの設定値に合わせて「128M」を指定します。

```
upload_max_filesize = 128M
```

## 変更した設定を読み込み
php.iniでの設定はApacheを再起動することによって再読込みされます。

```
$ service httpd restart
```