どうも、シローです。
今回は前回(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) |
今回作るもの
今回作るページはこちらです。
ページを開いた回数をブラウザで表示するようにします。
ディレクトリ構成
1 2 3 |
├── css │ └── style.css ├── index.php |
ソース一覧
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php session_start(); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } else { $_SESSION['count']++; } $access_count = $_SESSION['count']; ?> <!doctype html> <html> <head> <meta charset="utf-8" /> <link href="css/style.css" rel="stylesheet" /> </head> <body> <div class="wrapper"> <h1>猫さん</h1> <div class="cat"> <img src="/image/sample.jpg" /> <div class="reply"> <p><?php echo $access_count; ?>回目のアクセスにゃ</p> </div> </div> </div> </body> </html> |
style.css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
.wrapper { position: absolute; background: #dcdcdc; width: 40%; top: 100px; left: 30%; text-align: center; } .wrapper img { display: block; width: 100%; height: auto; padding: 30px; box-sizing: border-box; } .cat { position: relative; } .reply { position: absolute; top: 10%; right: 10%; width: 30%; min-height: 86px; font-size: 1em; padding: 20px; background: white; border-radius: 50px; box-sizing: border-box; } |
PHP-fpmをインストールする
PHP-fpm(FastCGI Process Manager)はPHPをCGIとして実行するためのツールです。
NginxでPHPを実行するためにはPHP-fpmをインストールして、NginxからPHP-fpmへの通信を行うように設定しなければ行けないのです。
インストール
1 |
$ sudo apt-get install php-fpm |
PHP-fpmの設定ファイルの確認
1 2 3 4 5 |
$ sudo find / -name *php-fpm* /etc/php/7.2/fpm/php-fpm.conf <= これ . . . |
PHP-fpmをインストールされていることを確認したら。今度はNginx側の設定を編集します。
NginxにPHPファイルにアクセスされた場合、PHP-fpmにつなぐ設定を追加する
前回と同じく/etc/nginx/sites-available/sample-site.confを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
server { listen 8888; server_name sample-site.com; root /var/www/html/sample-site; access_log /var/log/nginx/sample-site/access_log; error_log /var/log/nginx/sample-site/error_log; location / { try_files $uri $uri/index.html = 404; } location /image/ { root /var/www; } location ~* \.php(/|$) { include fastcgi_params; # <= phpに渡すパラメータに関する設定ファイルを読み込んでいる if (!-f $document_root$fastcgi_script_name) { return 404; # <= 実行するphpのファイルパスが見つからない場合は404を返す } fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; # <= php-fpmに接続する fastcgi_split_path_info ^(.+\.php)(/.*)$; # <= ./test.php/article/1 のようなURIを #実行するファイル名($fastcgi_script_name)と #phpに渡すパス情報パラメータ($fastcgi_path_info)に分割する fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # <= 実行するスクリプトのパスを ルートディレクトリ/実行するファイル名 にする fastcgi_param PATH_INFO $fastcgi_path_info; # <= パス情報パラメータ } } |
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を再起動します。
1 |
$ sudo service nginx restart |
PHPが実行できるか試してみる
index.phpと同じ階層にtest.phpファイルを作成します。
1 2 3 4 |
<?php echo('<pre>'); var_export($_SERVER); echo('</pre>'); |
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を利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。