Gentoo Linux で nginx + PHP-FPM を試してみる


 blog を WordPress に移行して数日、一部問題はあるものの概ね動作しているようで安心している。WodPress は PHP で動作するが、PHP 環境は Apache + mod_php という組み合わせが多いと思う。このパターンは動作事例が多いし安定もしているが、PHP のアプリケーションサーバとして Apache を使うためにどうしても Apache 1プロセス当たりのメモリ使用量が増えてしまう。その結果、画像を返すだけのリクエストだとしても、占有メモリが肥大化した Apache で処理することになる。最近の Linux の fork は実際にはコピーオンライトなので書き込みのないメモリ領域は共有化しているとはいえ、効率が悪いのは否めない。

 そこで、Apache Tomcat のように PHP のみを別プロセスとして動作させる FastCGI が有効になる。これまでは spawn-fcgi で回すのがよくあるパターンだったが、PHP 5.4.0RC2 から PHP-FPM (A simple and robust FastCGI Process Manager for PHP) がマージされているのでこれを使ってみた。ディストリビューションは例によって Gentoo Linux になる。今回はウェブサーバとして nginx を使っているが、Apache で動作させる場合は mod_fastcgi を使えばよい。

 まず、PHP を PHP-FPM を使える状態にしてコンパイルする。なお、現時点では 5.4.0RC4 と Release Candidated な状態なので、本番投入には若干躊躇される状態になっている。

ACCEPT_KEYWORDS="~amd64" USE="fpm" emerge php

 インストールが終わると、FPM 関連の設定ファイルができているので /etc/php/fpm-php5.4/php-fpm.conf を変更する。変更といっても、とりあえず listen を環境に合わせて変更する程度で問題ないかと思われる。今回は TCP 経由で接続することにした。

listen = 127.0.0.1:9000

 修正できたら、デーモンを起動する。

/etc/init.d/php-fpm start

 無事に起動すれば、php-fpm プロセスが立ち上がるはず。

# ps auxw | grep php
root      2582  0.0  0.2 149600  6112 ?        Ss   Dec26   0:29 php-fpm: master process (/etc/php/fpm-php5.4/php-fpm.conf)
nginx     2583  0.0  1.5 173168 32116 ?        S    Dec26   1:26 php-fpm: pool www
nginx     2584  0.0  1.7 176804 36724 ?        S    Dec26   1:25 php-fpm: pool www
nginx     2586  0.0  1.5 173276 32464 ?        S    Dec26   1:29 php-fpm: pool www
nginx     2587  0.0  1.5 172244 31580 ?        S    Dec26   1:28 php-fpm: pool www
nginx     2589  0.0  1.7 177004 36452 ?        S    Dec26   1:25 php-fpm: pool www
nginx     2590  0.0  1.7 177020 36464 ?        S    Dec26   1:27 php-fpm: pool www
nginx     2591  0.0  1.5 172200 32172 ?        S    Dec26   1:28 php-fpm: pool www
nginx     2593  0.0  1.6 173832 33272 ?        S    Dec26   1:25 php-fpm: pool www
nginx     2594  0.0  1.6 174128 34224 ?        S    Dec26   1:25 php-fpm: pool www
nginx     2595  0.0  1.6 174372 33872 ?        S    Dec26   1:24 php-fpm: pool www
nginx     2596  0.0  1.6 174480 34764 ?        S    Dec26   1:24 php-fpm: pool www
nginx     2597  0.0  1.6 174448 34596 ?        S    Dec26   1:24 php-fpm: pool www
nginx     2600  0.0  1.6 174376 34012 ?        S    Dec26   1:29 php-fpm: pool www
nginx     2601  0.0  1.6 174556 34700 ?        S    Dec26   1:25 php-fpm: pool www
nginx     2602  0.0  1.6 175584 34836 ?        S    Dec26   1:27 php-fpm: pool www
nginx     2603  0.0  1.6 174296 33452 ?        S    Dec26   1:25 php-fpm: pool www
nginx     6888  0.0  1.7 177024 35664 ?        S    Dec26   0:49 php-fpm: pool www
nginx     6889  0.0  1.6 175300 34116 ?        S    Dec26   0:48 php-fpm: pool www
nginx     6891  0.0  1.6 175304 34376 ?        S    Dec26   0:47 php-fpm: pool www
nginx     7104  0.0  1.7 176324 35056 ?        S    Dec26   0:43 php-fpm: pool www

 次に nginx をコンパイルする。FastCGI 昨日が必要なので、/etc/make.conf を修正して NGINX_MODULES_HTTPfastcgi を追加した上で emerge する。

emerge nginx

 コンパイルが済んだら、/etc/nginx/nginx.conf を修正して、バーチャルホストの設定に以下の location ディレクティブを書いておく。

location ~ .*.php$ {
    include /etc/nginx/fastcgi.conf;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
}

 nginx を起動し、PHP スクリプトが問題なく動作すれば設定完了。次回のマシン起動時に PHP-FPM と nginx が自動起動するように設定しておく。

# rc-update add php-fpm default
 * service php-fpm added to runlevel default
backend01 ~ # rc-update add nginx default
 * service nginx added to runlevel default

 実際に試してみると、nginx のシンプルさもあって割と簡単に動作させることができた。個人的には nginx の経験が少ないので何かと怖いところもあるが、現時点では問題なく動作している。