ウェブサイト管理 · 2 min read · Dec 13, 2025
rsyncを使ってウェブサイトをミラーリングする

このチュートリアルでは、メインウェブサーバーからバックアップサーバーにウェブサイトをミラーリングする方法を示します。バックアップサーバーは、メインサーバーが故障した場合に引き継ぐことができます。これにはrsyncというツールを使用し、ミラーに更新があるかどうかをx分ごとにチェックするcronジョブを通じて実行します。したがって、バックアップサーバーは通常、引き継ぐ必要がある場合に最新の状態であるべきです。
rsyncは変更されたファイルのみを更新するため、rsyncを実行するたびに5GBのデータを転送する必要はありません。新しい/変更されたファイルのみをミラーリングし、メインサーバーで削除されたファイルをミラーから削除することもできます。さらに、ミラーされたファイルやディレクトリの権限や所有権を保持することができ、所有権を保持するためには、ここで行うようにrootとしてrsyncを実行する必要があります。メインサーバーで権限や所有権が変更された場合、rsyncはバックアップサーバーでもそれらを変更します。
このチュートリアルでは、より安全なSSHを通じてrsyncをトンネルします。これにより、rsync用にファイアウォールで別のポートを開く必要がなくなります - ポート22(SSH)が開いていれば十分です。問題は、SSHがログインにパスワードを必要とするため、cronジョブとしてrsyncを実行したい場合には良くありません。パスワードが必要な場合は人間の操作が必要であり、これが私たちの望むことではありません。
しかし、幸いにも解決策があります:公開鍵の使用です。バックアップサーバーmirror.example.comで鍵のペアを作成し、そのうちの1つをリモートシステム(server1.example.com)のファイルに保存します。その後、rsyncを実行するときにパスワードを求められることはありません。これにはcronジョブも含まれており、まさに私たちが望むことです。
私がこれまでに書いたことから推測できるように、概念はserver1.example.comのミラーリングをmirror.example.comから直接開始することです。server1.example.comはミラーリングを行うために何もする必要はありません。
ここでは次のセットアップを使用します:
- メインサーバー: server1.example.com (server1) - IPアドレス: 192.168.0.100
- ミラー/バックアップサーバー: mirror.example.com (mirror) - IPアドレス: 192.168.0.175
- ミラーリングされるウェブサイトはserver1.example.comの/var/wwwにあります。
rsyncはファイルとディレクトリのミラーリングのためのものであり、MySQLデータベースをミラーリングしたい場合は、MySQLミラーリング/レプリケーションを使用してください。
まず、これがそのようなシステムを設定する唯一の方法ではないことを言いたいです。この目標を達成する方法はたくさんありますが、これが私が取る方法です。
最初のステップは、システムにログインするか、rootユーザーになることです。DebianとcentOSでは、次のようにします:
su -root以外のユーザーとしてログインしている場合。Ubuntuでは、次のようにします:
sudo -s代わりに。
1 rsyncをインストールする
まず、server1.example.comとmirror.example.comの両方にrsyncをインストールする必要があります。DebianおよびUbuntuシステムでは、次のようになります:
server1/mirror:
(これをrootとして行います!)
apt install rsync他のLinuxディストリビューションでは、yum / dnf(Fedora/CentOS)またはyast(SuSE)を使用してrsyncをインストールします。
CentOS / Rocky LinuxまたはAlmaLinuxでは、次のようにします:
dnf install rsync2 server1.example.comに特権のないユーザーを作成する
次に、server1.example.comにsomeuserという特権のないユーザーを作成します。このユーザーは、mirror.example.comでrsyncによって/var/wwwディレクトリをミラーリングするために使用されます(もちろん、someuserはserver1.example.comの/var/wwwに対する読み取り権限を持っている必要があります)。
server1:
(これをrootとして行います!)
sudo useradd -d /home/someuser -m -s /bin/bash someuserこれにより、ホームディレクトリ/home/someuserとログインシェル/bin/bashを持つユーザーsomeuserが作成されます(someuserには有効なログインシェルが必要です - /bin/falseのようなものは機能しません!)。次に、someuserにパスワードを設定します:
passwd someuser3 rsyncをテストする
次に、mirror.example.comでrsyncをテストします。rootとしてこれを行います:
mirror:
rsync -avz -e ssh [email protected]:/var/www/ /var/www/次のようなメッセージが表示されるはずです。yesと答えてください:
The authenticity of host 'server1.example.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?<-- yes次にsomeuserのパスワードを入力すると、server1.example.comの/var/wwwディレクトリがmirror.example.comの/var/wwwにミラーリングされるのが確認できるはずです。
両方のサーバーで次のように確認できます:
server1/mirror:
ls -la /var/wwwすべてのファイルとディレクトリがmirror.example.comにミラーリングされており、ファイルとディレクトリはserver1.example.comと同じ権限/所有権を持っているはずです。
4 mirror.example.comで鍵を作成する
次に、mirror.example.comで秘密鍵/公開鍵ペアを作成します:
mirror:
(これをrootとして行います!)
mkdir /root/rsync
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key次のようなメッセージが表示されます:
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /root/cron/mirror-rsync-key.
Your public key has been saved in /root/cron/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirrorパスフレーズを入力しないことが重要です。そうしないと、ミラーリングは人間の操作なしでは機能しませんので、単にenterを押してください!
次に、公開鍵をserver1.example.comにコピーします:
mirror:
(これもrootとして行います。)
scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/someuser/公開鍵mirror-rsync-key.pubは、server1.example.comの/home/someuserに利用可能になっているはずです。
5 server1.example.comを設定する
次に、someuser(rootではなく)としてserver1.example.comにSSHでログインし、次の操作を行います:
server1:
(これをsomeuserとして行ってください!)
mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keysこれにより、mirror-rsync-key.pubの内容が/home/someuser/.ssh/authorized_keysファイルに追加されました。/home/someuser/.ssh/authorized_keysは次のようになります:
server1:
(これもsomeuserとして!)
vi /home/someuser/.ssh/authorized_keysssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror次に、mirror.example.comからの接続のみを許可し、接続するユーザーはrsyncのみを使用できるようにするため、次の行を/home/someuser/.ssh/authorized_keysの先頭に追加します:
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-ptyserver1:
(これもsomeuserとして!)
vi /home/someuser/.ssh/authorized_keyscommand="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirrorfrom=の後にはIPアドレスの代わりにmirror.example.comのようなFQDNを使用する必要があります。そうしないと、自動ミラーリングは機能しません!
次に、すべてのコマンドを拒否し、rsyncのみを許可するスクリプト/home/someuser/rsync/checkrsyncを作成します。
server1:
(これもsomeuserとして行います!)
mkdir ~/rsync
vi ~/rsync/checkrsync#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esacchmod 700 ~/rsync/checkrsync6 mirror.example.comでrsyncをテストする
次に、mirror.example.comでsomeuserのパスワードを求められることなくserver1.example.comをミラーリングできるかテストします。これを行います:
mirror:
(これをrootとして行います!)
rsync -avz --delete --exclude=/stats --exclude=/error --exclude=/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/(–deleteオプションは、server1.example.comで削除されたファイルもmirror.example.comで削除されることを意味します。–excludeオプションは、これらのファイル/ディレクトリがミラーリングされないことを意味します。たとえば、–exclude=/errorは「/var/www/errorをミラーリングしない」という意味です。複数の–excludeオプションを使用できます。これらのオプションは例として挙げたものであり、必要に応じてコマンドを調整できます。詳細については、
man rsyncを参照してください。)
これで、ミラーリングが行われているのが確認できるはずです:
receiving file list ... done
sent 71 bytes received 643 bytes 476.00 bytes/sec
total size is 64657 speedup is 90.56パスワードを求められることなく!これが私たちの望んでいたことです。
7 cronジョブを作成する
ミラーリングを自動化したいので、mirror.example.comでcronジョブを作成します。rootとしてcrontab -eを実行します:
mirror:
(これをrootとして行います!)
crontab -e次のようなcronジョブを作成します:
*/5 * * * * /usr/bin/rsync -azq --delete --exclude=/stats --exclude=/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/ これにより、rsyncが5分ごとに実行されます。必要に応じて調整してください(
man 5 crontabを参照してください)。ここではrsyncのフルパス(/usr/bin/rsync)を使用しています。これはcronがrsyncの場所を知っていることを確認するためです。rsyncの場所は異なる場合があります。次のコマンドを実行します:
mirror:
(これをrootとして行います!)
which rsync自分のrsyncの場所を確認してください。
8 リンク
- rsync: https://rsync.samba.org/
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。