ウェブサイト管理 · 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 rsync

2 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 someuser

3 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_keys
ssh-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-pty

server1:

(これもsomeuserとして!)

vi /home/someuser/.ssh/authorized_keys
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@  
mirror

from=の後には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"  
                ;;  
esac
chmod 700 ~/rsync/checkrsync

6 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 リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。