EC2ですばやくNginx＋php7-fpmでPHPを動かす(ちょっとLaravelも)

## 前提
- `AWS` 管理コンソールで`Amazon Linux`の`EC2`インスタンスを作成済
- 作業するユーザーを作成済

## 今回使用したバージョン
Nginx 1.8.1
PHP 7.0.8

## Nginx、 PHP関連のインストール
PHP7を取得するために、scl-utilsとremiインストールし、Nginx、PHP、PHPの各種モジュールをインストール。
PHPのモジュールはアプリに必要なモジュールを適宜いれる

```
$ sudo rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum install -y nginx php70 php70-fpm php70-gd php70-mbstring php70-mysql
```

## php7−fpmの設定
php7-fpmの設定ファイルを変更する
今回はUNIXドメインソケットで設定
以下、編集箇所の抜粋

```/etc/php-fpm-7.0.d/www.conf
user = nginx
group = nginx
listen = /var/run/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
catch_workers_output = yes
```
※user、groupはnginxとしているが環境に合わせて設定する
※一番最後の`catch_workers_output`はエラーログを出力するため

## Nginxの設定
以下は、`nginx.conf`のserver設定のみを抜粋
（インストールした時に入ったもののserver設定のみ変更して、他は変更していません）

```/etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  example.com;
        root         /usr/share/nginx/html;
        index        index.php index.html index.htm;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   unix:/var/run/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;
        }

        # redirect server error pages to the static page /40x.html
        #
        error_page 404 /404.html;
            location = /40x.html {
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
```

```/etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
    server unix:/var/run/php-fpm.sock;
}
```

## サービスの起動
```
$ sudo service php-fpm start
$ sudo service nginx start
```

## 実行確認
`/usr/share/nginx/html` に `phpinfo()`を記述したphpファイルを作成
今回は`info.php`という名前にしておく

ブラウザから`http://サーバIP/info.php` にアクセスし、`phpinfo`が表示されることを確認
![41f4493b-8bc8-c058-d1b1-40b0bd7efe9d.png](https://qiita-image-store.s3.amazonaws.com/0/128475/a080f51b-3f51-1fbc-0f63-a9f8ba6a0f79.png)

## 最後にLaravel 5.2のプロジェクトを起動について
ドキュメントルートも変更し、`/var/www/` 配下にlaravelのプロジェクトを格納（今回は `laravelpj` という名前のプロジェクト）

プロジェクト配下の所有者、グループをnginxに変更する

```
$ sudo chmod -R nginx:nginx /var/www/laravelpj
```

先程の`nginx.conf` を少し変更

```/etc/nginx/etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        server_name  example.com;
        root         /var/www/laravelpj/public;
        index        index.php index.html index.htm;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   unix:/var/run/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;
        }
    }
```


## サービスの再起動
```
$ sudo service nginx restart
```

### 注意書き
lalavelのプロジェクトにアクセスしたら、以下のエラーが発生した。

```
PHP Fatal error:  Uncaught ReflectionException: Class log does not exist in /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php:734
Stack trace:
#0 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(734): ReflectionClass->__construct('log')
#1 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(629): Illuminate\Container\Container->build('log', Array)
#2 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(697): Illuminate\Container\Container->make('log', Array)
#3 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(849): Illuminate\Foundation\Application->make('log')
#4 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(804): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter)) in /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 734
```
ネットで検索してみると、laravelプロジェクトの `.env`ファイルのvalueにブランクが含まれる、もしくは２バイト文字を使用しているというのと、logファイルのパーミッションの問題が多く引っ掛かったが、今回の場合は単純に必要なモジュールがなかったからだったようだ。
PHPを再インストールしたので原因の特定ができなかったが、恐らくpdo、mysqlのモジュールが足りていなかったためだと思う。
同じエラーが発生している人は、.envファイルと、logファイルのパーミッションと、PHPのモジュールの再確認を！