WordPressのバックアップですが、スタンバイ機を作っているような感じです。

久しぶりに技術系の投稿です。

僕のブログは「お名前.com」のVPSのサーバにWordpress(ワードプレス)をインストールしている環境です。

これまでは、サーバのバックアップは全く取っていなかったので、今回は自己流のバックアップの方法をご紹介したいと思います。

巷では、Wordpressのプラグイン機能で「BackWPup」などがありますが、僕はスクリプトで自己流のバックアップを作ってみました。

方法は、メインで使用している「お名前.com」のサーバから、「KAGOYA」のVPSのサーバに必要なデータをバックアップする方法をしています。

なので、必要なサーバ台数は最低でも2台必要になるので、もし同じ方法をとりたいと思った人がいたら別途サーバを用意してください。

まずは、バックアップ先のサーバにはLAMP(Linux、Apache、MySQL、PHP)を用意する必要があります。

結局、僕のバックアップ方法は簡単に言うと、同じコンテンツのサーバをもう一台用意してしまう形になっています。
photo credit: Phil Oakley via photopin cc

LAMP環境の構築を簡単に説明

まずは、バックアップ先となる「KAGOYA」側のサーバにLAMP環境を用意しておきます。

・必要なリポジトリと開発ツールなどをインストール

[root@KAGOYA]# cd /usr/local/src

[root@KAGOYA]# wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@KAGOYA]# rpm -ivh epel-release-6-8.noarch.rpm

[root@KAGOYA]# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
[root@KAGOYA]# rpm -ihv remi-release-6.rpm

[root@KAGOYA]# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@KAGOYA]# rpm -ihv rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

[root@KAGOYA]# yum -y update && yum -y groupinstall "development tools" 

・Apache(アパッチ)をインストール(yum)

[root@KAGOYA]# yum -y install httpd httpd-devel
[root@KAGOYA]# /etc/init.d/httpd start
[root@KAGOYA]# chkconfig httpd on

・MySQLサーバをインストール(yum)

[root@KAGOYA]# yum -y install --enablerepo=remi mysql mysql-devel mysql-server
[root@KAGOYA]# /etc/init.d/mysqld start
[root@KAGOYA]# chkconfig msyqld on

・PHPをインストール(yum)

[root@KAGOYA]# yum -y install php php-gd php-cli php-xml php-mbstring php-fpm php-common php php-devel php-gdphp-mysql php-pecl-memcache php-pdo php-bcmath php-pear php-mysql php-xml
[root@KAGOYA]# /etc/init.d/httpd restart

データベースをダンプしてリモートでリストアする

・すべてのデータベースとユーザ情報をダンプしてさらにバックアップ先でリストアをする

すべてのデータベースをダンプします
[root@ONAMAE]# mysqldump -u root -p --events --all-databases < /tmp/dump.sql

バックアップ先にダンプファイルをバックアップします
[root@ONAMAE]# rsync -avz -e "ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル>" /tmp/dump.sql  root@<バックアップ先IPアドレス>:/tmp
※パスワードなしの鍵ファイルなどを用意していると便利です。

MySQLのユーザ情報をダンプします
[root@ONAMAE]# mysqldump -u root -p --events -x --allow-keywords mysql < /tmp/mysql.dump

MySQLのユーザ情報をバックアップします
[root@ONAMAE]# rsync -avz -e "ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル>" /tmp/mysql.dump  root@<バックアップ先IPアドレス>:/tmp

DBのデータベースとユーザ情報をバックアップ先でリストアします
[root@ONAMAE]# ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル> root@<バックアップ先IPアドレス> "mysql -u root -p mysql < /tmp/mysql.dump"
[root@ONAMAE]# ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル> root@<バックアップ先IPアドレス> "mysql -u root -p < /tmp/dump.sql"

バックアップ先のMySQLを再起動します
[root@ONAMAE]# ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル> root@<バックアップ先IPアドレス> "/etc/init.d/mysqld restart"

Apache(アパッチ)のバーチャルドメイン設定をバックアップ

もし、Apacheアパッチバーチャルドメインでバーチャルドメインを使用していたら、その設定もバックアップが必要です。

[root@ONAMAE]# rsync -avz -e "ssh -p <バックアップ先のポート番号> -i /root/.ssh/<鍵ファイル>" /etc/httpd/conf.d/<バーチャルホスト>.conf
[root@ONAMAE]# #ssh -p <ポート番号> -i /root/.ssh/<鍵ファイル> root@<バックアップ先IPアドレス> "/etc/init.d/httpd restart"

Wordpressをインストールする

バックアップ先のKAGOYA側のサーバでWordpressをインストールします。

[root@KAGOYA]# cd /usr/local/src/

[root@KAGOYA]# wget http://ja.wordpress.org/wordpress-3.8-ja.zip

[root@KAGOYA]# unzip wordpress-3.8-ja.zip

[root@KAGOYA]# mv wordpress <ドキュメントルート>

[root@KAGOYA]# chown -R apache:apache <ドキュメントルート>

ブラウザで接続をしてWordpressをインストールします。
http://<ドメイン> に接続をします。
でも、ブラウザなどにそのままURLを入力して接続をしようとしても、今実際に動いているサーバ(この場合ではお名前.com)に接続されてしまうだけなので、「hosts」ファイルを編集して強制的に接続先を変更します。

あくまでも自分の接続だけがバックアップ先になるので、他のクライアントはこれまで通りのサーバに接続がされているので安心してください。

Windowsの場合「hosts」は
C:\Windows\System32\Drivers\etc\hosts
に保存されているので、Windows7以降のOSの場合はメモ帳などを管理者権限で開いて編集をしてください。

「hosts」ファイルの最終行に以下のように記入して保存すれば接続の向き先が変わります。
<接続先IPアドレス> <ドメイン> #(任意の名称)

「hosts」ファイルの編集が終わればブラウザを開いてURLを入力してWordpressにログインをします。

「設定ファイルを作成する」をクリックします。
wp-config.php

DB setting
データベース名
ユーザ名
パスワード

を入力してください。他はデフォルトのままで大丈夫です。

以降は、すでにインストールされているというようなメッセージの画面が出ても構わず進めてください。

Wordpressのコンテンツをバックアップする

・Wordpressのコンテンツをバックアップします

[root@ONAMAE]
「themes」をバックアップします。
# rsync -avz -e "ssh -p <バックアップ先のポート番号> -i /root/.ssh/<鍵ファイル>" <ドキュメントルート>/wp-content/themes root@<IPアドレス>:<ドキュメントルート>/wp-content/
「uploads」をバックアップします。

[root@ONAMAE]# rsync -avz -e "ssh -p <バックアップ先のポート番号> -i /root/.ssh/<鍵ファイル>"<ドキュメントルート>/wp-content/uploads root@<IPアドレス>:<ドキュメントルート>/wp-content/
「plugins」をバックアップします。

[root@ONAMAE]# rsync -avz -e "ssh -p <バックアップ先のポート番号> -i /root/.ssh/<鍵ファイル>" <ドキュメントルート>/wp-content/plugins root@<IPアドレス>:<ドキュメントルート>/wp-content/
バックアップ先のApacheを再起動します

[root@ONAMAE]# ssh -p <バックアップ先のポート番号> -i /root/.ssh/<鍵ファイル> root@<接続先IPアドレス> "/etc/init.d/httpd restart"

パーマリンクを確認する

新しく構築したサーバのWordpressにログインします。

ログインができれば、メニューの「設定」->「パーマリンク」を選択します。

パーマリンクを開いて意図しているパーマリンクの設定になっていることを確認をして「変更を保存」をクリックします。
パーマリンク設定

動作を確認します。

http://<ドメイン> を開いていくつかページを開くことができるのを確認します。
問題がなければバックアップ完了です。

あとは、
「hosts」ファイルを元の状態に必ず戻しておいてください。

そうしないと、ずっとバックアップ先のサーバへの接続が行われてしまします。

記述した行の先頭に#を入れておけばコメントアウトなので、またバックアップ先に接続をしたいときは#を外してファイルを保存すれば可能です。

2回目以降のバックアップについて

2回目以降はDBのバックアップ・リストアと、Wordpressのコンテンツバックアップだけで大丈夫です。
※バーチャルホストの設定をしてればその分も必要です。

その他の作業は必要ないので、シェルスクリプトとcronを利用して自動化の設定を作ってみました。

エラー処理などはお好みで追加してください。

[root@ONAMAE]# vim /root/wordpress_backup.sh

(以下のスクリプトを記入)
#!/bin/bash -x

_destport=<バックアップ先のポート番号>
_destip=<接続先IPアドレス>
_keyfile=<鍵ファイル>
_docroot="<ドキュメントルート>"

#※各所でsshを実行していますが、バックアップ元(お名前.comのサーバ)とバックアップ先(KAGOYAのサーバ)でパスフレーズなしの鍵認証の設定が必要です。

#すべてのデータベースをダンプ  接続元の
#/root/.my.cnf への設定が必要
#[mysqldump]
#user = root
#password = xxxxxx
mysqldump --events --all-databases > /tmp/dump.sql

#ダンプをしたデータベースをリモートにバックアップ
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" /tmp/dump.sql  root@${_destip}:/tmp

#データベースのユーザ情報をダンプ
mysqldump --events -x --allow-keywords mysql > /tmp/mysql.dump

#ダンプしたユーザ情報をリモートにバックアップ
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" /tmp/mysql.dump  root@${_destip}:/tmp

#バックアップしたデータベースを、接続元からリストアする。バックアップ先で /root/.my.cnf の設定が必要
ssh -p ${_destport} -i /root/.ssh/${_keyfile} root@${_destip} "mysql  mysql < /tmp/mysql.dump"

#バックアップしたユーザ情報を、接続元からリストアする。バックアップ先で /root/.my.cnf の設定が必要
ssh -p ${_destport} -i /root/.ssh/${_keyfile} root@${_destip} "mysql < /tmp/dump.sql"

#バックアップ先のMySQLを再起動する
ssh -p ${_destport} -i /root/.ssh/${_keyfile} root@${_destip} "/etc/init.d/mysqld restart"

#バーチャルホストの設定をしていなければ下の2行は不要です
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" /etc/httpd/conf.d/<バーチャルホスト>.conf
ssh -p ${_destport} -i /root/.ssh/${_keyfile} root@${_destip} "/etc/init.d/httpd restart"

#wordpressのコンテンツをバックアップします
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" ${_docroot}/wp-content/themes root@${_destip}:${_docroot}/wp-content/
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" ${_docroot}/wp-content/uploads root@${_destip}:${_docroot}/wp-content/
rsync -avz -e "ssh -p ${_destport} -i /root/.ssh/${_keyfile}" ${_docroot}/wp-content/plugins root@${_destip}:${_docroot}/wp-content/

#最後にバックアップ先サーバのApacheを再起動します。
ssh -p ${_destport} -i /root/.ssh/${_keyfile} root@${_destip} "/etc/init.d/httpd restart"

exit 0
(ここまで)

・スクリプトに実行権限を付けます。

[root@ONAMAE]# chmod 700 /root/wordpress_backup.sh

・AM4:30に実行されるように設定をします。

(以下の内容を記入)
[root@ONAMAE]# vim /var/spool/cron/root
##########################################
#wordpress backup
30 4 * * *  /root/wordpress_backup.sh
##########################################
(ここまで)

以上で、Wordpressの自動バックアップの設定が完了です。
あと、工夫をするとしたら、ダンプしてバックアップしたDBデータをlogrotateで世代管理ができればと思っているので、後日に追記してみようと思います。