nginxとFastCGIでPHP

WebサーバをApacheからnginxに置き換えた。

速いしメモリは少なくて済むし素晴らしいのだけど、PHPが使えない。nginxにはmod_phpのようなhttpサーバに統合されたPHP実行環境が無いのだ。や、正直PHPなんて使えなくても構わないんですけど、世の中PHPで書かれたwiki等のツールがたくさんあって、それらをnginxで使おうというならばFastCGIが必要になるのです。普通のCGIで動かすにはちと重いですからね。

Ubuntuで簡単に使えるFastCGIの実行環境は2つあるようだ。

spawn-fcgi

インストール

$ sudo aptitude install php5-cgi
$ sudo aptitude install spawn-fcgi

FastCGIのプロセスを立ち上げる

$ spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -C 3 -P /var/run/php5-fcgi.pid

Cオプションは子プロセス数。3とすると親と合わせて4プロセスでPHPを処理する。Fもプロセス数を指定するオプションだが、PHPの場合はCを使う。

nginx.confを修正。*.php へのアクセスをFCGIに回す

    server {
        # ....

        index        index.html index.php
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

起動スクリプトは自分で用意しなければならない。

php-fpm

PHP5.3で導入されたFCGIプロセス管理ツールらしい。FCGIプロセスにPHPしか使えない代わりに設定が楽。Ubuntu標準のAPTリポジトリにはパッケージがないが、nginxチームがメンテしているリポジトリにあるので、それを使うといい。

リポジトリの追加

$ sudo aptitude install python-software-properties
$ sudo add-apt-repository ppa:nginx/php5
$ sudo aptitude update

インストール

$ sudo aptitude install php5-fpm

起動スクリプトも作成される

$ sudo service php5-fpm start

nginxの設定ファイルはspawn-fcgiの場合と同じ。

その他

daemontoolsというもので管理する方法もあるらしい。プロセスが死んだら再起動などしてくれるそうだ。ま、ApacheIIS以外でphpを使いたいならば、特に理由がなければLighttpdとか使った方がいいんじゃないすかね。WebサーバがFastCGIプロセスを管理してくれるし。

というかnginxのメモリの使用量はApacheに比べて少ないとはいえ、fastcgiのプロセスをいっぱい立ててしまったら結局メモリを大量消費してしまうわけです。Apacheで良いんじゃないか?

そこでx-sendfileですお。続く?