今さらながらnginx x fastcgiでphp5を動かす on debian

いまではもう当たり前になってしまったphp5をnginxでfastcgiとして動かす方法です。spawn-fcgiを使って構築します。Debian5とちょっと古めの環境ですが aptでspawn-fcgiを直接入れてあげれば問題ないと思います。

環境はさくらVPS上のdebianです。

# 1. nginx, php5関係のインストール

```zsh
# apt-get update
# apt-get upgrade
# apt-get install nginx php5-cli php5-cgi php5-gd spawn-fcgi
```

debian5ではspawn-fcgiはaptから入れられません。

http://redmine.lighttpd.net/projects/spawn-fcgi

よりソースからspawn-fcgiをインストールしてください。

```zsh
# wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
# tar zxvf spawn-fcgi-1.6.3.tar.gz
# cd spawn-fcgi-1.6.3
# ./configure
# make
# make install
```

# 2. php-fastcgiの作成と編集(spawn-fcgiのwrapper)

```zsh:/usr/bin/php-fastcgi
#! /bin/sh
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www-data -f /usr/bin/php5-cgi
# /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www-data -f /usr/bin/php5-cgi
# chmod 755 /usr/bin/php-fastcgi
```

ソースからspawn-fcgiを入れた場合のパスは/usr/local/bin/spawn-fcgiになります。

またphp5-cgiが存在しなくともエラーは出ませんので注意してください。

# 3. /etc/init.d/php-fastcgiを作成

２で設定したようにfastcgiはデーモンとして駐在します。fastcgiを起動スクリプト。

/etc/init.d/ 以下に を作成

```zsh:/etc/init.d/php-fastcgi
#!/bin/bash

### BEGIN INIT INFO
# Provides:          php-fastcgi
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the php-fastcgi
# Description:       starts the php-fastcgi
### END INIT INFO

PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=www-data
RETVAL=0
PIDFILE=/var/run/php5-cgi.pid
case "$1" in
  start)
    su - $FASTCGI_USER -c $PHP_SCRIPT
    pidof php5-cgi > $PIDFILE
    RETVAL=$?
  ;;
  stop)
    killall -9 php5-cgi
    echo '' > $PIDFILE
    RETVAL=$?
  ;;
  restart)
    killall -9 php5-cgi
    su - $FASTCGI_USER -c $PHP_SCRIPT
    pidof php5-cgi > $PIDFILE
    RETVAL=$?
  ;;
  *)
    echo "Usage: php-fastcgi {start|stop|restart}"
    exit 1
  ;;
esac
exit $RETVAL
console output
```

```zsh
# chmod 755 /etc/init.d/php-fastcgi
# update-rc.d php-fastcgi defaults
# /etc/init.d/php-fastcgi start
```

起動すると

``zsh
spawn-fcgi: child spawned successfully: PID: 0000
```

というメッセージが出ます。

```zsh
 2142 ?        Ss     0:00 /usr/bin/php5-cgi
 2143 ?        S      0:00 /usr/bin/php5-cgi
 2144 ?        S      0:00 /usr/bin/php5-cgi
 2145 ?        S      0:00 /usr/bin/php5-cgi
 2146 ?        S      0:00 /usr/bin/php5-cgi
 2147 ?        S      0:00 /usr/bin/php5-cgi
 2148 ?        S      0:00 /usr/bin/php5-cgi
```

デーモンとしてphp5-cgiが駐在します。

# 4. nginxの設定

```zsh
# mkdir /var/www/yourhostname.com
# chown -R www-data:www-data /var/www/yourhostname.com
# vim /etc/nginx/nginx.conf
```

nginx.confの内容

```zsh
user www-data;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
     include /etc/nginx/mime.types;
     sendfile on;
     keepalive_timeout  65;
     tcp_nodelay on;
     gzip on;
     server {
         listen 80;
         server_name yourhostname.com;
         access_log /var/log/nginx/yourhostname.com.log;
         error_log /var/log/nginx/yourhostname.com.error.log;
         location / {
             root /var/www/yourhostname.com;
             index index.html index.htm index.php mtview.php;
         }
         location ~ \.php$ {
             include /etc/nginx/fastcgi_params;
             fastcgi_pass 127.0.0.1:9000;
             fastcgi_index index.php;
             fastcgi_param SCRIPT_FILENAME /var/www/yourhostname.com$fastcgi_script_name;
         }
     }
}
```

設定ファイルの説明はそれほど必要ではないと思います。

ApacheでいうDirectoryIndexesがindex項目になり、DocumentRootがroot項目に。

ここではテンプレートだけを載せておきます。詳細は検索してください。私が実験した環境では自動で起動しないようになっていましたので

```zsh
# update-rc.d nginx defaults
```

または、最近ではinsservを使って

```zsh
# insserv php-fastcgi
```

nginxの起動

```zsh
# /etc/init.d/nginx start # nginxの起動
 2130 ?        Ss     0:00 nginx: master process /usr/sbin/nginx
 2131 ?        S      0:00 nginx: worker process
```

としてnginxが駐在します。

# その他エラーなど

nginxの設定ファイルのリロード、構文チェックは下記のとおりです。

リロード：nginx -t
構文チェック：nginx -s reload
あとは/var/www/yourdomain.comにindex.phpなどでphpを動かすだけです。

「No input file specified.」のエラーは
fastcgi_param SCRIPT_FILENAME /var/www/yourhostname.com$fastcgi_script_name;
のパスが間違っている場合。php cgiの場所が不明のエラーなどが考えられます。

参考：
http://library.linode.com/web-servers/nginx/php-fastcgi/ubuntu-10.04-lucid
http://wiki.nginx.org/FcgiExampleJa
http://hima-j.in/linux/sakura-vps-ubuntu-10-04-nginx-php-fastcgi-web-server/
http://wiki.nginx.org/Configuration