WordPressを二重化したい?


もう一年くらい前の話ですが、とある仕事でその会社のサイトとは別に、自分たちのプロジェクト独自のサイトを運用していました。
OSSのプロジェクトだったので、そのプロジェクト用のドメインと、そのドメインで運用されるサイトがあった方がやりやすかったのです。
サイトはWordPressで立ち上げ、探り探り更新していました。

ある日チームメンバーのO君が、
「このWordPressのサイト、二重化とか出来ないですかね?」
と聞いてきました。

「どゆこと?」
O君 「サイトのデザインとか色々いじるのに、二重化して切り替えとかしたいんですが・・・」

なるほど、良く分かります、その気持ち。
とりあえずサイトを二重化して、スタンバイ側で色々試してワンタッチで切り替えて本番運用、とかやりたいという事ですね。
WordPressはその仕様上、サイトのデザインやプランをきっちり考えてからサイト公開、みたいな使い方が向いている気がします。
とくに生成されたHTMLに埋め込まれるリンクなどが全部フルのURLになる仕様とか、嫌がらせきっちりしたプランを前提としているとしか思えません。
ローカルにサイトのコピーを作ろうにも、この仕様のせいで本番環境のコピーを手元に持つのは困難です。

先に話に出たO君の申し出は「考えとく」と返事して放置でした。
仮に二重化出来たとしても、切り替えは単純に想像するほど簡単ではありません。

要望を整理して考えてみると。

  • 本番環境で色々試すと、訪問者が途中の壊れたサイトを見る事になる、それは嫌。
  • テスト環境で色々試して、その結果を本番環境に反映するのに同じ手順を繰り返すのが嫌、そして正確に間違えずにやる自信が無い。

こういうことだと思います。
import/export のツールがWordPressには用意されているので、それで出来そうな気がしますが、実は上記要件にかなうツールは意外とありません。
本番環境をバックアップして、非常時に本番環境に戻す、という用途のものが多い気がします。

今回自社のサイトをWordPressに移行するにあたり、以前の様に管理をお任せ出来る同僚が居ないので、上記2要件は結構深刻な問題となりました。
そしてそれにプラスして、「Bitbucketで管理したい」
という要件も加わりました。
ややこしい。

一応既存のツールを探してはみましたが、早々に諦めて自作しました。
(実はよく探せば良いツールが有るかもしれませんね)

このサイトの公開前から使っているツールですが、少し整頓して公開します。

wpmigrate

やってる事は単純で、データベース内のサイトアドレスを置換用文字列に置き換えているだけです。

必ずしも万人に役立つツールではありませんが、同様のお悩みを抱えている方は検討してみるのも良いかもしれません。
(本番環境がレンタルサーバーでShellが使えない場合はこのツールを使うのは難しいと思います)

使い方

  1. WordPressのテスト用サイトを立ち上げる。
    MySQLサーバーを用意したり、WordPressをダウンロードして展開して、自分のPCに環境を作るのがおすすめです。
    職場に自由に使えるサーバーマシンがあればそれでも良いでしょう。
    apache等のwebサーバを使うのはWordPressのテスト環境としては大げさな気がします(本人の勝手ですけどね)、ですので、
    php -S www.microgadget-inc.com -t wordpress
    のように、php をそのままWebサーバにしてしまうのが手軽でおすすめです。
    後は普通にサイトをセットアップしましょう。
  2. ツールをコピーする。
    WordPressのトップディレクトリに、wpmigrateツールののファイルを全部コピーします。
    WordPressのトップディレクトリとは、wp-config.phpが有るディレクトリです。

    +-wordpress
      |
      +- wp-config.php
      |
      ...
      |
      +- wpenv.sh
      |
      +- export.sh
      |
      +- import.sh
      |
      +- createdb.sh
    
    
  3. 本番環境を用意する
    普通に本番環境を用意しましょう。
    Webサーバー、MySQLサーバー、PHP 等を使えるようにしておきましょう。
    まだこの時点ではWordPressサイトのセットアップは必要ありません。
  4. テストサイトを公開可能にする。
    テストサイトをいじって「公開しても良いかな?」くらいの所まで持って行きましょう。
  5. テスト環境を本番環境へコピーする準備
    1. export.shのシンボリックリンクを作る
      export.sh のシンボリックリンクを作ります、コマンドライン引数は運用時に忘れがちなので、シンボリックリンクを引数代わりにしています。
      テストサイトのアドレスが、http://www.microgadget-inc.com/ だったら、exportwww.microgadget-inc.com.sh という名前でリンクを作ります。
      ln -s export.sh exportwww.microgadget-inc.com.sh
    2. データベースをexportします。
      先ほど作ったシンボリックリンクでツールを起動します。
      ./exportwww.microgadget-inc.com.sh
      database.sql というファイルが出来ているのを確認しましょう。
  6. 本番環境へWordPressファイルをコピー
    私はBitbucketを使っていますが、何を使ってもOKです。
    FTPでもDropboxでも。
    BitbucketやGithubなら投稿以外もリビジョン管理出来るので良いかもしれません。
    リビジョン管理ツールをファイル転送に使うというやり方を邪道と考える方も居るかもしれませんが、CVSが主流だった頃から結構一般的に浸透していた考え方です、余談ですが。
    WordPressディレクトリの下にあるファイルを全て本番環境へコピーしましょう。
  7. 本番環境へログインしてimport作業
    本番環境上では、VirtualHostの設定など基本的な設定は出来ているという前提で。

    1. importツールへシンボリックリンクを作る
      本番環境のサイトアドレスが http://www.mycompany.com/wordpress だった場合、
      importwww.mycompany.com~wordpress.sh というシンボリックリンクを作ります。
      ln -s import.sh importwww.mycompany.com~wordpress.sh
    2. データベースのセットアップをします。
      MySQL サーバ上へWordPress用のデータベースを作っていない場合のみこの作業を行います。
      ./createdb.sh
    3. importツールでimportします。
      ./importwww.mycompany.com~wordpress.sh

あとはテストサイトを中心に更新等を行い、適当なタイミングで本番環境へコピーという手順を日常的に繰り返す事になります。
githubを使う場合は、本番環境側で cron をセットアップして、git pull と importを定期的に実行するようにすれば、 テスト環境側は好きなタイミングで export -> git add commit push すれば本番環境は自動で同期されます。
ただし、外部からのコメントの投稿などを有効にしている場合、これやっちゃうとコメント類もリセットされてしまいますので注意が必要です。
運用に工夫が必要になりますね。

ここまで書いて気がついたのですが、 Windowsの事を全く考えておりませんでした。
・・・ Windowsでは使えませんね。