Laravelとnginxを設定するファイルについてまとめる

# 概要

[Laravelの公式ドキュメント](https://readouble.com/laravel/5.8/ja/deployment.html#:~:text=%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%AD%E5%AE%9A-,Nginx,-Nginx%E3%82%92%E5%AE%9F%E8%A1%8C)に従って、Laravelとnginxを接続するために、nginx.confを設定し直す必要があった。



```
server{

   root   /var/www/sample/public; 

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

    location ~ \.php$ {      
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
```
 →その際に主に変更した

1. **rootディレクティブ**
1. **try_filesディレクティブ**
1. **locationディレクティブ**
1. **location ~ \.php$ {}部分のFast-CGIの設定**

に関して、変数やディレクティブの機能をまとめる。

# そもそもディレクティブとは

- ディレクティブとは、nginx上で各設定を定める項目のこと。
-  ;（セミコロン）もしくは｛｝（ブレース）で区切られる。

# 1.rootディレクティブ
|  構文 | root  ディレクトリパス; | 
| -------- | -------- | 
| 役割    |  サーバの公開するディレクトリを指定する。    |     

-  ファイルシステム上の参照されるパス　
＝　絶対URIのパス部分　＋　rootディレクトリで示されたパス

- **（例）** Laravelのプロジェクト(sample)が
`/var/www/html`の配下にあり、「http\://sample.com/」で表示させたい時。
  - ファイルシステム上で参照されるパスは「`/var/www/html/sample/public`」
     -  Laravelの実行は/public/index.phpが処理の起点。
     なので、publicディレクトリまで指定する。
  - 絶対URIのパス部分は`/`
  - rootディレクトリで示されるのは「`/var/www/html/sample/public`」である。

# 2.try_filesディレクティブ
|  構文 | try_files ファイルパス [ファイルパス] … 転送先のURI ;| 
| -------- | -------- | 
| 役割    |  指定したファイルパスが存在する場合はその内容を返し、存在しない場合は転送先のURIにリダイレクトする    |     

- **(例)** `location / {
    try_files $uri $uri/ /index.php?$query_string;
}`
  - `$uri`はリクエストされたパスを示す変数。ここでlocationディレクティブの外のrootディレクティブを`$uri`が指しているとする
 - すると(例)の読み方は、以下のようになる。
1. `$uri`は存在するかの確認
1. `$uri`がない場合、`$uri/`はあるか確認（`/`で終了しているので、つまりディレクトリ）は存在するか
1. 上二つにあてはらない場合`/index.php?$query_string`にリダイレクトする。
   

# 3.locationディレクティブ
|  構文 | location   URI {…（設定）…};| 
| -------- | -------- | 
| 役割    | URIごとに設定を定めることができる  |     

　**(例)**　

``` 
//httpディレクティブ内において

server { 　　　//serverディレクティブはサーバごとの設定をできる

server_name www.sample.com; 　
root /var/www/html;  

location /text/ {設定A}
}

```
→http\://www.sample.com/text/にアクセスしたら設定Aが反映される。

# 4. location ~ \.php$ {}部分のFast-CGIの設定 
- 以下がFast-CGIの設定 がされているコード部分
```
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
```
-   `\.php$` は正規表現でURIが.phpで終わる場合にこの中の設定が反映される。
    - `~`はlocationでのURIに正規表現（大文字小文字を区別）が
   使われることを示す修飾子
    - `\`が直後の文字をエスケープ処理する正規表現。今回は「`.`」をエスケープ処理
    - `$`は末尾がその文字で終わることを示す正規表現。今回は「p」 で終わらなければならない。
- nginxはphp-fpmを経由してLaravelと接続する。
- しかし、nginxとphp-fpmはプロトコルが異なるので、UNIXドメインソケット通信をしなければらない。
  -   UNIXドメインソケット通信とは、プロセス間のデータのやり取りを行う仕組みの一つである。UNIX ドメインソケットによるプロセス間通信ではファイルシステムを利用し、 nginx プロセスと php-fpm プロセスの通信を行っている。

|  構文 |  fastcgi_pass unix:UNIXドメインソケットファイル;| 
| -------- | -------- | 
| 役割    | FastCGIサーバへUNIXドメインソケット通信をする  |     

→この時UNIXドメインソケットファイルに関しては,
`/etc/php-fpm.d/www.conf`内に記述されているlistenするファイル先を指定する。




|  構文 |  fastcgi_index ファイル名;| 
| -------- | -------- | 
| 役割    |$ fastcgi_script_name変数の値で、スラッシュで終わるURIの後に追加されるファイル名を設定される。  |     

→上のコードでは/で終わった場合、`index.php`が`$ fastcgi_script_name`変数の値として渡される。


|  構文 |  fastcgi_param パラメータ ;| 
| -------- | -------- | 
| 役割    | FastCGI サーバに渡されるべきパラメータを設定 |     

→今回はFastCGIサーバへ渡すスクリプトを定める引数SCRIPT_FILENAMEとして、`$document_root$fastcgi_script_name`が渡される。
→変数`$document_root`はルートディレクティブのパスであり、`$fastcgi_script_name`は `fastcgi_index`ディレクティブで定めた`index.php`である。

|  構文 |  include ファイル名;| 
| -------- | -------- | 
| 役割    |  指定された他の設定ファイルを読み込む  |     

→今回、FastCGI用の変数を定義するファイルである「fastcgi_params」を読み込んでいる。

## 参考
- [nginx実践入門](https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-WEB-DB-PRESS-plus/dp/4774178667/ref=sr_1_1?adgrpid=56053864951&dchild=1&gclid=EAIaIQobChMIrau9pYyU6gIViFZgCh1VLA71EAAYASAAEgJKKPD_BwE&hvadid=338518510752&hvdev=c&hvlocphy=1028853&hvnetw=g&hvqmt=e&hvrand=17210650111491866273&hvtargid=kwd-332420995816&hydadcr=27263_11561108&jp-ad-ap=0&keywords=nginx+%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80&qid=1592783333&sr=8-1&tag=googhydr-22)

- nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築するhttps://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc
- 正規表現について　https://murashun.jp/blog/20190215-01.html
- PHPフレームワーク「Laravel」における処理の流れと、ルーティングを理解しようhttps://codezine.jp/article/detail/11370

- Laravel公式で紹介されているNginxの設定の理屈が分からない人向けhttps://qiita.com/k_hoso/items/33ccb5e02e73a244ed31
-  includeディレクティブについて  https://heartbeats.jp/hbblog/2012/02/nginx03.html
- Laravelとnginxの設定の仕方（Lalavel公式ドキュメント）https://readouble.com/laravel/5.8/ja/deployment.html
-  nginxの変数について（公式ドキュメント）http://nginx.org/en/docs/varindex.html
- FastCGIのディレクティブに関して（公式ドキュメント）http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_index