NginxでWordPressを実行する 開発環境例

いくつかWordPressプラグインを開発しているのだけど、基本的に自分のブログでテストするのは最後で開発時は別に開発専用のWordPressを用意している。

その環境はVMWare PlayerでUbuntuをゲストOSとして実行している。いままではApache2で動かしていたけれど、Ubuntu 12.04 LTSのリリースのタイミングと今回さくらのVPSに移行したタイミングから開発環境でもNginxでテストすることに。

WordPress開発環境の構成

URL

開発時はwordpress-devというサーバ名で運用している。ブラウザでテストするマシン(ホストOS)の/etc/hosts(Windowsの場合はC:\Windows\System32\drivers\etc\hosts)に以下を追加しておく。

192.168.0.1 wordpress-dev

192.168.0.1は例であって実際はVMWareの仮想ネットワークが振るアドレスに変更となる。ゲストOSのUbuntuでifconfigと打てばDHCPに振られているIPアドレスがわかる。

ディレクトリ構成

試行錯誤したのち、WordPress開発環境では以下のような構成にしている。

  • /var/www/wordpress-dev/2.8/ja/ -> 特定バージョンのWordPressを配置
  • /var/www/wordpress-dev/beta/en/ -> 正式リリース前のWordpressを配置
  • /var/www/wordpress-dev/stable/en/ -> 最新のWordPressを配置
  • /var/www/wordpress-dev/stable/ja/ -> 最新のWordPressを配置

WordPressバージョンによってAPIが変わるのでAPIの変更が大きかったバージョンを幾つか用意しておく。新しいWordPressバージョンでの動作確認のためbetaディレクトリに用意。普段の開発は最新版を自動更新するstableディレクトリを用意しておく。プラグインでは日英ローカライズにも対応しているのでen,jaといったディレクトリにその言語でのWordPressをそのまま配置している。

データベース接続

WordPressは同一データベースで複数のWordPressを管理することが可能。具体的には同じSQLデータベース内で別のテーブルを使うことができる。wp-config.phpにはtable_prefixという変数名があり、これをそれぞれバラバラに設定しておけば同じデータベースでも別のテーブル名が使われるので複数のWordPressを共存することができる。

デフォルトはwp_で、先程のディレクトリ階層に沿って例えば/var/www/stable/ja/wp-config.phpでは以下のようにwp_stable_ja_というように設定している。

/**
 * WordPress データベーステーブルの接頭辞
 *
 * それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
 * インストールすることができます。半角英数字と下線のみを使用してください。
 */
$table_prefix  = 'wp_stable_ja_';

Ubuntu 12.04でNginxを実行する

Ubuntuではnginx-extrasパッケージが普通に見つかったのでDebinaでdotdebリポジトリを追加したときの手順と変わらない。

sudo apt-get install nginx-extras
sudo apt-get install php5-fpm

でnginxからphpを実行する環境を構築できる。

トラブル apacheをバックエンドにするとリダイレクトする

そうは言ってもNginxの設定を書きなおすのが面倒だったので今まで使っていたApacheの設定をそのまま使い、Apacheをポート8080で動かし、NginxからApacheに振ってみた。

proxy_pass          http://127.0.0.1:8080;

結論からいうとうまく動かなかった。

ブラウザから http://wordpress-dev/stable/ja/ にアクセスするとNginxがproxy_passの設定に従いhttp://127.0.0.1:8080/stable/ja/を参照した結果を返そうとする。http://127.0.0.1:8080/stable/ja/ではApacheがWordpressを実行してレスポンスを返すのだが、おそらくWordPressのブログのURLとこのアクセスしたURL(http://127.0.0.1:8080/stable/ja/)が違うのでWordPressはこのURLにリダイレクトしようとしてしまう。

リダイレクトのレスポンスを受けてブラウザはhttp://127.0.0.1/stable/ja/にアクセスするが、(ホストOSの)ブラウザから見た場合127.0.0.1はNginxやApacheを動かしているゲストOSではなくホストOS自身なので期待する結果は得られない。ホストOSでWebサーバを実行していなければただの接続エラーがブラウザに表示される。

渋々Nginxの設定をする

大した手間でもないので諦めてリダイレクトの問題は調査せずにNginxの設定を書く。

upstream php {
    server 127.0.0.1:9000;
}
server {
    server_name wordpress-dev;
    error_log /var/log/nginx/error_wpdev.log debug;
    root /var/www/wordpress-dev;
    index index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
    }
}

上記ファイルは以下のコマンドで有効にする

    pushd /etc/nginx/sites-enabled/
    sudo ln -s ../sites-available/wordpress-dev wordpress-dev 
    popd
    sudo service nginx reload

WP_SITEURL定義のTips

接続で使うURLをWordPressがデータベースに保存しているサイトのURLが違うとリダイレクトなり問題が起きるようなのだが、wp-config.phpに以下のような記述を入れるとデータベースのサイトURLよりこちらを優先して使ってくれるようだ。URLを移行したときに接続できない場合は移行後のURLをWP_SITEURLに設定してWordPressを開き、wp-adminからサイトのURLを編集すればよいだろう。

define('WP_SITEURL', 'http://wordpress-dev/stable/ja');