読者です 読者をやめる 読者になる 読者になる

ショウジンブログ

Learn as if you will live forever, Live as if you will die tomorrow.

PHPをFastCGIで実行する@Nginx

Sponsored Links

FastCGIでPHPが実行できるようにする。

書籍「ハイパフォーマンスHTTPサーバ Nginx入門」の「FastCGI入門」を参考に進める。

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門

先にちょっと勉強しておく。

CGIとあるようにFastCGIはCGIの一種である。

CGIによる処理にはいい面の反面、大きな欠点がある。

個々の要求ごとに別のプロセスが起動されるため、メモリや各種コンテキスト情報はその要求ごとに失われてしまう。(処理ごとにプロセスを破棄)

プロセスの起動はシステムのリソースを大きく消費する。同時に大量の要求が届き、それらが1つずつプロセスを起動させるとなると、サーバはあっという間にそれらの処理で忙殺されるようになる。

安価なホスティングサービスだとPHPはCGIモードでの実行なことが多いがCGIモードでの実行では前述のように処理ごとにプロセスを破棄するのでオーバーヘッドが発生し、それがパフォーマンスの低下に繋がる。

ちょっと話はそれるけど

さくらの下位プラン(スタンダードプランとか)はCGIモードで動かしているのでWordPressなんかを運用すると、わりとすぐに割り当てメモリの消費量いっぱいに達してしまってプロセスを強制終了されたりする。前はそんな感じしなかった気がするけど、最近関わった案件では一般公開前で作業者が実装作業をしているだけのレベルでこれが頻発(500エラー)。

話もどって

その点、FastCGIはCGIの進化系で、CGIを大幅に改善している。

FastCGIでは、その点プロセスをメモリ上に永続化するので大量の要求も円滑に処理できるとのこと。

PHP-FPMを使う

NginxでPHPを使う場合、別プロセスで動作するPHPとFastCGIはソケット経由でやり取りを行うことになる。これを管理するモジュールの1つにPHP-FPMがあり今回はそれを使用することにする。(バックエンドCGIとしてPHP-FPMを選択)

EX-CLOUD既存のPHP(デフォルトでインストール済みのPHPは5.3.3)を削除。

$ sudo yum erase php53*

標準のyumリポジトリにはPHP-FPMがないのでこれを追加する。

$ sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
$ sudo wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
$ sudo wget http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
$ sudo rpm -ivh epel-release-5-4.noarch.rpm remi-release-5.rpm

remiリポジトリを使ってPHP、PHP-FPM他、必要なものをインストール。

$ sudo yum install php php-fpm php-devel php-cli php-xml php-mysql php-mbstring php-gd --enablerepo=remi

いくつか確認メッセージが出るけど、どれもyをタイプして進める。

Complete!となってインストールが完了したらPHP-FPMを確認する。

$ php-fpm -v
-bash: php-fpm: command not found

command not found、なぜ?

grepしてみるとちゃんとphp-fpm.x86_64が確認できる。

$ yum list installed | grep php

そして、設定ファイルも確認できる。

/etc/php-fpm.d/www.conf

が、どこかで見た記事だと、yumでインストールした場合、PHP-FPMの設定ファイルはこの/www.confと、もうひとつ、/etc/php-fpm.confがあるらしい。が、これは見当たらない。

んー、とりあえずこのまま進めて、www.confの編集をする。

f:id:showjinx:20160510122709p:plain

39行目の「apache」を「nginx」に。(実行ユーザをnginxに) 41行目の「apache」も「nginx」に。(実行グループをnginxに)

f:id:showjinx:20160510122747p:plain

60行目の「dynamic」を「static」に。これはPHP-FPMのプロセス生成方法の指定。プロセス数を動的に増減させたいのであれば「dynamic」。設定したプロセス数で固定なら「static」。

f:id:showjinx:20160510122815p:plain

70行目の「pm.max_children」の値を「5」に。前述のpmオプションをstaticにしたので、生成するプロセス数の指定をここでする。余裕があるようならこの値は調整する。

PHP-FPMを起動・自動起動するように設定

$ sudo /sbin/service php-fpm start
php-fpm を起動中: [ OK ]
$ sudo /sbin/chkconfig php-fpm on

続けて、PHPが実行できるようにする。

例:example.hoge

/etc/nginx/sites-available/example.hoge

server {
        listen 80;

        ## ホスト名 ##
        server_name example.hoge;
        index index.html index.html index.php
        charset utf-8;

        ## ログ ##
        access_log /var/log/nginx/example.hoge.access.log;
        error_log /var/log/nginx/example.hoge.error.log;

        location / {
                ## Webドキュメントルートの指定をフルパスで ##
                root /var/www/html/example.hoge/public_html;
                index index.html index.htm index.php;
        }

        root /var/www/html/example.hoge/public_html;
        location ~ \.php$ {
                root html;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /var/www/html/example.hoge/public_html$fastcgi_script_name;
        }

        location ~ /\.ht {
                deny all;
        }

}

既存の設定ファイルに追加したのは「ホスト名」のところの

index index.html index.html index.php
charset utf-8;

と、おなじくserverブロック内に

root /var/www/html/example.hoge/public_html;
location ~ \.php$ {
root html;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/example.hoge/public_html$fastcgi_script_name;
}

の部分。

この記述はあくまでもexample.hogeの設定ファイルにしただけなので今後別のホストを追加して、別のWeb領域で同様にPHPを実行したければそのホストの設定ファイルごとにこの処理をする必要がある。

面倒なんで/var/www配下は全部そうなる指定をどこかに出来ればいいんだけどそのへんはまだ全然わからないので、まずはこれで進めることにする。

設定ファイルの記法に間違いがないか以下コマンドで確認。

$ sudo /usr/sbin/nginx -t

設定ファイルに誤りがなく、エラーメッセージがでなければ(syntax is ok)下記コマンドを実行して変更内容を反映させる。

$ sudo /usr/sbin/nginx -s reload

確認用のindex.htmlをindex.phpに変更し、中に

<?php phpinfo(); ?>

を記述してブラウザでアクセスしてみる。

f:id:showjinx:20160510123302p:plain

PHPの情報が表示されるのを確認。PHPはちゃんと実行できている。

そういえば、デフォルトではPHPは5.3.3だったけど、現状は5.4.1だ。

確認が済んだらこの記述は削除しておく。

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門