rsync で WordPress を自動バックアップする方法と復元(リストア)手順

クラウド
クラウド
スポンサーリンク

WordPress(ワードプレス)で WEBサイトを運営していて、必ずやっておきたいのは定期的なバックアップです。もし、バックアップをしていない場合に、サーバーのトラブルや作業ミスなどにより、ファイルやデーターベースが削除されたり破損すると、それまでに作成した大切なコンテンツを一瞬で失うことになります。

そこで今回は、高速なデータコピーが簡単にできる rsync を使って、別サーバーに WordPress を自動バックアップする方法と、バックアップからの復元(リストア)手順を、できるだけ分かりやすくまとめてみました。

rsync とは?

rysnc(アールシンク)は、Linux や Mac など UNIX系のOSでよく使われているデータコピーツールで、次の2つの特徴があります。

  • 差分コピーにより高速にバックアップができる
  • SSHを使うことにより、安全にデータを転送できる

また、rsync は、動作がとても安定しているため、数百万ファイルあるようなテラバイト級のデータでも、難なくコピーできてしまいます。

サーバー構成とバックアップの概要

サーバー構成は、以下の通りです。WordPress サーバーから、バックアップ用サーバーに rsync で WordPress のバックアップを毎朝定時に行います。

WordPress の構成

WordPress ディレクトリ:/var/www/wordpress
WordPress データーベース名:wordpress

WordPress のバックアップ方法

WordPress のバックアップ方法は、実はかなりシンプルで、以下の2つをコピーするだけです。

  • WordPress ディレクトリ全体
  • WordPress データーベース

例えば同じサーバー内でバックアップをする場合は、たった2行のコマンドで、WordPress のバックアップができてしまいます。

WordPress ディレクトリ全体のバックアップ

$ sudo cp -rp /var/www/wordpress ~/

WordPress データーベースのバックアップ(mysqldump は、データーベースをバックアップするためのツールです)

$ mysqldump -u root -p wordpress > ~/wordpress.sql

rsync でリモートバックアップを行うための下準備

リモートバックアップを行う場合は、少し下準備が必要になります。

rsync のインストール

WordPress サーバー、バックアップ用サーバー両方に rsync をインストールします。(ほとんどの場合、既にインストールされていると思います)

$ sudo yum -y install rsync

バックアップ用ユーザーの作成

バックアップ用サーバーに、バックアップ用のユーザーを作成します。(ユーザー名はなんでも構いません)

$ sudo adduser backup

バックアップ用のユーザーのパスワードを設定します。

$ sudo passwd backup

SSH公開鍵の登録

WordPressサーバーからバックアップ用サーバーに、SSH公開鍵認証でログインできるようにしておきます。

WordPressサーバーで root ユーザーになります。

$ sudo -s
# ←(root ユーザーになった)

SSH鍵ペアが無い場合は、ssh-keygen コマンドを使ってSSH鍵ペアを生成します。

# ssh-keygen
 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <空エンター>
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <空エンター>
Enter same passphrase again: <空エンター>
(略)

SSH公開鍵をバックアップ用サーバーに登録します。バックアップ用サーバー側のユーザーは、先ほど作成したバックアップ用のユーザーを指定してください。

# ssh-copy-id backup@192.168.56.109

バックアップサーバーに、パスワード無しでSSHログインできることを確認します。

# ssh backup@192.168.56.109

ややこしくなってきたので解説

ちょっとややこしくなってきたので解説いたします(^^;) rsync で、リモートサーバーにデータをコピーする場合は、コピー元のサーバー、コピー先のサーバーの両方で、rsync が実行されます。

今回のバックアップで rsync を実行するユーザーは、以下のようになります。

役割サーバーrsync の実行ユーザー
コピー元WordPress サーバーroot
コピー先バックアップ用サーバーbackup

そのため、WordPress サーバーの root ユーザーが 、backup ユーザーを指定してバックアップ用サーバーにSSHログインできることが必要になります。

rsync を使ったリモートバックアップ方法

rsync で、リモートサーバーにデータをコピーする場合の指定方法です。コピー元をリモートサーバにすることもできます。

rsync [オプション] コピー元 [ユーザ名@]ホストアドレス:コピー先

例えば WordPress ディレクトリを、rsync で バックアップ用サーバーにコピーするコマンドは以下のようになります。※実行するのはちょっと待ってください!注意することがあります。

$ sudo rsync -av --delete /var/www/wordpress backup@192.168.56.109:/home/backup/

rsync の各オプションの意味

-a
 アーカイブモードと呼ばれ、バックアップをとるのに便利なオプションです。タイプスタンプや、パーミッションを保持してコピーしてくれます。コピー先のサーバーでも、rsync を rootユーザーで実行すれば、オーナーとグループも保持されます。

今回コピー先のサーバーの rsync は backupユーザーで実行するため、バックアップしたファイルやディレクトリのオーナーとグループは、backupユーザーと backupグループになります。バックアップしたファイルやディレクトリのオーナーとグループが変わってしまいますが、WordPress のバックアップの場合は、復元(リストア)時に、オーナーを再設定すれば、まったく問題ありません。

-v
 コピーの進捗状況を表示してくれます。

--delete
 コピー元でファイルを削除すると、コピー先のファイルも削除します。このオプションを指定している時は注意が必要です。

(補足)rsync バージョン2.6.0(2004年にリリースされたバージョンです)以降は、リモートコピーする場合のデフォルトシェルが SSH に変更されたため、「-e ssh」オプションは不要になりました。

実行前に「--dry-run(ドライラン)」オプションで確認しよう!

rsync で --delete オプションを指定している時に注意することは、コピー元とコピー先を逆に指定してしまうと、データが削除される可能性があることです。

--dry-run(ドライラン)」というオプションを付けて rsync を実行すると、実際にはコピーや削除はされずに、実行結果だけを表示することができます。rsync の実行前には、必ず --dry-run オプションを付けて、コピー元とコピー先の指定に間違えがないことを確認してから、実行することをぜひオススメします。

$ sudo rsync --dry-run -av --delete /var/www/wordpress backup@192.168.56.109:/home/backup/
(略)
sent 45948 bytes received 5316 bytes 102528.00 bytes/sec
total size is 27441822 speedup is 535.30 (DRY RUN) ← ドライランで実行

コマンド指定に間違えがないことを確認できたら、 --dry-run オプションを外して実行します。

$ sudo rsync -av --delete /var/www/wordpress backup@192.168.56.109:/home/backup/

WordPress のディレクトリ全体をバックアップすると、データ転送に時間がかかることが問題になりますが、rsync を使えば、初回のバックアップこそ時間はかかりますが、2回目以降のバックアップは差分コピーになるため、数分でバックアップが終わります。

パスワード無しで mysqldump を実行できるようにする

rootユーザーが、パスワード無しで mysqldump を実行できるように、MySQLのパスワードファイルを作成しておきます。

$ sudo vi /root/.my.cnf
-----(下記を追加)-----
[mysqldump]
user=root
password="<パスワード>"

※<パスワード>は、必ずクオートしてください。

パスワードファイルは、rootユーザーのみ読取りできるように、パーミッションを変更します。

$ sudo chown root /root/.my.cnf
$ sudo chmod 600 /root/.my.cnf

パスワード無しで mysqldump が実行できることを確認します。

$ sudo mysqldump -u root wordpress > ~/wordpress.sql

WordPress バックアップスクリプトの作成

下準備がかなり長くなりましたが、本題の WordPress をリモートバックアップするための、簡単なシェルスクリプトを作成します。

$ sudo vi /usr/local/bin/wp_backup.sh

#!/bin/sh
export PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin"
export LANG=C

# rsync のオプション設定
RSYNC="rsync $1 -av --delete"

# バックアップ先の指定
DEST="backup@192.168.56.109:/home/backup/"

# データーベースのダンプ先
DB_DUMP="/root/wordpress.sql"

# ログファイルの設定
LOG="/var/log/wp_backup.log"
if [ -f $LOG ]; then
        gzip -f $LOG
fi

# WordPress ディレクトリのバックアップ
$RSYNC /var/www/wordpress $DEST >> $LOG 2>&1

# WordPress データーベースをダンプ
mysqldump -u root wordpress > $DB_DUMP

# WordPress データーベースのバックアップ
$RSYNC $DB_DUMP $DEST >> $LOG 2>&1

# ダンプしたファイルを削除
rm -f $DB_DUMP

exit 0

バックアップの世代管理をしたい場合は、バックアップ先を以下のように指定すれば、1週間分の7世代を残せます。「`date +%a`」は、バックアップを実行した日の曜日(Sun, Mon, Tue, Wed, Thu, Fri, Sat)に変換されます。

# バックアップ先の指定
DEST="backup@192.168.56.109:/home/backup/`date +%a`/"

実行権限を付けます。

sudo chmod 700 /usr/local/bin/wp_backup.sh

--dry-run オプションを付けて実行し、シェルスクリプトに誤りがないか「/var/log/wp_backup.log」を確認しましょう。

sudo /usr/local/bin/wp_backup.sh --dry-run

WordPress バックアップの自動実行設定

最後に、作成したシェルスクリプトを crontab に登録すれば完了です。下の設定では、毎朝4時にバックアップを実行します。実行時刻はお好みで設定してください。

sudo crontab -e
-----(下記を追加)-----
00 04 * * * /usr/local/bin/wp_backup.sh

WordPress バックアップからの復元(リストア)手順

WordPress を復元(リストア)する場合の手順です。( --dry-run オプションで確認するのを忘れずに!ほんとしつこくてスミマセン)

WordPress ディレクトリの復元

sudo rsync -av --delete backup@192.168.56.109:/home/backup/wordpress/* /var/www/wordpress/

復元したディレクトリ以下のオーナーを、WEBサーバーの実行ユーザーに変更します。

sudo chown -R apache /var/www/wordpress

WordPress データーベースの復元

sudo rsync -av --delete backup@192.168.56.109:/home/backup/wordpress.sql .
mysql -u root -p wordpress < wordpress.sql

終わりに

備えあれば憂いなしのバックアップですが、いざ復元が必要になった時にバックアップに不備があり、復元できないことも少なくありません。いささか大変ではありますが、定期的に復元テストをすることもオススメします。(> 自分もね!)

コメント

タイトルとURLをコピーしました