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 ディレクトリ全体のバックアップ
WordPress データーベースのバックアップ(mysqldump は、データーベースをバックアップするためのツールです)
rsync でリモートバックアップを行うための下準備
リモートバックアップを行う場合は、少し下準備が必要になります。
rsync のインストール
WordPress サーバー、バックアップ用サーバー両方に rsync をインストールします。(ほとんどの場合、既にインストールされていると思います)
バックアップ用ユーザーの作成
バックアップ用サーバーに、バックアップ用のユーザーを作成します。(ユーザー名はなんでも構いません)
バックアップ用のユーザーのパスワードを設定します。
SSH公開鍵の登録
WordPressサーバーからバックアップ用サーバーに、SSH公開鍵認証でログインできるようにしておきます。
WordPressサーバーで root ユーザーになります。
# ←(root ユーザーになった)
SSH鍵ペアが無い場合は、ssh-keygen コマンドを使ってSSH鍵ペアを生成します。
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ログインできることを確認します。
ややこしくなってきたので解説
ちょっとややこしくなってきたので解説いたします(^^;) rsync で、リモートサーバーにデータをコピーする場合は、コピー元のサーバー、コピー先のサーバーの両方で、rsync が実行されます。
今回のバックアップで rsync を実行するユーザーは、以下のようになります。
役割 | サーバー | rsync の実行ユーザー |
---|---|---|
コピー元 | WordPress サーバー | root |
コピー先 | バックアップ用サーバー | backup |
そのため、WordPress サーバーの root ユーザーが 、backup ユーザーを指定してバックアップ用サーバーにSSHログインできることが必要になります。
rsync を使ったリモートバックアップ方法
rsync で、リモートサーバーにデータをコピーする場合の指定方法です。コピー元をリモートサーバにすることもできます。
例えば WordPress ディレクトリを、rsync で バックアップ用サーバーにコピーするコマンドは以下のようになります。※実行するのはちょっと待ってください!注意することがあります。
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 オプションを付けて、コピー元とコピー先の指定に間違えがないことを確認してから、実行することをぜひオススメします。
(略)
sent 45948 bytes received 5316 bytes 102528.00 bytes/sec
total size is 27441822 speedup is 535.30 (DRY RUN) ← ドライランで実行
コマンド指定に間違えがないことを確認できたら、 --dry-run オプションを外して実行します。
WordPress のディレクトリ全体をバックアップすると、データ転送に時間がかかることが問題になりますが、rsync を使えば、初回のバックアップこそ時間はかかりますが、2回目以降のバックアップは差分コピーになるため、数分でバックアップが終わります。
パスワード無しで mysqldump を実行できるようにする
rootユーザーが、パスワード無しで mysqldump を実行できるように、MySQLのパスワードファイルを作成しておきます。
-----(下記を追加)-----
[mysqldump]
user=root
password="<パスワード>"
※<パスワード>は、必ずクオートしてください。
パスワードファイルは、rootユーザーのみ読取りできるように、パーミッションを変更します。
$ sudo chmod 600 /root/.my.cnf
パスワード無しで mysqldump が実行できることを確認します。
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`/"
実行権限を付けます。
--dry-run オプションを付けて実行し、シェルスクリプトに誤りがないか「/var/log/wp_backup.log」を確認しましょう。
WordPress バックアップの自動実行設定
最後に、作成したシェルスクリプトを crontab に登録すれば完了です。下の設定では、毎朝4時にバックアップを実行します。実行時刻はお好みで設定してください。
-----(下記を追加)-----
00 04 * * * /usr/local/bin/wp_backup.sh
WordPress バックアップからの復元(リストア)手順
WordPress を復元(リストア)する場合の手順です。( --dry-run オプションで確認するのを忘れずに!ほんとしつこくてスミマセン)
WordPress ディレクトリの復元
復元したディレクトリ以下のオーナーを、WEBサーバーの実行ユーザーに変更します。
WordPress データーベースの復元
mysql -u root -p wordpress < wordpress.sql
終わりに
備えあれば憂いなしのバックアップですが、いざ復元が必要になった時にバックアップに不備があり、復元できないことも少なくありません。いささか大変ではありますが、定期的に復元テストをすることもオススメします。(> 自分もね!)
コメント