AWSのEC2にPHP + nginx + php-fpmの環境を構築する

## 概要
AWSのEC２に、PHP + nginx + php-fpmの環境を構築する。

- AmazonLinuxExtrasを利用して以下のトピックをインストール
 - nginx1.12
 - php7.2
- nginxとphpの紐付け
- 動作確認

##環境
- Amazon Linux 2
- nginx1.12
- php7.2

## インストール手順
### SSHで接続
EC2インスタンスにSSHで接続します。

### パッケージの最新化（yumアップデート）
```
$ sudo yum -y update 
```

### nginxのインストール
```
$ sudo yum -y install nginx
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                                           | 2.4 kB  00:00:00
パッケージ nginx は利用できません。
エラー: 何もしません


nginx is available in Amazon Linux Extra topic "nginx1.12"

To use, run
# sudo amazon-linux-extras install nginx1.12

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras
```

`sudo yum -y install nginx`でインストールするとエラーとなりました。
エラーメッセージに表示されている[Amazon Linux Extras](https://aws.amazon.com/jp/amazon-linux-2/faqs/#Amazon_Linux_Extras)は、
安定したオペレーティングシステムで新しいバージョンのアプリケーションソフトウェアを利用可能にする Amazon Linux 2 のメカニズムです。

今回はこのAmazonLinuxExtrasを利用して、`nginx`をインストールします。
AmazonLinuxExtrasの`Extras Library`からインストールするには、`amazon-linux-extras`コマンドを利用します。

```
$ sudo amazon-linux-extras install nginx1.12 -y

完了しました!
 4  nginx1.12=latest         enabled      [ =1.12.2 ]
```

バージョンを確認します。

```
$ nginx -V
nginx version: nginx/1.12.2
```

自動起動の設定を行います。

```
$ sudo systemctl start nginx.service
$ sudo systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

$ ● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─php-fpm.conf
   Active: active (running) since 水 2018-11-21 08:57:35 UTC; 1h 28min ago
 Main PID: 14943 (nginx)
   CGroup: /system.slice/nginx.service
           ├─14943 nginx: master process /usr/sbin/nginx
           └─14945 nginx: worker process

11月 21 08:57:34 ip-10-2-10-76.ap-northeast-1.compute.internal systemd[1]: Starting The nginx HTTP and reverse proxy server...
11月 21 08:57:35 ip-10-2-10-76.ap-northeast-1.compute.internal nginx[14933]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
11月 21 08:57:35 ip-10-2-10-76.ap-northeast-1.compute.internal nginx[14933]: nginx: configuration file /etc/nginx/nginx.conf test is successful
11月 21 08:57:35 ip-10-2-10-76.ap-northeast-1.compute.internal systemd[1]: Failed to read PID from file /run/nginx.pid: Invalid argument
11月 21 08:57:35 ip-10-2-10-76.ap-northeast-1.compute.internal systemd[1]: Started The nginx HTTP and reverse proxy server.

```

### PHP7.2のインストール
PHP7.2についても、AmazonLinuxExtrasを利用して、インストールします。

`Extras Library` ではソフトウェア群のことを「トピック」と呼びます。
`Extras Library`はyumでパッケージを管理しており、トピックを指定すると、ソフトウェアをインストールし機能させるために必要となるパッケージがインストールされます。

トピック`php7.2`を確認します。

```
$ amazon-linux-extras info php7.2
php7.2 recommends php-cli                    # yum install php-cli
php7.2 recommends php-pdo                    # yum install php-pdo
php7.2 recommends php-fpm                    # yum install php-fpm
php7.2 recommends php-json                   # yum install php-json
php7.2 recommends php-mysqlnd                # yum install php-mysqlnd
```

トピック`php7.2`をインストールします。

```
$ sudo amazon-linux-extras install php7.2 -y

完了しました!
15  php7.2=latest enabled [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11 ]
```

PHPのバージョンを確認します。

```
PHP 7.2.11 (cli) (built: Oct 24 2018 17:51:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies
```

PHP7.2のインストールが完了しました。

### 他に必要なパッケージをインストール
拡張機能を以下のコマンドで確認できます。

```
sudo yum list php* | grep amzn2extra-php7.2
php-cli.x86_64                      7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php-common.x86_64                   7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php-fpm.x86_64                      7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php-json.x86_64                     7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php-mysqlnd.x86_64                  7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php-pdo.x86_64                      7.2.11-1.amzn2.0.1        @amzn2extra-php7.2
php.x86_64                          7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-bcmath.x86_64                   7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-dba.x86_64                      7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-dbg.x86_64                      7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-devel.x86_64                    7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-embedded.x86_64                 7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-enchant.x86_64                  7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-gd.x86_64                       7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-gmp.x86_64                      7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-intl.x86_64                     7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-ldap.x86_64                     7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-mbstring.x86_64                 7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-odbc.x86_64                     7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-opcache.x86_64                  7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-pecl-apcu.x86_64                5.1.12-3.amzn2.0.1        amzn2extra-php7.2
php-pecl-apcu-devel.noarch          5.1.12-3.amzn2.0.1        amzn2extra-php7.2
php-pecl-igbinary.x86_64            2.0.7-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-igbinary-devel.noarch      2.0.7-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-imagick.x86_64             3.4.3-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-imagick-devel.noarch       3.4.3-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-mcrypt.x86_64              1.0.1-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-memcached.x86_64           3.0.4-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-msgpack.x86_64             2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-msgpack-devel.noarch       2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-oauth.x86_64               2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-ssh2.x86_64                1.1.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-uuid.x86_64                1.0.4-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-zip.x86_64                 1.15.2-3.amzn2.0.1        amzn2extra-php7.2
php-pgsql.x86_64                    7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-process.x86_64                  7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-pspell.x86_64                   7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-recode.x86_64                   7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-snmp.x86_64                     7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-soap.x86_64                     7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-xml.x86_64                      7.2.11-1.amzn2.0.1        amzn2extra-php7.2
php-xmlrpc.x86_64                   7.2.11-1.amzn2.0.1        amzn2extra-php7.2
```

今回は、以下のパッケージをインストールします。

| パッケージ | 目的 |
|:-----------|:------------|
| php-devel       | 拡張機能のソースをコンパイルするために必要。|
| php-opcache     | 処理の高速化のため |
| php-mbstring    | マルチバイト文字列関連の関数を使うために必要。|
| php-xml     　　　　  | xmlを利用するために必要。 |

```
$ sudo yum install php php-devel php-opcache php-mbstring php-xml
```

php-fpmの自動起動の設定を行います。

```
$ sudo systemctl start php-fpm.service
$ sudo systemctl enable php-fpm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
$ systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2018-11-21 09:18:08 UTC; 1h 10min ago
 Main PID: 15031 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php-fpm.service
           ├─15031 php-fpm: master process (/etc/php-fpm.conf)
           ├─15032 php-fpm: pool www
           ├─15033 php-fpm: pool www
           ├─15034 php-fpm: pool www
           ├─15035 php-fpm: pool www
           └─15036 php-fpm: pool www

11月 21 09:18:08 ip-10-2-10-76.ap-northeast-1.compute.internal systemd[1]: Starting The PHP FastCGI Process Manager...
11月 21 09:18:08 ip-10-2-10-76.ap-northeast-1.compute.internal systemd[1]: Started The PHP FastCGI Process Manager.
```

## PHPの設定を編集
以下の記事を参考に、PHPの設定を編集します。
https://qiita.com/kobayashi-m42/items/d4d4bc9e7291b9408390#php%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E7%B7%A8%E9%9B%86

## nginxとphpの紐付け

### `www.conf`の編集

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

```
$ sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.origin
```

`user`と`group`を`nginx`に変更します。

```diff:/etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
- user = apache
+ user = nginx
; RPM: Keep a group allowed to write in log dir.
- group = apache
+ group = nginx
```

php-fpmを再起動します。

```
$ sudo systemctl restart php-fpm.service
```

### nginxとphp-fpmがUNIX ドメインソケットで通信できているかを確認

```
$ netstat -a --unix |egrep "Proto|fpm"
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     285282   /run/php-fpm/www.sock
```

### 接続確認

接続確認のため、確認用のファイルを追加します。

```
#スーパーユーザーに切替
$ sudo su

#接続確認用phpファイル追加
$ echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/phpinfo.php

#ブラウザ確認
$ パブリックDNS/phpinfo.php
```

以上で、PHP + nginx + php-fpmの環境を構築が完了です。

## 参考記事
- [nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)
- [AWS + Nginx + PHP + Laravel](https://qiita.com/yumatsud/items/7093fc9b389070ddecd1)