AWSのEC2で行うAmazon Linux（nginx・php7.1-fpm）環境構築

Amazon Linuxの初期設定まで[記事](https://qiita.com/nino0813g/items/e166c00790c3397acf2d)はこちらになります。

それでは[前回](https://qiita.com/nino0813g/items/e166c00790c3397acf2d)までに作成したAmazon Linuxでnginx・php-fpmの環境構築をしていきます。

## 開発環境
- Mac OS X（El Capitan） 10.11.6
- Amazon Linux AMI 2017.09.1 (HVM), SSD Volume Type - ami-33c25b55
 - nginx version: nginx/1.12.1
 - PHP 7.1.11 (cli)
 - php71-fpm-7.1.11-1.29.amzn1.x86_64

### 事前に用意しておく必要があるもの
- 接続先EC2のパブリックDNS
- 作業ユーザ（Amazon Linuxの場合デフォルトはec2-user）
- EC2からダウンロードした秘密鍵（デフォルトは****.pem）

## AWSのEC2にSSH接続
### SSH接続
以下のコマンドを実行してAWSのEC2にSSH接続します。

```
$ ssh -i ~/.ssh/秘密鍵名.pem ユーザ名@パブリックDNS
```

### ログイン完了
以下が表示がされたらログイン完了です。

```
Last login: Mon Jan 15 17:27:41 2018 from ***.***.***.***

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.09-release-notes/
```

## nginxをインストール
### nginxをインストール
以下のコマンドを実行してnginxをインストールします。

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

# インストール確認
$ nginx -v
```

### nginxの起動設定
以下のコマンドを実行してnginxを起動します。

```
# 起動
$ sudo service nginx start

# 自動起動設定確認
$ sudo chkconfig --list nginx

# 自動起動有効化設定
$ sudo chkconfig nginx on

# ステータス確認
$ sudo service nginx status

# ブラウザ確認
$ パブリックDNS
```

## php-fpmをインストール
### php-fpmをインストール
以下のコマンドを実行してphp-fpmをインストールします。

```
# phpをインストール
$ sudo yum install php71 php71-fpm -y

# インストール確認
$ php -v

# パッケージバージョン確認
$ rpm -qa | grep php

php71-json-7.1.11-1.29.amzn1.x86_64
php71-cli-7.1.11-1.29.amzn1.x86_64
php71-xml-7.1.11-1.29.amzn1.x86_64
php71-common-7.1.11-1.29.amzn1.x86_64
php71-fpm-7.1.11-1.29.amzn1.x86_64
php71-process-7.1.11-1.29.amzn1.x86_64
php71-7.1.11-1.29.amzn1.x86_64
```

### php-fpmの起動設定
以下のコマンドを実行してphp-fpmを起動します。

```
# 起動
$ sudo service php-fpm start

# 自動起動設定確認
$ sudo chkconfig --list php-fpm

# 自動起動有効化設定
$ sudo chkconfig php-fpm on

# ステータス確認
$ sudo service php-fpm status
```

## php-fpmとnginxの接続設定
### www\.confの編集
以下のコマンドを実行して、www.confファイル内の【user】と【group】を【apache】から【nginx】に変更します。

```
# www.confファイルがあるディレクトリへ移動
$ cd /etc/php-fpm-7.1.d

# オリジナルファイルのバックアップを作成
$ sudo cp www.conf www.conf.org

# www.confの編集
$ sudo vi www.conf
```
```/etc/php-fpm-7.1.d/www.conf
# php-fpmでのnginx実行ユーザー指定 
 - user = apache
 + user = nginx
 - group = apache
 + group = nginx
```

### nginx.confの編集
以下のコマンドを実行して、nginx.confファイル内の【server】ブロック内を変更します。

```
# default.confファイルがあるディレクトリへ移動
$ cd /etc/nginx

# オリジナルファイルのバックアップを作成
$ sudo cp nginx.conf nginx.conf.org

# nginx.confの編集
$ sudo vi nginx.conf
```
```/etc/nginx/nginx.conf
# インデックスファイル指定
 - index index.html index.htm;
 + index index.html index.htm index.php;

# try_filesディレクティブ設定
 - location / {
 - }
 
 + location / {
 +     try_files $uri $uri/ /index.php$is_args$args;
 + } 

# nginxでのphpスクリプト実行設定
　- #location ~ \.php$ {
　- #    root           html;
　- #    fastcgi_pass   127.0.0.1:9000;
　- #    fastcgi_index  index.php;
　- #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
　- #    include        fastcgi_params;
　- #}

　+ location ~ \.php$ {
　+      fastcgi_pass  127.0.0.1:9000;
　+      fastcgi_index index.php;
　+      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
　+      include       fastcgi_params;
　+ }
```

## php-fpmとnginxの接続確認
### ドキュメントルートにphpinfo.phpのテストファイルを追加
以下のコマンドを実行して、ドキュメントルートでphpが実行できるか確認します。

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

# テスト用phpファイルの作成
$ echo '<?php phpinfo();' > /usr/share/nginx/html/phpinfo.php
```

### nginxとphp-fpmの再起動
以下のコマンドを実行して、nginxとphp-fpmを再起動し設定を反映させます。

```
# nginxの再起動
$ sudo service nginx restart

# php-fpmの再起動
$ sudo service php-fpm restart

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

## nginx error!対応
### php-fpm再起動時にACLのワーニングが出る場合

```
Starting php-fpm-7.1: 
[16-Jan-2018 11:04:52] WARNING: [pool www] ACL set, listen.owner = 'nginx' is ignored
[16-Jan-2018 11:04:52] WARNING: [pool www] ACL set, listen.group = 'nginx' is ignored
```

php-fpm再起動時にACLのワーニングが出る場合は、www.confファイル内の【listen.acl_users】をコメントアウトします。

```/etc/php-fpm-7.1.d/www.conf
- listen.acl_users = apache,nginx
+ ;listen.acl_users = apache,nginx
```

ブラウザで再確認してみますが、また【nginx error!】が表示されましたのでnginxの【error.log】を確認してみます。

**ファイルパス：/var/log/nginx/error.log**

参考までにphp-fpmの【error.log】は**/var/log/php-fpm/7.1/error.log**で出力されています。

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

# error.logの確認
$ less /var/log/nginx/error.log

## lessコマンドオプション
Shift + f （更新監視モードを実行）
Ctrl + c （更新監視モードを終了）
q （終了）

# エラー内容
2018/01/16 12:20:40 [crit] 32408#0: *13 connect() to unix:/var/run/php-fpm/www.sock failed (2: No such file or directory) while connecting to upstream, client: 111.107.157.137, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock:", host: "13.231.12.47"
```

### connect() to unix:/var/run/php-fpm/www\.sock failedの修正
> connect() to unix:/var/run/php-fpm/www\.sock failed (2: No such file or directory) while connecting to upstream

上記エラーは【www.sock】ファイルがないため起こっているので、UNIXドメインソケット設定しphp-fpmを再起動して【.sock】ファイルを作成します。

その際、nginx.conf内の【include /etc/nginx/conf.d/*.conf;】という設定で/conf.d/php-fpm.confが読み込まれ【unix:/var/run/php-fpm/www\.sock;】が使用されているのでUNIXドメインソケット設定はこちらに合わせて使用します。


## UNIXドメインソケット設定
### php-fpmのUNIXドメインソケット動作確認
以下のコマンドを実行して、php-fpmでUNIXドメインソケットを使用しているか確認できます。

```
# php-fpmのUNIXドメインソケット動作確認
$ netstat -al --protocol=unix |egrep "Proto|fpm"

Proto RefCnt Flags       Type       State         I-Node   Path
```
### www\.confの編集
以下のコマンドを実行して、www.confファイル内の【listen】と【listen.owner】と【listen.group】を変更します。

```
# www.confの編集
$ sudo vi /etc/php-fpm-7.1.d/www.conf
```
```/etc/php-fpm-7.1.d/www.conf
# listenの内容を変更
- listen = 127.0.0.1:9000

- ;listen.owner = nobody
- ;listen.group = nobody

+ listen = /var/run/php-fpm/www.sock

+ listen.owner = nginx
+ listen.group = nginx
```

### nginx.confの編集
以下のコマンドを実行して、nginx.confファイル内の【fastcgi_pass】を変更します。

```
# nginx.confの編集
$ sudo vi /etc/nginx/nginx.conf
```
```/etc/nginx/nginx.conf
# fastcgi_passの変更
- fastcgi_pass  127.0.0.1:9000;
+ fastcgi_pass  unix:/var/run/php-fpm/www.sock;
```

### nginxとphp-fpmの再起動
以下のコマンドを実行して、nginxとphp-fpmを再起動し設定を反映させます。

```
# nginxの再起動
$ sudo service nginx restart

# php-fpmの再起動
$ sudo service php-fpm restart

# php-fpmのUNIXドメインソケット動作確認
$ netstat -al --protocol=unix |egrep "Proto|fpm"

Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     54424  /var/run/php-fpm/www.sock
```

## ブラウザ再確認
以下のパスからブラウザ再確認します。無事表示されました。

```
パブリックDNS/phpinfo.php
```

[ブログ記事](http://ninolog.com/set-amazonlinux-nginx-phpfpm-aws-ec2/)の転載になります。