NGINX + FastCGIでCakePHP環境構築 - Ubuntu 10.04編

CakePHPUbuntu 10.04にNGINX+fast-cgiで構築する手順のメモです。
この内容は、ほぼこちらの記事の翻訳になります。
http://kevin.vanzonneveld.net/techblog/article/cakephp_and_nginx/

NGINXをfast-cgiで動作するPHPと連携する場合、lighttpdCGIをプロセス実行するモジュールspawn-fcgiを利用します。
Ubuntu 10.04では標準の、リポジトリからNGINXおよびfast-cgi、spawn-fcgiをインストールできます。
spawn-fcgiは、aptでインストールしてもデーモンとしてインストールされないので、手動でデーモンとして登録する必要があります。

Ubuntu 10.10ではspawn-fcgiではなくPHP-FPMというモジュールを利用することが可能です。以下のページを参照:
http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-on-ubuntu-10.10
swanp-cgiはデーモンの設定は手動で行う必要がありますが、PHP-FPMはaptを使って自動でデーモンとしてインストールすることができます。
ただし、PHP-FPMは非常に不安定だと、kevinさんのサイトに書いてあります。

以降、NGINXでCakePHPを動作させる必要最低限の手順を説明します。

NGINXのインストール

$ sudo apt-get install nginx

fast-cgiとswanp-cgiのインストール

$ sudo apt-get install php5-cgi spawn-fcgi

swanp-cgiをデーモンとして設定する

swanp-cgiはポート9000で起動するように設定します。

$ sudo vi /etc/init.d/spawn-fcgi

以下のスクリプトは、https://github.com/kvz/kvzlib/blob/master/configs/spawnfcgi_initdに掲載されています。

#!/bin/sh
USER=www-data
GROUP=www-data
PATH=/sbin:/bin:/usr/sbin:/usr/bin
SSD="/sbin/start-stop-daemon" 
PHP_FCGI_CHILDREN=10
PHP_FCGI_MAX_REQUESTS=1000
RETVAL=0

FCGI_DAEMON="/usr/bin/spawn-fcgi" 
FCGI_PROGRAM="/usr/bin/php5-cgi" 
FCGI_PORT="9000" 
FCGI_SOCKET="/tmp/php-fastcgi.sock" 
FCGI_PIDFILE="/var/run/spawn-fcgi.pid" 

#test -x $LIGHTY_DAEMON || exit 0

set -e

export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS

. /lib/lsb/init-functions

case "$1" in
  start)
        log_daemon_msg "Starting spawn-fcgi" 
        if ! $FCGI_DAEMON -p $FCGI_PORT -f $FCGI_PROGRAM -u $USER -g $GROUP -C $PHP_FCGI_CHILDREN -P $FCGI_PIDFILE; then
            log_end_msg 1
        else
            log_end_msg 0
        fi
        RETVAL=$?
  ;;
  stop)
        log_daemon_msg "Killing all spawn-fcgi processes" 
        if killall --signal 9 php5-cgi > /dev/null 2> /dev/null; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        RETVAL=$?
  ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        exit 1
  ;;
esac

exit $RETVAL

spwan-fcgiに実効権限をつけて、デーモンとして登録します。

$ sudo chmod u+x /etc/init.d/spawn-fcgi
$ sudo update-rc.d spawn-fcgi defaults

spwan-fcgiを起動しておきます。

/etc/init.d/spawn-fcgi start

NGINXにCakePHPへの構成を設定する

$ sudo vi /etc/nginx/sites-available/default
server {
    listen      80;
    server_name example.com www.example.com;
    access_log  /var/log/nginx/example.com.access.log;
    error_log   /var/log/nginx/example.com.error.log;
    rewrite_log on;
    root        /var/www/example.com/app/webroot;
    index       index.php index.html index.htm;
 
    # Not found this on disk? 
    # Feed to CakePHP for further processing!
    if (!-e $request_filename) {
        rewrite ^/(.+)$ /index.php?url=$1 last;
        break;
    }
 
    # Pass the PHP scripts to FastCGI server
    # listening on 127.0.0.1:9000
    location ~ \.php$ {
        # fastcgi_pass   unix:/tmp/php-fastcgi.sock;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_intercept_errors on; # to support 404s for PHP files not found
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    
    # Static files.
    # Set expire headers, Turn off access log
    location ~* \favicon.ico$ {
        access_log off;
        expires 1d;
        add_header Cache-Control public;
    }
    location ~ ^/(img|cjs|ccss)/ {
        access_log off;
        expires 7d;
        add_header Cache-Control public;
    }
 
    # Deny access to .htaccess files,
    # git & svn repositories, etc
    location ~ /(\.ht|\.git|\.svn) {
        deny  all;
    }
}

NGINXをリスタートします。

$ sudo /etc/init.d/nginx restart

以上で、セットアップ終了です。