WordpressをnginxとPHP-FPM(FastCGI)で運用するための環境構築-1

published: 2011-11-21

PHP-FPMをインストール

サーバーの負荷軽減、パフォーマンス向上が期待されるということで、nginxとPHP-FPMでWordpressを運用することにしました。その構築手順です。 まずはPHP-FPMをインストールします。

環境

サーバーは、さくらインターネットのVPS512で、CentOS5を使用しています。Apache+PHP(モジュール)で運用中のサイトがあるので、それを活かしたままで稼働できるようにします。

PHPのダウンロード、インストール

CentOSの標準リポジトリとEPELには、PHP-FPMのパッケージがありません。RemiとかRPMForgeのメジャーなサードパーティを使い、パッケージでのインストールもできるのですが、稼働中のApacheへ影響がないように、ソースからPHPをインストールすることにしました。

ソースはphp.netから。現時点の最新版は5.3.8です。
作業はrootで行っています。
$ cd /usr/local/src
$ wget http://jp2.php.net/get/php-5.3.8.tar.gz/from/jp.php.net/mirror
$ tar zxf php-5.3.8.tar.gz
$ cd php-5.3.8

ソースからのインストールなので、configure; make; make install の流れで良いのですが、configureのオプションに気をつけないといけません。wordpressを稼働させるために必要なモジュールを一緒に組み込む必要があります。

$ ./configure --enable-mbregex --with-bz2 --with-curl --enable-exif --with-gd \
--with-gettext --enable-mbstring --with-mcrypt --with-openssl \
--enable-pcntl --enable-shmop --enable-sockets --with-xmlrpc \
--enable-zip --with-zlib \
--enable-fpm --enable-cgi \
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

このオプションは、全部必須ではないと思います。今後使いそうだなぁと思ったモジュール(exifとか)も入れています。

PHP-FPMをインストールするために、fpmとcgiを有効にしています(最後から2行目)。mysqlのドライバはphpのネイティブドライバを使用しています。

configureが終了したらmakeです。makeの際にコンパイルエラーが出る場合は必要なライブラリがないと思いますので、ライブラリもインストールします。(そのコンパイルエラーから必要なライブラリを特定するのが、ややこしいわけですが…)

$ make
$ make install

PHP-FPMの初期設定

コンパイルとインストールが終了したら、/usr/local(あるいは設定したprefix)以下に、etcなどのディレクトリが出来ています。 また、ソースを展開したフォルダの中に、PHP-FPMの標準設定のファイルが用意されているので、/usr/local/etcにphp-fpm.conf.defaultとしてコピーしておきます。さらにphp-fpm.conf.defaultを複製して、php-fpm.confとし、こちらを修正します。
$ cp sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf.default
$ cd /usr/local/etc
$ cp php-fpm.conf.default php-fpm.conf

php-fpm.conf.defaultと、修正後のphp-fpm.confのdiffです。

25c25
< ;pid = run/php-fpm.pid
---
> pid = run/php-fpm.pid
117c117
< ;listen.allowed_clients = 127.0.0.1
---
> listen.allowed_clients = 127.0.0.1
131,132c131,132
< user = nobody
< group = nobody
---
> user = nginx
> group = nginx
166c166
< ;pm.start_servers = 20
---
> pm.start_servers = 5
171c171
< ;pm.min_spare_servers = 5
---
> pm.min_spare_servers = 5
176c176
< ;pm.max_spare_servers = 35
---
> pm.max_spare_servers = 20
182c182
< ;pm.max_requests = 500
---
> pm.max_requests = 500

変更箇所は、pidファイル、allow_clientを有効にして、実行ユーザー、起動時のサーバー数、スペアのサーバー数、最大のサーバー数、最大リクエスト数を変更・有効にした点です。

実行ユーザーはnginxと組み合わせて使用するので、nginxにしました。
サーバーの起動や最大の数値は、運用状況に応じて変更させていく必要があります。また、パフォーマンスチューニングも考えると、ちゃんと設定を見直す必要はあると思います。

PHP-FPMのサービスの設定

初期設定の後に、PHP-FPMが常駐して稼働するように、サービスとして設定します。 rcスクリプトがphp-fpm.confと同じところにあります。/etc/init.d/に以下にコピーして、起動の確認をします。
$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
$ cd /etc/init.d
$ chmod 755 php-fpm
$ ./php-fpm start
$ ps -f -C php-fpm

psコマンドの実行後、複数のphp-fpmのプロセスが起動しているのが確認できる思います。

UID        PID  PPID  C STIME TTY          TIME CMD
nginx      980 18108  0 04:44 ?        00:00:05 php-fpm: pool www                                             
root     18108     1  0 03:52 ?        00:00:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)           
nginx    18109 18108  0 03:52 ?        00:00:08 php-fpm: pool www                                               
nginx    18110 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18111 18108  0 03:52 ?        00:00:08 php-fpm: pool www                                               
nginx    18112 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18113 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18132 18108  0 03:52 ?        00:00:07 php-fpm: pool www  

上手く起動していない場合、ログを確認してみてください。ログは/usr/local/var/log/php-fpm.logです。

起動が上手く行ったら、自動起動するように設定しておきます。chkconfigコマンドでonするだけです。listオプションでランレベルの確認も行っておきます。

$ chkconfig php-fpm on
$ chkconfig --list php-fpm
php-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

以上でPHP-FPMの設定は終わりです。


コマンドまとめ

ダウンロードからインストールまで
$ cd /usr/local/src
$ wget http://jp2.php.net/get/php-5.3.8.tar.gz/from/jp.php.net/mirror
$ tar zxf php-5.3.8.tar.gz
$ cd php-5.3.8
$ ./configure --enable-mbregex --with-bz2 --with-curl --enable-exif --with-gd \
--with-gettext --enable-mbstring --with-mcrypt --with-openssl \
--enable-pcntl --enable-shmop --enable-sockets --with-xmlrpc \
--enable-zip --with-zlib \
--enable-fpm --enable-cgi \
--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
$ make
$ make install

初期設定

$ cp sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf.default
$ cd /usr/local/etc
$ cp php-fpm.conf.default php-fpm.conf
$ vi php-fpm.conf
$ diff php-fpm.conf.default php-fpm.conf

25c25
< ;pid = run/php-fpm.pid
---
> pid = run/php-fpm.pid
117c117
< ;listen.allowed_clients = 127.0.0.1
---
> listen.allowed_clients = 127.0.0.1
131,132c131,132
< user = nobody
< group = nobody
---
> user = nginx
> group = nginx
166c166
< ;pm.start_servers = 20
---
> pm.start_servers = 5
171c171
< ;pm.min_spare_servers = 5
---
> pm.min_spare_servers = 5
176c176
< ;pm.max_spare_servers = 35
---
> pm.max_spare_servers = 20
182c182
< ;pm.max_requests = 500
---
> pm.max_requests = 500


$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
$ cd /etc/init.d
$ chmod 755 php-fpm
$ ./php-fpm start
$ ps -f -C php-fpm
UID        PID  PPID  C STIME TTY          TIME CMD
nginx      980 18108  0 04:44 ?        00:00:05 php-fpm: pool www                                             
root     18108     1  0 03:52 ?        00:00:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)           
nginx    18109 18108  0 03:52 ?        00:00:08 php-fpm: pool www                                               
nginx    18110 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18111 18108  0 03:52 ?        00:00:08 php-fpm: pool www                                               
nginx    18112 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18113 18108  0 03:52 ?        00:00:07 php-fpm: pool www                                               
nginx    18132 18108  0 03:52 ?        00:00:07 php-fpm: pool www  
$ chkconfig php-fpm on
$ chkconfig --list php-fpm
php-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off