no image

php-fpm(fastcgi)

1. PHPとPHP-FPMの違い

PHPとはWebサイトやWebAppに用いられるサーバサイドスクリプト言語です。
PHPはCLIスクリプトとして動作させることもできますが、一般的にはWebサーバとセットでセットアップしWebサイトを動的に生成させます。

PHPには各サーバソフト独自のモジュールインタフェース(SAPI)を用いてPHPとWebサーバソフトがやりとりするものとCGI/FastCGI経由で動作させるWebサーバがあります。

Webサーバタイプ Webサーバ例 PHPの利用方法
PHPをモジュール化したWebサーバ Apache, IIS PHPをモジュールとしてロード
PHPを組み込まないWebサーバ nginx, H2O CGI, FastCGI

2. PHPのインストール

PHP, php-fpmどちらをを利用する場合もPHPをインストールします。

2-1. リポジトリ追加

Linuxディストリビューション初期から組み込まれているPHPの場合、バージョンが古い事が大いにあります。
リポジトリを追加し最新のPHP環境を利用しましょう。PHPは5.X系から7.X系への移行に伴いスループット改善に力を入れる事を表明しており、今後は最新版を利用した方が機能面だけでなく、システムリソース面でも優位となる可能性があります。

最新版のPHPバージョンの確認

REMI repositoryサイトから利用OSにあったリポジトリURLを確認する。

CentOS7の場合は以下。
https://rpms.famillecollet.com/enterprise/remi-release-7.rpm

repositoryの追加

 $ sudo yum -y install https://rpms.famillecollet.com/enterprise/remi-release-7.rpm

2-2. PHPインストール

PHP-FPMを利用する場合でも通常のPHPと同様にPHPをインストールします。
REMIリポジトリの利用(PHP7.3系を利用)し、PHPとPHPモジュールをインストールします。

$ sudo yum -y update --enablerepo=remi,remi-php73 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql

3. php-fpmの設定(nginx)

コンフィグサンプル

3-1. httpディレクティブへの設定内容

キャッシュの設定は”/etc/nginx/nginx.conf”のhttpディレクティブへ設定します。

fastcgi_cache_path /var/cache/nginx/wpcache levels=1:2 keys_zone=wpcache:30m max_size=512M inactive=600m;

3-2. Serverディレクティブへの設定内容

fastcgiの設定はサイト毎に”/etc/nginx/conf.d/[filename].conf”のServerディレクティブへ設定します。

* HTTP/HTTPS含め2サイト以上設定している場合は、全てのファイルにfastcgiを設定する必要があります。

fastcgiを適用するファイルをphpとする

location ~ [^/]\.php(/|$) {
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                                return 404;
                }

fastcgiサーバのアドレスを指定

fastcgi_pass 127.0.0.1:9000;

URIが”/”で終わっている場合に付与するパスを指定

fastcgi_index index.php;

fastcgiに渡すパラメータ

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi include設定

include fastcgi_params;

cacheしないページ条件を指定

if ($request_method = POST) {
    set $do_not_cache 1;
}
if ($query_string != "") {
    set $do_not_cache 1;
}
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $do_not_cache 1;
}
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $do_not_cache 1;
}

fastcgi_cache zoneを指定

fastcgi_cache        wpcache;

キャッシュへのkeyの指定

fastcgi_cache_key    "$request_method:$scheme://$host$request_uri";

キャッシュ有効期限を設定

fastcgi_cache_valid  200 60m;

キャッシュしない条件を指定

fastcgi_no_cache     $do_not_cache;
fastcgi_cache_bypass $do_not_cache;

ヘッダにキャッシュ情報を付与する

add_header X-F-Cache $upstream_cache_status;