• このエントリーをはてなブックマークに追加

はじめに

もう1週間経ってしまっていますが,新年,明けましておめでとうございます.

3日ほど実家には帰ったものの,2010年と2011年との境目がない感じにテンパり続けているissmを,本年もどうぞよろしくお願い申し上げます.(あと,こちらの本もあわせてよろしくお願いしますw)

ほぼ恒例になってきた年1回のぶろぐ気分転換を,本年もテキトーに行ってみました.コンセプトなどはありません.そのついでに,昨年は lighttpd で動作していたものを,今回は nginx で動作させてみました.

以下,本ぶろぐ,というか WordPress が nginx 上で動作するための設定の記録などをざっと紹介します.

レシピ

次のような環境で試してみます.

  • CentOS on さくらのVPS
  • nginx 0.8.53
  • MySQL 5.1.50
  • PHP 5.3.4
  • WordPress 3.0.4
  • $USER=www
  • $HOME=/home/www
  • $EDITOR=vim
  • ドメイン: blog.iss.ms
  • ドキュメントルート: /var/www/vhosts/iss.ms/blog/public/www
  • WordPressまわりをGitで管理

nginx,MySQL は既にインストールされ,動作しているものとします.私の環境では,

nginx: --prefix=$HOME/local/nginx
MySQL: --prefix=$HOME/local

な感じで入っています.

このサーバでは,PHPの使用は今回が初なので,これからインストールします.

nginx で PHP するには

nginx で PHP するには,FastCGI方式が前提になるようです.まぁそれだけではよくわからないので,「nginx php」でざっとググってみたところ,FastCGIプロセスを生成するには,主に次の方法があるようです.

  1. spawn-fcgi
  2. PHP-FPM

前者はなんだかいろいろメンドそうなので(根拠はない),今回は,後者の方法で行うことにしました.ちなみに「FPM」とは,「FastCGI Process Manager」を略したものです.

PHPをインストールする

これも $HOME/local に入れます.「FPM」を有効にるため,--enable-fpm オプションをつけておきます.

% ./configure --prefix=$HOME/local --enable-fpm --enable-cgi --with-mysql=$HOME/local --enable-mbstring --enable-mbregex --with-zlib=/usr --with-zlib-dir=/usr --with-gd --enable-exif --enable-ftp
% make
% make install

PHP-FPMを起動する

$HOME/loca/sbinphp-fpm コマンドが入るので,これを実行s...その前に,PHP-FPMのための設定を行う必要があります.

% cd $HOME/local/etc
% cp php-fpm.conf.default php-fpm.conf
% $EDITOR php-fpm.conf

設定の変更点は,とりあえず次のような感じです.

--- php-fpm.conf.default        2011-01-04 18:56:44.000000000 +0900
+++ php-fpm.conf        2011-01-04 23:45:37.000000000 +0900
@@ -155,22 +155,26 @@
 ; Note: Used only when pm is set to 'dynamic'
 ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
 ;pm.start_servers = 20
+pm.start_servers = 5
 
 ; The desired minimum number of idle server processes.
 ; Note: Used only when pm is set to 'dynamic'
 ; Note: Mandatory when pm is set to 'dynamic'
 ;pm.min_spare_servers = 5
+pm.min_spare_servers = 5
 
 ; The desired maximum number of idle server processes.
 ; Note: Used only when pm is set to 'dynamic'
 ; Note: Mandatory when pm is set to 'dynamic'
 ;pm.max_spare_servers = 35
+pm.max_spare_servers = 10
 
 ; The number of requests each child process should execute before respawning.
 ; This can be useful to work around memory leaks in 3rd party libraries. For
 ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
 ; Default Value: 0
 ;pm.max_requests = 500
+pm.max_requests = 500
 
 ; The URI to view the FPM status page. If this value is not set, no URI will be
 ; recognized as a status page. By default, the status page shows the following

設定ファイルをざっと見てなんとなくわかりましたが,Plack でいう plackup コマンドの各種オプションの値をここで調整するわけですね.

では,php-fpm を実行します.

% $HOME/local/bin/php-fpm

プロセスを確認してみます.

% ps aux -u $USER | grep php
www       8076  0.5  8.0 158728 41088 ?        S    03:23   1:57 php-fpm: pool www
www       8078  0.5  6.6 151764 34104 ?        S    03:23   1:56 php-fpm: pool www
www       8098  0.5  7.1 153464 36372 ?        S    03:25   1:56 php-fpm: pool www
www       8117  0.5  7.0 153444 36084 ?        S    03:27   1:58 php-fpm: pool www
www       8703  0.5  6.4 150244 32964 ?        S    04:00   1:44 php-fpm: pool www
www      11134  0.5  6.8 152032 34772 ?        S    08:14   0:24 php-fpm: pool www
www      11161  0.5  6.9 152936 35724 ?        S    08:17   0:24 php-fpm: pool www
www      11169  0.5  6.9 152900 35600 ?        S    08:17   0:24 php-fpm: pool www
www      12092  0.5  6.3 149976 32648 ?        S    09:17   0:03 php-fpm: pool www
www      12095  0.5  6.3 149964 32640 ?        S    09:17   0:03 php-fpm: pool www
www      12272  0.0  0.1  65412   876 pts/2    S+   09:27   0:00 grep -i --color=always php
www      14650  0.0  0.8 157400  4248 ?        S    Jan06   0:11 php-fpm: pool www
www      15041  0.0  0.2 121192  1228 ?        Ss   Jan04   0:01 php-fpm: master process (/home/www/local/etc/php-fpm.conf)

なんだか起動しているようですね.

実際には,php-fpm {start|stop|restart} とかできるようなスクリプトがあって,これを利用する形になると思います.まぁそのあたりは今後ということで.

nginxに設定を追加する

まぁだいたいこんな感じでしょうか.これを http {} スコープ内に追加します.

server {
    listen 80;
    server_name blog.iss.ms;
    root /var/www/vhosts/iss.ms/blog/public/www;
    index index.php;
 
    access_log /var/www/vhosts/iss.ms/blog/public/log/access_log combined;
    error_log  /var/www/vhosts/iss.ms/blog/public/log/error_log  debug;
 
    location / {
        # ref: http://stnard.jp/2010/04/20/115/
 
        # static files 
        if (-f $request_filename) {
            break;
        }
 
        # request to index.php
        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php?q=$1 last;
        }
    }
 
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /home/www/local/etc/nginx/fastcgi_params;
    }
 
    location ~ /\.ht {
        deny all;
    }
}

ポイントは *.php に関する処理ですね.先で起動した php-fpm が(デフォルトでは?)9000番ポートで待ち受けているので,これとのやりとりを行うための設定を記述します.まぁ私も他サイト様を参考にしたまでですがねw

設定を追加したら,nginxを再起動します.

% sudo nginx -s reload  # 80番ポートをlistenしているため,ここだけはroot権限で

単にPHPを動作させたい

WordPress 云々ではなくただ PHP を動作させたいような場合には,上記の設定から rewrite に関する記述を削除するだけです.場合によっては,ドキュメントルートあたりも調整した方がよさげです.

できあがり

たぶんこれで,WordPressが動作すると思います.(もちろん,WoresPressが入っていれば,ですよ.)とはいえ,各種機能を事細かに確認したわけではないので,どこか連携できていない部分もあるかもしれませんが.まぁ,このぶろぐがこうして動いているので,ひとまずは大丈夫なんじゃないでしょうかねw

なお,今回の環境では,nginxの再起動を除いて,非管理者権限で実行しているため,場合によってはそのあたりの調整も必要かもしれません.

Gitで管理

今回の気分転換ついでに,WordPressのファイル群を,Gitで管理するようにもしてみました.

masterブランチをローカル開発用,publicブランチを公開環境用,な感じです. また,公開サーバ上の /var/www/vhosts/iss.ms/blog/public へも,publicブランチでクローンしています.

テーマとかを修正するときは,次のような感じです.

  1. [ローカル] masterブランチで行いながらローカル環境で確認 & commit
  2. [ローカル] publicブランチに merge & push
  3. [公開サーバ] publicブランチを pull して反映

他にも,プラグインをアップグレードした際に git diff とか git status とかすると,ファイル構成への影響を確認できたりします.WP Super Cache プラグインを入れて設定をを変更すると wp-cconfig.php が書き換えられるのね,ということがこれでわかったりしました.

おわりに

以上,ぶろぐの気分転換を行うついでに,nginx + PHP-FPM で WordPress を動作させて見るお話でした.

テーマについては,まだ中途半端な部分が多々あるので,おいおい修正していきます.(なんだか昨年も同じことを言っていた気が...結局触らなかったし><)

参考