Nginx

Nginx+PHP-fpmでPHPをNginxで実行できるようにするまで

どうも、シローです。

今回は前回(https://shiro-secret-base.com/?p=458)に続いてPHPを使ってサイトのアクセスカウンターを実装しようと思います。

作業環境

OS Ubuntu 18.04.3 LTS
nginx -v 1.14.0 (Ubuntu)
phpfpm -v PHP 7.3.9 (fpm-fcgi) (built: Sep 17 2019 09:26:12)

今回作るもの

今回作るページはこちらです。

ページを開いた回数をブラウザで表示するようにします。

 

ディレクトリ構成

 

 

ソース一覧

index.php

style.css

 

PHP-fpmをインストールする

PHP-fpm(FastCGI Process Manager)はPHPをCGIとして実行するためのツールです。

NginxでPHPを実行するためにはPHP-fpmをインストールして、NginxからPHP-fpmへの通信を行うように設定しなければ行けないのです。

インストール

 

PHP-fpmの設定ファイルの確認

PHP-fpmをインストールされていることを確認したら。今度はNginx側の設定を編集します。

 

NginxにPHPファイルにアクセスされた場合、PHP-fpmにつなぐ設定を追加する

前回と同じく/etc/nginx/sites-available/sample-site.confを編集します。

15~26行目がPHP-fpmに関する記述です。

15行目のlocationディレクティブで拡張子がphpで始まるパスに対してphp-fpmに接続するように指定してます。

"~*"は大文字小文字を区別しない正規表現を使うと言う意味です。"*"を外した場合("~")、大文字小文字を区別する正規表現になります。

16行目ではphpを実行するのに必要なパラメータに関する設定ファイル(/etc/nginx/fastcgi_params)を読み込んでいます。

後ほどfastcgi_paramディレクティブで一部のパラメータを設定しているので、順番としてfastcgi_paramディレクティブより前に記述した方が安全です。

17~19行目では実行するphpファイルのパスが見つからなかった場合に404エラーを返すようになっています。

try_filesディレクティブを使わないのはパスが./test.php/article/1ようにphp拡張子のうしろにパス情報が繋がっている場合などにもphpファイルを実行できるようにするためです。

20行目のfastcgi_passディレクティブではphp-fpmを起動しているサーバに接続しています。(今回は同じサーバなのでunixによるソケット通信)

外部のphpサーバにつなぎたい場合は、そのサーバのIPアドレスとのphp-fpmように公開しているポート番号をつなげたドメインを指定します。

21~23行目ではURIをphp拡張子の前後で[実行するphpファイル名($fastcgi_script_name) | phpに渡すパス情報パラメータ($fastcgi_path_info)]に分割します。

24行目のfastcgi_paramディレクティブでは、実行するファイルのパス変数(SCRIPT_NAME)に

"ルーティングディレクトリ($document_root)"/"実行するphpファイル名($fastcgi_script_name)" を設定しています。

25行目のfastcgi_paramディレクティブでは、phpに渡すパス情報パラメータの変数(PATH_INFO)に"$fastcgi_path_info"に渡してます。

Nginxを再起動

 

編集がおわったらNginxを再起動します。

PHPが実行できるか試してみる

index.phpと同じ階層にtest.phpファイルを作成します。

sample-site.com:8888/test.phpでアクセスします。

 

PATH_INFO,SCRIPT_FILENAME,DOCUMENT_ROOT,SCRIPT_NAMEに注目するとfastcgi_paramで渡された情報が入っていることが確認できます。

次にsample-site.com:8888/test.php/article/1でアクセスします。

すると、同じくtest.phpのページが表示されます。

SCRIPT_FILENAMEを見ると"/var/www/html/sample-site/test.php"になっていて

"/test.php/article/1"がfastcgi_split_path_infoで分割された"/test.php"($fastcgi_script_name)が/var/www/html($document_root)に連結して出力されています。

また、PATH_INFOを見ると"/test.php/article/1"の "/article/1"が出力されています。

 

sample-site.com:8888/index.phpにアクセス

では、いよいよsample-site.com:8888/index.phpにアクセスしてみます。

すると、

と言うように、ページを開いた回数をサーバで保存しているので、アクセスするたびに

アクセス回数がカウントアップされたのを確認できれば完了です。

 

まとめ

  • NginxでPHPを実行するにはPHP-fpmに接続する必要がある
  • PHPを実行するときのパラメータを渡すためにfastcgi_paramsを読み込む必要がある
  • fastcgi_paramディレクティブで追加でパラメータを設定できる
  • SCRIPT_FILENAMEでは実行するファイルパスを指定する必要がある
  • /test.php/article/1のようにphpファイルの後ろにパスが続いてもphpファイルを実行するためにはfastcgi_split_path_infoディレクティブでファイルとパスのパラメータを分割する必要がある
nginx実践入門
nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。
nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。

-Nginx
-

© 2021 Shiro's secret base