NginxでWordPressを実行する CORESERVER.JPからさくらのVPSに移行編

このブログをさくらのVPSに移行して記事を書いて終わり!と思ったが長期戦の予感がしてきたのでとりあえず書いてみることにする。これを書いている時点ではすでに移行しているので今日はそこまで話。

サーバの情報

今まで使っていたレンタルサーバはCORESERVER.JPのCORE-MINI。ずっとCORE-Aだと思ってた・・・。CORE-MINIだと300以下のアカウントで共有しているのでまぁそれは重いこともあるよなー。Load Avarageが10とかザラだったし。

XREA+/CORESERVER.JPはsafeモードでphpが動くのでSuper Cacheをレガシーモードで動かさざるを得なかったり、よく空のレスポンスが返ってくる(ChromeでERR_EMPTY_RESPONSEというエラーが表示されるやつ)ことがあっていい加減うんざりしていたのでVPSに移行することにした。

で移行先のサーバはさくらのVPS 2G。メモリ2Gの仮想3コア。さくらのバックボーンがあるので回線的なパフォーマンスも期待。OSはCentOSではなくDebian 6。

と、その前に

実はNginxにしたからといって速くなるとはまったく期待していなかった。自分が抱いていたNginxのイメージは静的ファイルの配布のパフォーマンスがいいのと、同時アクセス数が多くなってもパフォーマンスが落ちないというあたり。このブログ程度であれば別にNginxにしたところで対して変わらんだろうと思っていた。

http://codex.wordpress.org/Nginx
Before you consider using nginx, be aware that PHP APC or a similar opcode cache with a WordPress caching plugin is going to offer significant performance improvements over just switching from Apache to nginx. If you aren’t already using a PHP opcode cache and WordPress caching plugin, nginx will do squat for your WordPress-based website’s performance. Also, WordPress is intertwined with the Apache world so support for nginx-based setups is limited but growing. Factor these things into your decision to use nginx.

WordPress Codexにも上のように書いてあった。「オマイラもちつけ、APCやキャッシュプラグインを使えばApcheでも十分パフォーマンスはでる」と。

Nginx x WordPressで検索するといろんな記事がヒットするが意外に鉄板な設定はなく、運用を見極めながら決めないといけない。実際設定をしていて思ったが、Nginxは機能がシンプルだけに奥が深い。VPSなどサーバ構築の敷居が下がっているだけになんか速いんでしょ?と軽い気持ちで移行をすすめてはいけないと思った。

自己満足でNginxにします宣言

じゃぁ、なんでNginxにするのよ?ということだが理由は2つほどある。

1つPHP Ninjaの存在から。これまでにない速さという触れ込みのWordPressのサービスでベータ版に飛びついてみたが、その後判明した価格帯や機能から相当なアクセスがあるブログでしかサービスの良さを享受できないことがわかった。PHP NinjaはZ Cloud、Nginx、WordPress Tuningで高パフォーマンスを実現している。これならVPSで自分で同じような構成にするからいいよ。と完全な負け惜しみからくる自己満足で構築することを決意した。

2つ目はすこしまともな理由。NginxはWebサーバでもあるがリバースプロキシの機能が豊富なのが素敵。特にバックエンドの機能と疎結合に見えるのがいい。設定ファイルで正規表現を使いまくれるのも素敵。ソフトウェアエンジニアの視点から見ると体の良いdispatcherのように見える。正規表現でこのリクエストはNginxで、これはApacheで、とか、別のサーバに処理させるなども可能なのでいろんなチャレンジができそうというのが良い。

自分のテンション(モチベーション)を上げるのは重要なのでこういう邪な理由でも意味があるのである。

PHP5-FPMのインストール

NginxでPHPアプリケーションを実行する場合はバックエンドをCGIとしてを動かすことになる。それを実現する一つの方法が PHP-FPM (FastCGI Process Manager) である。以前はセットアップが面倒だったが、PHP5.3.3から本家に統合されたのでNginxではこれが主流になるだろう。

Debianではdotdebリポジトリを使えば、以下のコマンドでインストール可能。
aptitude install php5-fpm

Debian/UbuntuのPHP設定ファイルの階層は以下のようになっている。当然別ファイルなので注意が必要。デフォルトではポート9000で受け付ける(php-fpm.conf)。これはNginxの設定で使う。

/etc/php5/cli/php.ini
/etc/php5/apache2/php.ini
/etc/php5/fpm/php-fpm.conf
/etc/php5/fpm/php.ini

サービスはいつものように止めたり、動かしたりできる。

service php-fpm restart

WordPressアプリケーションの移行

レンタルサーバだけどドメインは自分のものを使っていた。つまり今回の移行ではURLは変わらないのでデータベースやWordPressのファイルはそのまま移行した(wp-content/cache/は除く)。移行後、権限の変更が必要なファイルがあったので備忘録として残しておく。ちなみにdotdebからインストールしたNginxのデフォルトの設定ではNginxはwww-dataで動作する。

sitemap.xml
sitemap.xml.gz
wp-content/wp-cache-config.php
wp-content/advanced-cache.php

最初の2つはGoogle XML Sitemapsプラグイン、残りの2つはWP Super Cacheプラグインにプラグインの設定ページから再生成できるので単にファイルを削除しておけばよい。基本的にアプリケーションが書き込むファイル以外の所有者や権限は変えたくない派。

WordPressを動かすためのNginxの最低限の設定

ようやく本題。

WordPressのためのNginxの設定はNginxのサイトやWordPressのサイトに書いてある。そして微妙に違うw

http://wiki.nginx.org/WordPress
http://codex.wordpress.org/Nginx

これ以外にも検索するといろいろ出てくる。どれも微妙に違うけど別にどれでもさほど問題なかったりもする。でもやはり知らない設定をコピペして使いたくない。とりあえずの最低限の設定は以下。あとはデフォルト。

upstream php {
    server 127.0.0.1:9000;
}

server {
    server_name blog.example.com;
    root /var/www/blog.example.com;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }   
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php;
    }    
    location ~ /\. {
       deny all;
    }
}

設定の補足。
1. 全部 /index.php に振っとけばindex指定は要らなくね?と思ったが index index.php;がないと管理ページ(/wp-admin/(index.php))にアクセスできなかった罠。
2. Nginxのサイトの設定 "try_files $uri $uri/ /index.php" を使っていたらパラメータが引き継がれないのでパーマリンクをカスタマイズしているときに投稿のプレビューが更新されない問題に遭遇。これはWordPress側の"try_files $uri $uri/ /index.php?$args;"が正解。

safeモードから解放されて、ようやくSuper Cache プラグインの「レガシーなページキャッシング」から「キャッシュファイルの提供に PHP を利用する」に変更できた。

これから調整していきたいこと

さくらのVPSに変えただけで快適になったのでまずは満足している。以下は徐々に対応していきたい。

  • Nginx/PHP-FPMの設定を調整
  • tcp portでアクセスするのがいいのかどうか
  • エラーページのカスタマイズ
  • 適切なphpスクリプトだけを対象にする
  • 静的ファイルの有効期限の設定
  • ログファイルに出力すべきものをフィルタ
  • APCを有効にしたらSIGSEGVが起きる原因の調査
  • Super Cacheプラグインでキャッシュをrewriteする設定

参考になったもの

書籍は以下の2冊を見ながらやっています。