ラズパイでサーバーを運営していると、データのバックアップは必須です。不慮の事故でマイクロSDが壊れることは十分に想定できます。しかも、そういうことは、ある日突然やってくるものです。今まで作成したコンテンツを全て失ってしまうことになります・・・悲劇です・・・立ち直れません。ということで、そのような事態を避けるために、2台のWordPressサーバーを使って、データの同期をとるやり方を紹介します。
WordPressデータの同期には、以下の2つの同期が必要です。
- WordPressディレクトリ全体の同期
- WordPressデータベース(MySQL)の同期
今回は、「ssh+rsync」を使うことで、安全かつ高速にWordpress同期をとります。サーバー(メイン側)が稼働中のサーバで、障害発生時に置き換わるサーバーをサーバー(サブ側)として説明します。以降の説明では、サーバー(メイン側)をメイン側、サーバー(サブ側)をサブ側と呼びます。
まずは、WordPressディレクトリ全体の同期を行います。
手順は以下です。
- サーバー(サブ側)でssh接続用の鍵を生成
- サーバー(メイン側)で公開鍵を設定
- syncコマンドで同期
では、さっそく設定してみましょう。
1.サーバー(サブ側)でssh接続用の鍵を生成
サブ側からメイン側にsshで接続するための鍵を生成します。サブ側で秘密鍵と公開鍵を生成して、メイン側に公開鍵を転送します。
ここはサブ側での作業です。
ssh-keygenコマンドで鍵を生成します。スクリプト処理を行うため、秘密鍵にアクセスするためのパスフレーズはなし(空白)で生成します。※パスフレーズとは秘密鍵にアクセスするためのパスワードです。
鍵を生成するコマンドは以下です。
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/xxx/.ssh/id_rsa): /home/user1/.ssh/id_rsa already exists. Enter passphrase (empty for no passphrase):空白でEnter Enter same passphrase again:空白でEnter
実行すると、ホームの.sshディレクトリ配下に、秘密鍵「id_rsa」と公開鍵「id_rsa.pub」が生成されます。
生成した公開鍵「id_rsa.pub」を、scpコマンドでメイン側に転送します。
以下のコマンドで転送します。
$ scp -P [ポート番号] [サブ側公開鍵のファイルパス] [メイン側のユーザー名]@[メイン側のホスト名]:[メイン側の保存先パス]
2.サーバー(メイン側)で公開鍵を設定
ここからはメイン側での作業です。
まず、サブ側から転送した公開鍵を登録します。
以下は、サブ側から転送した公開鍵が「~/.ssh/id_rsa.pub」の場合の例です。
$ cd ~/ $ cat .ssh/id_rsa.pub >> .ssh/authorized_keys $ rm .ssh/id_rsa.pub ※登録後は不要なので削除
- 登録する公開鍵:id_rsa.pub
- 公開鍵を登録するファイル:authorized_keys
次に、公開鍵が正しく登録されていることを確認します。サブ側からメイン側にsshコマンドを使って接続します。
↓以下のコマンドをサブ側で実行 $ ssh [メイン側ユーザー名]@[メイン側サーバ名] -p [ポート番号] -i [秘密鍵]
無事に接続できることが確認できればOKです。
3.rsyncコマンドで同期
ssh接続する準備が整ったので、rsyncコマンドを使ってWordpressデーターの同期を行います。
以下のコマンドを実行します。
※事前に–dry-runオプションをつけて確認してから実行した方が良いです。–deleteオプションを間違うと意図しないファイルが削除されていまうのでご注意ください。
sudo rsync -avz --delete --rsync-path="sudo rsync" -e "ssh -p [ポート番号] -i [秘密鍵]" [メイン側ユーザー名]@[メイン側サーバー名]:/var/www/wordpres/ /var/www/wordpress/
<rsyncコマンドのオプション指定>
-a
タイプスタンプや、パーミッションを保持してコピー
-v
コピーの進捗状況を表示してくれる。
–delete
コピー元でファイルを削除すると、コピー先のファイルも削除
-rsync-path=”sudo rsync”
リモートホスト上のrsyncをsudoで実行
上記 rsyncコマンドを実行すると、WordPressディレクトリ全体の同期が行われます。ポイントは、リモートとローカル側ともに、sudo rsyncコマンドで実行している点です。そうしないと、パーミッションの引継ぎがうまくいかないケースがありました。また、1回目は全てコピーするので時間がかかりますが、2回目以降は差分コピーなのでそんなに時間はかからないと思います。
以上でWordPressディレクトリ全体の同期は完了です。
すでに、ssh接続の設定ができている場合は、「3.rsyncコマンドで同期」を実行すれば大丈夫だと思います。
次は、WordPressデータベース(MySQL)の同期です。
手順は以下です。
- mysqldump の設定
- WordPressデータベースのバックアップ
- WordPressデータベースの復元
1.mysqldump の設定
ここはメイン側での作業です。
サブ側からsshでメイン側に接続して、mysqldumpコマンドを実行します。事前にメイン側でmysqldumpコマンドを実行して確認しときます。
mysqldump コマンドで、wordpressのデータベースがバックアップできることを確認します。
mysqldump -u [ユーザー名] --password='[パスワード]' [データベース名] > [出力先(*.sql)]
以下は、ユーザー名:user, パスワード:pasword, データベース名:wordpressの場合のコマンド例です。
mysqldump -u user --password='password' wordpress > ~/bk/wordpress.sql
データベースのバックアップデータが正しく生成されていればOKです。
2.WordPressデータベースのバックアップ
ここはサブ側での作業です。
SSHでメイン側に接続して、mysqlのユーザで、mysqldumpコマンドを実行してデータベースをバックアップを行います。(事前に確認したmysqldumpコマンドの情報を使います)
コマンドは以下です。
ssh -p [ポート番号] -i [秘密鍵] [メイン側のユーザー名]@[メイン側のホスト名] /usr/bin/mysqldump -u user --password='password' wordpress > /home/user/bk/wordpress.sql
事前にmysqldumpコマンドを確認しているので、ssh接続ができれば大丈夫だと思います。
以上で、メイン側のWordpressデータベースを、サブ側にバックアップ完了です。
3.WordPressデータベースの復元
ここはサブ側での作業です。
最後にバックアップしたメイン側のWordpressデータベースを、サブ側に復元します。
$ mysql -u user -ppassword wordpress < /home/user/bk/wordpress.sql
ユーザー名:user, パスワード:pasword, データベース名:wordpressの場合のコマンド例です。「/home/user/bk/wordpress.sql」は、バックアップしたファイルを指定してください。
シェルスクリプトを作成して、crontabに登録すれば自動化できますね。
以下は、シェルスクリプトの記載例です。
#!/bin/bash #WordPressディレクトリ全体の同期 sudo rsync -avz --delete --rsync-path="sudo rsync" -e "ssh -p [ポート番号] -i [秘密鍵]" [メイン側ユーザー名]@[メイン側サーバー名]:/var/www/wordpres/ /var/www/wordpress/ #WordPressデータベースのバックアップ ssh -p [ポート番号] -i [秘密鍵] [メイン側のユーザー名]@[メイン側のホスト名] /usr/bin/mysqldump -u user --password='password' wordpress > /home/user/bk/wordpress.sql #WordPressデータベースの復元 mysql -u user -ppassword wordpress < home/user/bk/wordpress.sql
今回やりたかった、WordPressサーバーのデータ同期を自動化することができました。これで少しは安心できますね。