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_HTTP
に fastcgi
を追加した上で 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 の経験が少ないので何かと怖いところもあるが、現時点では問題なく動作している。