目次

WordPressをUnisonで同期する

WordPressをFreeBSD上で稼働させている。 このWordPressはサービスサイトなので、可能な限りサービスを停止したくない。

こういう時には、冗長構成を取りたいのだが、WordPressの場合、記事はDBで管理しているので分散は簡単なのだが、ファイルはWordPressのwp-contentsに配置されているため、迂闊なことをすると破損する可能性がある。

しかし、今回の場合、幸いなことに、Realtime Synchronizationを行う必要はないので、unisonで同期することにする。

なお、もし Realtime Syncをしたいのならば、Linuxでlsyncdを利用して頑張るしかないので、かなり辛いことになる。

基本構成

FreeBSD上にNGINX+PHP-FPM+MariaDBを利用してWordPressを構築していることとする。

MariaDBの同期に関しては、Semi-Sync Replicationを利用しているが、これに関してはすでに本サイト上に記事があるのでそちらを確認のこと。

/data/www/wordpress にすでにWordPress環境が構築されているものとする

UnisonのInstall

もちろんGUIなんて必要ないので、pkg install unison-nox11を導入する。

unisonで同期したいファイルは、nginxの実効UIDになるので確認すると、www:wwwだった。従って、~wwwを作成する必要がある。

vipwを利用して、~www関連の設定をする。

UNISONの設定

現代のWordPressは自動で自身を更新する機能があり、その結果、迂闊にUNISONで同期すると、同期に失敗することがある。なので、WordPress本体は同期せず、wp-content のみを同期する方針で進める。

Wordpressの準備

  1. まず、1台、WordPressをClean Installする
  2. 最小限の動作確認
  3. /data/www/wordpressをClone先のマシンに転送して展開

Unisonで同期

  1. wwwになって、以下のコマンドを実行し、wp-content を同期する
    • /usr/local/bin/unison -batch -confirmbigdel=false /data/www/wordpress/wp-content ssh:www@targetdata/www/wordpress/wp-content
    • これで、target側でDirectoryが同期されていることを確認する。
  2. 逆方向も確認する。
    • /usr/local/bin/unison -batch -confirmbigdel=false /data/www/wordpress/wp-content ssh:www@originaldata/www/wordpress/wp-content
    • 逆方向で、何も置き換えが発生しなければOK

shell scriptの設置

設定をunisonの設定ファイル (~/.unison/default.prf) に記述することも可能だが、どうせUNISONをcronで起動するので、いっそshell scriptにする。

unison.sh
/usr/local/bin/unison -batch -confirmbigdel=false /data/www/wordpress/wp-content ssh://www@target//data/www/wordpress/wp-content

このunison.sh~www/binに設置する

UnisonをCronで動作させる

Unisonで同期する際には、同期時刻がかぶらないようにしておくべきである。 (特に問題が発生するという情報はないが、問題になりかねない状況は作らない方が良い)

また、今回のサイトは更新頻度が低いので、同期頻度を5分程度にする。 Unisonは基本的に双方向同期なので、

でcronからshell scriptを呼び出すものとする。

これで、/var/log/cron.logにShellscriptの実効logが出ればOK