nginx+fastcgi+APC

このサーバのフロントエンドをapacheからnginxに入れ替えた。 passenger経由で動かしていたredmineがとても遅いというクレームがあったのと、最近apacheいじってなくて設定にちょっと不安が出てきたので。つーかnginxのが設定項目が少なくて楽だし。 参考にしたのはここここここ。init scriptとかまんまコピペですいません。

まず、wordpressを動かすためにfastcgiを入れる。fastcgiはubuntuだとphp5-cgiパッケージに入っている。 php周りが入れ替わるのでphp5-mysqlと、ついでにphp-pear、php5-devも入れておく。 でもってapacheなしでfastcgiだけを起動するため、/etc/init.d/php5-fastcgiを書く。

#!/bin/bash
BIND=127.0.0.1:8888
USER=www-data
PHP_FCGI_CHILDREN=2
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php5-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
      echo -n "Starting PHP FastCGI: "
      start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}
stop() {
      echo -n "Stopping PHP FastCGI: "
      killall -q -w -u $USER $PHP_CGI
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
      start
  ;;
    stop)
      stop
  ;;
    restart)
      stop
      start
  ;;
    *)
      echo "Usage: php5-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

ポートはお好みで。スクリプトを設置したらa+xして、update-rc.d php5-fastcgi defaultsとかやって起動するように設定。 最後にnginxの設定。sites-availableの適当なファイルに書いて、sites-enabledにsymlinkを貼る。

# for wordpress
upstream wp-blog-larus-jp {
  server 127.0.0.1:8888;
}

server {
  listen   80 default;
  server_name blog.larus.jp;

  location / {
    root /var/www/blog;
    index index.php index.html;

    # static files
    if (-f $request_filename) {
      expires 30d;
      break;
    }

    # request to index.php
    if (!-e $request_filename) {
      rewrite ^(.+)$  /index.php?q=$1 last;
    }
  }

  location ~ \.php$ {
                fastcgi_pass   wp-blog-larus-jp;
                fastcgi_index  index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /var/www/blog/$fastcgi_script_name;
  }

  location ~ /\.ht {
    deny all;
  }

  access_log  /var/log/nginx/blog.larus.jp-access.log combined;
  error_log  /var/log/nginx/blog.larus.jp-error.log;
}

ここまでやったら、apacheを止めてnginxとphp-fastcgiを起動すれば見れる。

ついでに高速化のため、APCを入れてみた。pecl install APCしてから/etc/php5/cgi/php.iniのどこかにextension=apc.soを入れる。 かなり表示が速くなったと思うんだけどどうだろう。 wordpressのキャッシュプラグインもあるんだけど、パーマリンクの形式を変えなければいけなかったりするので、とりあえずここまででいいか。

redmineは普通にunicornをバックエンドで動かしてsock経由で丸投げ。 例によってstatic fileはnginxで処理するようにした。

# for redmine
pstream unicorn-of-redmine {
  server unix:/var/www/rails/redmine/pids/unicorn.sock;
}

server {
        listen 80;
        server_name redmine.larus.jp;
        root /var/www/rails/redmine/public;

        location /images {
                root /var/www/rails/redmine/public;
                expires 30d;
        }

        location /stylesheets {
                root /var/www/rails/redmine/public;
                expires 30d;
        }

        location /javascripts {
                root /var/www/rails/redmine/public;
                expires 30d;
        }

        location / {
                if (-f $request_filename) { break; }
                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://unicorn-of-redmine;
        }

  access_log  /var/log/nginx/redmine.larus.jp-access.log combined;
  error_log  /var/log/nginx/redmine.larus.jp-error.log;
}

unicorn.rbとかは割愛。こっちもpassengerよりは遙かに速くなった。