网站搜索

使用 rsync 镜像您的网站


在此页面上

  1. 1 安装rsync
  2. 2 在 server1.example.com 上创建非特权用户
  3. 3 测试rsync
  4. 4 在mirror.example.com上创建密钥
  5. 5 配置server1.example.com
  6. 6 在mirror.example.com上测试rsync
  7. 7 创建一个 Cron 作业
  8. 8 个链接

本教程介绍如何将您的网站从主 Web 服务器镜像到备份服务器,以便在主服务器出现故障时接管。为此,我们使用 rsync 工具,并让它通过 cron 作业运行,每隔 x 分钟检查镜像上是否有需要更新的内容。因此,如果必须接管,您的备份服务器通常应该是最新的。

rsync 仅更新已更改的文件,因此每次运行 rsync 时都不需要传输 5 GB 的数据。它只镜像新的/更改的文件,也可以从镜像中删除主服务器上已删除的文件。除此之外,它还可以保留镜像文件和目录的权限和所有权;为了保留所有权,我们需要以 root 身份运行 rsync,这就是我们在这里所做的。如果主服务器上的权限和/或所有权发生更改,rsync 也会在备份服务器上更改它们。

在本教程中,我们将通过 SSH 隧道 rsync,这更安全;这也意味着您不必在防火墙中为 rsync 打开另一个端口 - 如果端口 22 (SSH) 打开就足够了。问题是 SSH 需要密码才能登录,如果您想将 rsync 作为 cron 作业运行,这不太好。对密码的需求需要人际交互,这不是我们想要的。

但幸运的是有一个解决方案:使用公钥。我们创建一对密钥(在我们的备份服务器 mirror.example.com 上),其中一个保存在远程系统上的文件中 (server1.example.com)。之后,当我们运行 rsync 时,将不再提示输入密码。这还包括 cron 作业,这正是我们想要的。

正如您可能已经从我到目前为止所写的内容中猜到的,这个概念是我们直接从 启动 server1.example.com 的镜像镜像.example.com; server1.example.com 无需执行任何操作即可获得镜像。

我将在这里使用以下设置:

  • 主服务器:server1.example.com (server1) - IP 地址:192.168.0.100
  • 镜像/备份服务器:mirror.example.com(镜像) - IP地址:192.168.0.175
  • 要镜像的网站位于 server1.example.com 上的 /var/www 中。

rsync 仅用于镜像文件和目录;如果您想镜像 MySQL 数据库,请使用 MySQL 镜像/复制。

我首先想说的是,这并不是建立这样一个系统的唯一方法。实现这个目标的方法有很多,但这就是我将采取的方法。

第一步是登录或成为系统上的根用户。在 Debian 和 centOS 上,使用:

su -

如果您以与 root 不同的用户身份登录。在 Ubuntu 上,使用:

sudo -s

反而。

1 安装rsync

首先,我们必须在 server1.example.com 和mirror.example.com 上安装 rsync。对于 Debian 和 Ubuntu 系统,这看起来像这样:

服务器1/镜像:

(我们以 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 上的 /var/www 具有读取权限.example.com)。

服务器1:

(我们以 root 身份执行此操作!)

sudo useradd -d /home/someuser -m -s /bin/bash someuser

这将创建用户 someuser,其主目录 /home/someuser 和登录 shell /bin/bash (重要的是,someuser 拥有有效的登录 shell - 像 /bin/false 这样的东西不起作用!)。现在给某个用户一个密码:

passwd someuser

3 测试rsync

接下来,我们在mirror.example.com上测试rsync。作为 root,我们这样做:

镜子 :

rsync -avz -e ssh [email :/var/www/ /var/www/

你应该看到这样的东西。回答是:

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

然后输入某个用户的密码,您应该看到 server1.example.com 的 /var/www 目录被镜像到mirror.example.com 上的 /var/www 。

您可以在两台服务器上这样检查:

服务器1/镜像:

ls -la /var/www

您应该看到所有文件和目录都已镜像到mirror.example.com,并且文件和目录应具有与server1.example.com 上相同的权限/所有权。

4 在mirror.example.com上创建密钥

现在我们在mirror.example.com上创建私钥/公钥对:

镜子 :

(我们以 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

重要的是,不要输入密码,否则,如果没有人工交互,镜像将无法工作,因此只需按输入即可!

接下来,我们将公钥复制到 server1.example.com:

镜子 :

(不过,我们还是以 root 身份执行此操作。)

scp /root/rsync/mirror-rsync-key.pub [email :/home/someuser/

公钥mirror-rsync-key.pub 现在应该在 server1.example.com 上的 /home/someuser 中可用。

5 配置server1.example.com

现在,通过 SSH 以某个用户(不是 root!)身份登录 server1.example.com 并执行以下操作:

服务器1:

(请以某个用户身份执行此操作!)

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 应类似于以下内容:

服务器1:

(仍然是某个用户!)

vi /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@
mirror

现在我们只想允许来自mirror.example.com的连接,并且应该允许连接用户仅使用rsync,所以我们添加

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty

就在 /home/someuser/.ssh/authorized_keys 的开头:

服务器1:

(仍然是某个用户!)

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= 后使用 FQDN(例如mirror.example.com)而不是 IP 地址,否则自动镜像将无法工作!

现在我们创建脚本 /home/someuser/rsync/checkrsync 拒绝除 rsync 之外的所有命令。

服务器1:

(我们仍然以某个用户的身份这样做!)

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 上测试是否可以镜像server1.example.com 而不会提示输入某个用户的密码。我们这样做:

镜子 :

(我们以 root 身份执行此操作!)

rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email :/var/www/ /var/www/

(--delete 选项表示已在 server1.example.com 上删除的文件也应在mirror.example.com 上删除。--exclude 选项表示不应镜像这些文件/目录;例如 --exclude =**/error 表示“不镜像 /var/www/error”。我已列出这些选项作为示例;您可以根据需要调整命令。

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:

镜子 :

(我们以 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 :/var/www/ /var/www/ 

这将每 5 分钟运行一次 rsync;根据您的需要进行调整(参见

man 5 crontab

)。我在这里使用 rsync 的完整路径 (/usr/bin/rsync) 只是为了确保 cron 知道在哪里可以找到 rsync。您的 rsync 位置可能有所不同。跑步

镜子 :

(我们以 root 身份执行此操作!)

which rsync

找出你的在哪里。

8 个链接

  • rsync:https://rsync.samba.org/

相关文章: