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関連の設定をする。
sudo vipw
- HomeDir : /home/www
- login shell : /bin/sh
sudo mkdir ~www;chown www:www ~www
- passwd www
- www用のpasswordを設定すること
- su www
- ssh-keygen -t ed25519
- 自動での作業になるので、passphraseは設定しないこと
UNISONの設定
現代のWordPressは自動で自身を更新する機能があり、その結果、迂闊にUNISONで同期すると、同期に失敗することがある。なので、WordPress本体は同期せず、wp-content
のみを同期する方針で進める。
Wordpressの準備
- まず、1台、WordPressをClean Installする
- 最小限の動作確認
/data/www/wordpress
をClone先のマシンに転送して展開
Unisonで同期
- wwwになって、以下のコマンドを実行し、wp-content を同期する
/usr/local/bin/unison -batch -confirmbigdel=false /data/www/wordpress/wp-content ssh:www@targetdata/www/wordpress/wp-content
- これで、target側でDirectoryが同期されていることを確認する。
- 逆方向も確認する。
/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は基本的に双方向同期なので、
- Original: 05,15,25,35,45,55
- Target : 00,10,20,30,40,50
でcronからshell scriptを呼び出すものとする。
- wwwになる
- crontab -e で以下の設定を投入
- Original
SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin #minute hour mday month wday command 5,15,25,35,45,55 * * * * /bin/sh /home/www/bin/syncwp.sh
- Target
SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin #minute hour mday month wday command 0,10,20,30,40,50 * * * * /bin/sh /home/www/bin/syncwp.sh
これで、/var/log/cron.logにShellscriptの実効logが出ればOK