AmazonLinux2へのnginx + php-fpm + php7.2セットアップメモ

## 目的

EC2インスタンス(Amazon Linux 2)に

- nginx (1.12)
- php (7.2 OPcache有効)
- php-fpm

をインストールする。

## ベース環境

OS : Amazon Linux 2
(AMI ID : amzn2-ami-hvm-2.0.20181114-x86_64-gp2 (ami-0a2de1c3b415889d2))

## OS初期設定

```
# パッケージ更新
$ sudo yum update -y

# タイムゾーン設定・確認
$ timedatectl status
      Local time: Fri 2018-11-23 05:56:04 UTC
  Universal time: Fri 2018-11-23 05:56:04 UTC
        RTC time: Fri 2018-11-23 05:56:04
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

$ sudo timedatectl set-timezone Asia/Tokyo

$ timedatectl status
      Local time: Fri 2018-11-23 14:56:43 JST
  Universal time: Fri 2018-11-23 05:56:43 UTC
        RTC time: Fri 2018-11-23 05:56:43
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

# ロケール、キーボードレイアウト設定・確認
$ localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: n/a
      X11 Layout: n/a

$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106

$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

## 各種インストール

### nginx / php-fpm / phpをインストール

#### Extras Libraryで利用可能なtopicを確認
```
$ amazon-linux-extras list
```
(nginx1.12とphp7.2が利用可能であることを確認する)

#### nginxをインストール
```
$ amazon-linux-extras info nginx1.12
nginx1.12 recommends nginx                      # yum install nginx

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

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

#### php/php-fpmをインストール
```
$ 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

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

# 他に必要なライブラリがあれば個別にインストール
$ sudo yum install -y php-mbstring php-opcache

$ php -v
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

$ php-fpm -v
PHP 7.2.11 (fpm-fcgi) (built: Oct 24 2018 17:55:29)
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
```

#### 補足）CentOS7の場合

```
# 外部リポジトリの追加
sudo yum install -y epel-release
sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# nginxをインストール
sudo yum install -y nginx

# php本体と必要モジュールをインストール
sudo yum install -y --enablerepo=remi-php72 php php-cli php-pdo php-fpm php-json php-mysqlnd php-mbstring php-opcache
```

## 設定変更

### php-fpm設定

#### /etc/php-fpm.d/www.conf

nginxユーザ、nginxグループで実行されるように修正

```
;user = apache
user = nginx
;group = apache
group = nginx
```

UNIXドメインソケットで通信するように修正（Amazon Linux 2では変更の必要なし）

```
;listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock
```

UNIXドメインソケットがnginxユーザ、nginxグループで作成されるように修正

```
;listen.owner = nobody
listen.owner = nginx
;listen.group = nobody
listen.group = nginx
```

### php設定

#### /etc/php.ini

```
; HTTPレスポンス内のPHPバージョン情報を非表示にする
;expose_php = On
expose_php = Off

; EC2インスタンスのスペックにあわせて利用メモリ上限を設定
;memory_limit = 128M
memory_limit = 1024M

; POSTサイズ上限、ファイルアップロードサイズ上限は必要に応じて変更
post_max_size = 8M
upload_max_filesize = 2M

; タイムゾーンを日本標準時間に変更
date.timezone = Asia/Tokyo

;　mbstringのデフォルト言語を日本語に変更
mbstring.language = Japanese
;　HTTP入力文字のエンコーディングを内部文字のエンコーディングに自動変換しない
mbstring.encoding_translation = Off
;　文字コードを自動検出する際の優先順位を設定
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
```

OPcache実行時設定追加（Amazon Linux 2では不要）
http://php.net/manual/ja/opcache.configuration.php

```
zend_extension=/[それぞれのPHPのextensionのパス]/php_opcache.dll

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1 # PHP 7.2.0で削除
```

### nginx設定

#### /etc/nginx/nginx.conf

```
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
```
（AmazonLinux2では不要）
拡張子が「.php」をアクセス対象に追加（serverディレクティブに追加）
UNIXドメインソケットを利用するため、ソケットファイルのパスを設定

#### /etc/nginx/conf.d/php.conf

（AmazonLinux2では変更不要）

#### /etc/nginx/conf.d/default.conf (新規ファイル)
httpブロックにセキュリティ関連の設定を追加

```
server_tokens off;
```

#### /etc/nginx/default.d/security.conf (新規ファイル)
serverブロックにセキュリティ関連の設定を追加

```
etag off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
#add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self'; style-src 'self'; child-src 'none' object-src 'none'";
```
(Content-Security-Policyは各サイトに合わせた設定を追加すること)

#### nginx設定構文チェック
```
sudo nginx -t
```

## 各サービスの起動、自動起動設定、起動確認
```
sudo systemctl start php-fpm
sudo systemctl start nginx

sudo systemctl enable php-fpm
sudo systemctl enable nginx

systemctl status php-fpm
systemctl status nginx
```

#### nginxとphp-fpmのUNIXドメインソケット接続確認

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

## ブラウザ表示確認

```
echo '<?php phpinfo(); ?>' | sudo tee /usr/share/nginx/html/phpinfo.php
```

ブラウザから「http://[domain name]/phpinfo.php」にアクセスし、
PHPの設定内容が表示されることを確認する。

※ OPcacheが有効であることを確認
Opcode Caching : Up and Running
Optimization : Enabled

## 参考サイト

https://ninolog.com/set-amazonlinux2-aws-ec2/
https://ninolog.com/set-amazonlinux2-nginx-phpfpm-aws-ec2/