AWS + Nginx + PHP + Laravel

## nginx + php + LaravelをAWS上に構築してみる
### nginx
* インストールと起動

```shell_session
$ sudo yum -y install nginx
・・・・・
完了しました！

$ sudo service nginx start
Starting nginx:                                            [  OK  ]
```

* バージョンやconfigurationの内容を知りたいときは下記コマンド

```
$ nginx -V
```

* configurationで使いそうなやつメモ

| 設定 | 説明 | デフォルト |
|:-- |:-- |:-- |
| --error-log-path | HTTPアクセスログのエラーのパス  | /var/log/nginx/error.log |
| --http-log-path | HTTPアクセスログのパス | /var/log/nginx/access.log |
| --conf-path | nginxの設定ファイルのパス | /etc/nginx/nginx.conf |
| --http-proxy-temp-path | プロキシを実行している場合、ここで指定したディレクトリが一時ファイルの格納パスになる | /var/lib/nginx/tmp/proxy |

* モジュールで気になるところメモあたり(他にもあったけど、メモるの面倒でdown)

| モジュール名 | 説明 | 利用場面 | デフォルト |
| :-- | :-- | :-- | :-- |
| http_ssl | https対応(OpenSSLライブラリが必要)。 | プロキシ | 有効 |
| http_realip | L7ロードバランサなどの後に配置する場合有効にする必要あり。複数のクライアントが同一IPアドレスから通信してくるように見える環境で使用。 | プロキシ | 有効 |
| http_geoip | クライアントのIPアドレスに基づく地理的位置に応じた処理を行うための様々な変数を設定 | Web、プロキシ | 有効 |
| http_stub_status | Nginx自身の統計情報の収集を手助けする | Web、プロキシ | 有効 |
※有効化(--with-<モジュール名>_module)、無効化(--without-<モジュール名>_module)

### PHP7のインストール
* CentOS6用のPHP7のリポジトリを追加(これがないとインストールできないくさい)

```shell_session
$ sudo yum install --enablerepo=webtatic-testing \
                 php70w php70w-devel php70w-fpm php70w-mysql \
                 php70w-mbstring php70w-pdo
```
* 他にも必要であればインストールしておく(json系とか)

### nginxとphpの紐付け
* index.phpのセット
    * /var/www/default ディレクトリ作成
    * ここにindex.phpを配置 (最初はとりあえずphpinfoを吐くだけ)
* /etc/php-fpm.d/www.confの編集 (backupを取った上で編集)

```diff
$ diff -uN www.conf.backup_20160710 www.conf
--- www.conf.backup_20160710	2016-07-10 08:00:45.267704077 +0000
+++ www.conf	2016-07-10 08:01:38.451085053 +0000
@@ -5,9 +5,11 @@
 ; Note: The user is mandatory. If the group is not set, the default user's group
 ;       will be used.
 ; RPM: apache Choosed to be able to access some dir as httpd
-user = apache
+; user = apache
+user = nginx
 ; RPM: Keep a group allowed to write in log dir.
-group = apache
+; group = apache
+group = nginx
```
* /etc/nginx/nginx.confの編集 (backupを取った上で編集)

```diff
$ diff -uN nginx.conf.backup_20160710 nginx.conf
--- nginx.conf.backup_20160710	2016-07-10 07:49:38.694839828 +0000
+++ nginx.conf	2016-07-10 07:59:49.564346085 +0000
@@ -32,13 +32,14 @@
     # for more information.
     include /etc/nginx/conf.d/*.conf;
 
-    index   index.html index.htm;
+    index   index.php index.html index.htm;
 
     server {
         listen       80 default_server;
         listen       [::]:80 default_server;
         server_name  localhost;
-        root         /usr/share/nginx/html;
+        #root         /usr/share/nginx/html;
+        root         /var/www/default;
 
         # Load configuration files for the default server block.
         include /etc/nginx/default.d/*.conf;
@@ -46,8 +47,17 @@
         location / {
         }
 
-        # redirect server error pages to the static page /40x.html
+        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
         #
+        location ~ \.php$ {
+            root           /var/www/default;
+            fastcgi_pass   127.0.0.1:9000;
+            fastcgi_index  index.php;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/default$fastcgi_script_name;
+            include        fastcgi_params;
+        }
+
+        # redirect server error pages to the static page /40x.html
         error_page 404 /404.html;
             location = /40x.html {
         }
@@ -64,16 +74,6 @@
         #    proxy_pass   http://127.0.0.1;
         #}
 
-        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
-        #
-        #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;
-        #}
-
```
* 再起動して、phpinfoページが見れればOK (http://<<IPアドレス>>)

```shell_session
$ sudo service php-fpm start
Starting php-fpm:                                          [  OK  ]
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

* ついでにサーバ起動時などに自動で起動するものも設定

```shell_session
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on
```

### nginxとphp-fpmの接続をsocketにする
* php-fpmの設定変更

```diff
$ diff -uN www.conf.backup_20160710 www.conf
--- www.conf.backup_20160710	2016-07-10 08:00:45.267704077 +0000
+++ www.conf	2016-07-10 08:19:03.630366042 +0000
@@ -19,7 +21,8 @@
 ;                            (IPv6 and IPv4-mapped) on a specific port;
 ;   '/path/to/unix/socket' - to listen on a unix socket.
 ; Note: This value is mandatory.
-listen = 127.0.0.1:9000
+; listen = 127.0.0.1:9000
+listen = /var/run/php-fpm/php-fpm.sock

@@ -32,6 +35,8 @@
 ;                 mode is set to 0660
 ;listen.owner = nobody
 ;listen.group = nobody
+listen.owner = nginx
+listen.group = nginx
 ;listen.mode = 0660
```
* nginxの設定変更

```diff
$ diff -uN nginx.conf.backup_20160710 nginx.conf
--- nginx.conf.backup_20160710	2016-07-10 07:49:38.694839828 +0000
+++ nginx.conf	2016-07-10 08:20:37.741301066 +0000
@@ -46,8 +47,17 @@
-            fastcgi_pass   127.0.0.1:9000;
+            fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
```
* 再起動

```shell_session
$ sudo service php-fpm restart
Stopping php-fpm:                                          [  OK  ]
Starting php-fpm:                                          [  OK  ]
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```

### Laravel5を入れてみる
* Composerをインストール

```shell_session
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv /home/ec2-user/composer.phar /usr/local/bin/composer
```

* Laravelのインストール

```shell_session
$ sudo /usr/local/bin/composer global require "laravel/installer"
Changed current directory to /root/.composer
Using version ^1.3 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing symfony/process (v3.1.2)
    Downloading: 100%         

  - Installing symfony/polyfill-mbstring (v1.2.0)
    Downloading: 100%         

  - Installing symfony/console (v3.1.2)
    Downloading: 100%         

  - Installing guzzlehttp/promises (1.2.0)
    Downloading: 100%         

  - Installing psr/http-message (1.0)
    Downloading: 100%         

  - Installing guzzlehttp/psr7 (1.3.1)
    Downloading: 100%         

  - Installing guzzlehttp/guzzle (6.2.0)
    Downloading: 100%         

  - Installing laravel/installer (v1.3.3)
    Downloading: 100%         

symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
```
* php-xmlのインストール (laravelで必要になる)

```shell_session
$ sudo yum install --enablerepo=webtatic-testing php70w-xml
```

* プロジェクト作成

```shell_session
$ pwd
/var/www/default
$ sudo /usr/local/bin/composer create-project --prefer-dist laravel/laravel darmaso
Installing laravel/laravel (v5.2.31)
  - Installing laravel/laravel (v5.2.31)
    Downloading: 100%         

Created project in darmaso
> php -r "copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
・・・・・ (下記の結果と同じ)

$ cd darmaso
$ sudo /usr/local/bin/composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
・・・・・
Writing lock file
Generating autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader

※php-xmlをインストールしておかないと、下記のようなエラーが出るので注意
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpunit/phpunit 4.8.9 requires ext-dom * -> the requested PHP extension dom is missing from your system.
・・・・・
    - Installation request for phpunit/phpunit ~4.0 -> satisfiable by phpunit/phpunit[4.0.0, 4.0.1, 4.0.10, 4.0.11, 4.0.12, 4.0.13, 4.0.14, 4.0.15, 4.0.16, 4.0.17, 4.0.18, 4.0.19, 4.0.2, 4.0.20, 〜
・・・・・
  To enable extensions, verify that they are enabled in those .ini files:
    - /etc/php.ini
    - /etc/php.d/bz2.ini
    - /etc/php.d/calendar.ini
・・・・・
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
```

* Applicationキーの生成 (composerでインストールした場合セットされているらしいが念のため)

```shell_session
$ sudo php artisan key:generate
Application key [base64:YVeCf2A+5IjUbk2qVL4HhPiecBdYuo8irJrEYjJKZWY=] set successfully.
```

* Laravel用にnginx設定を修正し、再起動

```diff
$ diff -uN nginx.conf.backup_20160710 nginx.conf
+        #root         /var/www/default;
+        root         /var/www/default/darmaso/public;
・・・・・
         location / {
+            try_files $uri $uri/ /index.php?$query_string;
         }
・・・・・
+            #root           /var/www/default;
+            root           /var/www/default/darmaso/public;
・・・・・
+            #fastcgi_param  SCRIPT_FILENAME  /var/www/default$fastcgi_script_name;
+            fastcgi_param  SCRIPT_FILENAME  /var/www/default/darmaso/public$fastcgi_script_name;

$ sudo service php-fpm restart
$ sudo service nginx restart
```

* これで動作確認するとエラーになるので下記の設定をしてみる

```shell_session
$ sudo chmod -R 777 storage/
$ sudo chmod -R 777 vendor/
```
※本来は、サーバアカウントをちゃんと定義してやるべきだが、今回は試しなのでこのままでOKとする

* 一部の設定を変えてみる

```diff:config/app.php
$ diff -uN config/app.php.backup_20160710 config/app.php
--- config/app.php.backup_20160710	2016-07-10 09:37:07.881735079 +0000
+++ config/app.php	2016-07-10 09:40:54.263419145 +0000
@@ -52,7 +52,7 @@
     |
     */
 
-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',
 
     /*
     |--------------------------------------------------------------------------
@@ -65,7 +65,7 @@
     |
     */
 
-    'locale' => 'en',
+    'locale' => 'jp',
 
     /*
     |--------------------------------------------------------------------------
@@ -78,7 +78,7 @@
     |
     */
 
-    'fallback_locale' => 'en',
+    'fallback_locale' => 'jp',
```

これで構築した環境にアクセスしたところ、無事いけました！
設定内容が荒いところもありますが、上記まででPHP+Nginx自体はいけちゃいますね。

Nginxの設定はあまり大したことはできませんでしたが、今後は色々と勉強してみようと思いますmm

### 参考
* [Laravel公式](http://readouble.com/laravel/5/0/0/ja/)