概要
Laravelの公式ドキュメントに従って、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;
}
}
→その際に主に変更した
- rootディレクティブ
- try_filesディレクティブ
- locationディレクティブ
- 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ディレクトリまで指定する。
- Laravelの実行は/public/index.phpが処理の起点。
- 絶対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
が指しているとする
-
- すると(例)の読み方は、以下のようになる。
-
$uri
は存在するかの確認 -
$uri
がない場合、$uri/
はあるか確認(/
で終了しているので、つまりディレクトリ)は存在するか - 上二つにあてはらない場合
/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 と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築するhttps://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc
-
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