NginxのPHP(FastCGI)をphp-fpmではなくspawn-fcgiで動かす

php-spawn-fcgi

NginxでPHPだけを動かすならphp-fpmを使えば設定も楽なんだけどMuninやらPHP以外のスクリプトをFastCGIで動かしている場合、もうspawn-fcgiで全部やっちゃえばいいのではというわけです。

$ spawn-fcgi -h
Usage: spawn-fcgi [options] [-- <fgiapp> [fcgi app arguments]]

options:
-f <path>      /usr/bin/php-cgi でいいけど非推奨なので -- <fcgiapp> を使う。
-a <address>   127.0.0.1 (Unix domain socketを使わない場合)
-p <port>      9000 (Unix domain socketを使わない場合)
-s <path>      /var/run/spawn-fcgi/php-fcgi.sock (-a, -p を使わない場合)
-C <children>  (PHP only) PHP_FCGI_CHILDRENの値が入るけどデフォルトが0なので数値指定
-F <children>  -C 使ってたらいいか (デフォルト 1)
-u <user>      nginx
-g <group>     nginx (nginx:nginx で実行してる)
-U <user>      Unix domain socketのユーザ
-G <group>     Unix domain socketのグループ

CentOS 6なら /etc/init.d/php-spawn-fcgi みたいな分かりやすい起動スクリプトを作って
start)
daemon /usr/bin/spawn-fcgi -s /var/run/spawn-fcgi/php-fcgi.sock -U nginx -u nginx -g nginx -P /var/run/spawn-fcgi/php-fcgi.pid -C 5 -- /usr/bin/php-cgi

あとは自動起動など
chkconfig php-spawn-fcgi on
/etc/init.d/php-spawn-fcgi start

Nginx側のfastcgi_passは↑で指定したやつにする
fastcgi_pass unix:/var/run/spawn-fcgi/php-fcgi.sock
これで、PHPに関してはServer API : CGI/FastCGIとして動く。

と、ここまで書いたけどphpfpm_status のようなこともできないし、宗教上の理由でもないかぎりphp-fpmを使った方がよいのではという感想。

/etc/init.d/php-spawn-fcgi の中身

#!/bin/sh
#
# php-spawn-fcgi
#
# chkconfig: 2345 86 16
# description: php spawn-fcgi service process
# pidfile: /var/run/spawn-fcgi/php-fcgi.pid

# Source function library.
. /etc/rc.d/init.d/functions

RETVAL=0

spawn_fcgi=/usr/bin/spawn-fcgi
php_cgi=/usr/bin/php-cgi
prog=`basename ${php_cgi}`
pidfile=/var/run/spawn-fcgi/php-fcgi.pid
lockfile=/var/lock/subsys/php-fcgi
sockfile=/var/run/spawn-fcgi/php-fcgi.sock

user=nginx
group=nginx

# PHP_FCGI_CHILDREN
fcgi_children=5

# See how we were called.
case "$1" in
    start)
        echo $"Starting $prog: "
        dir=$(dirname ${pidfile})
        [ -d $dir ] || mkdir $dir
        chown ${user}:${group} $dir
        # spawn-fcgi
        daemon ${spawn_fcgi} -s ${sockfile} -U nginx -u ${user} -g ${group} -P ${pidfile} -C ${fcgi_children} -- ${php_cgi} spawn-fcgi
        RETVAL=$?
        if [ $RETVAL = 0 ]; then
            echo_success
            touch ${lockfile}
        else
            echo_failure
        fi
        echo
        ;;
    stop)
        echo -n $"Stopping $prog: "
        killproc -p ${pidfile} ${prog}
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
        ;;
    status)
        status -p ${pidfile} ${prog}
        RETVAL=$?
        ;;
    restart|reload)
        $0 stop
        $0 start
        RETVAL=$?
        ;;
    *)
        echo $"Usage: $prog {start|stop|status|restart|reload}"
        RETVAL=2

esac
exit $RETVAL