# Linux 环境多服务文件同步

多服务器文件同步的目标是将 SSCMS 系统生成的站点文件以及图片、附件等站点资源文件同步至独立服务器并对外提供访问,以避免直接将 SSCMS 系统暴露在外网。

我们推荐使用免费开源的 rsync 软件进行跨服务器文件同步,除了 rsync 软件之外,您也可以使用其他第三方软件进行文件同步。

通常,为了避免将管理后台暴露在外的风险,我们不会同步管理后台 ss-admin 文件夹,如果站点为纯静态页面,不包含登录、搜索、点击量统计等互动功能,我们可以只同步站点文件夹,如果包含互动功能,可以同步除 ss-admin 文件夹以外的所有文件,以保证 API 能够正常访问。

# 1、rsync 简介

本教程向您展示如何在 Linux 环境下使用 rsync 工具,并让它运行一个 cron 作业,每隔几分钟检查一次镜像上是否有需要更新的内容。

rsync 只更新已更改的文件,因此每次运行 rsync 时系统不会将所有文件同步一遍,它只同步新的或更改的文件,它也可以从镜像中删除主服务器上已删除的文件。

除此之外,rsync 还可以保留镜像文件和目录的权限和所有权,为了保持所有权,我们需要以 root 身份运行 rsync。如果主服务器上的权限或所有权发生变化,rsync 也会在备份服务器上更改它们。

在本教程中,我们将通过 SSH 使用 rsync,这样做安全性更高,同时也避免了在防火墙中为 rsync 单独设置端口号,只需要端口22 (SSH)打开就足够了。

命令基本格式:rsync [选项] 原始位置 目标位置

常用的选项:

  • -a:归档模式,递归且保留文件对象的属性,等同于-rlptgoD(没有-H、-A、-X)
  • -v:显示同步过程的详细信息
  • -z:在传输文件时进行压缩
  • -H:保留硬链接文件
  • -A:保留ACL权限
  • -X:保留chattr权限
  • -r:递归模式,包含目录以及子目录中所有的文件
  • -l:对于符号链接文件仍然保留
  • -p:保留文件属性的权限
  • -t:保留文件属性的时间
  • -g:保留文件属性的所属组(仅限超级用户使用)
  • -o:保留文件属性的所有者(仅限超级用户使用)
  • -D:保留设备文件以及其他特殊文件

假设我们需要配置的服务器信息如下:

  • 服务端: server - IP 地址: 192.168.0.1
  • 客户端: mirror - IP 地址: 192.168.0.2
  • 需要同步的站点目录:/var/www/wwwroot/

# 2、安装 rsync

首先,我们必须在服务端和客户端上安装 rsync。

对于 Debian 和 Ubuntu 系统,运行命令:

apt install rsync

对于 Fedora 和 CentOS 系统,运行命令:

yum install rsync

对于 RHEL、Rocky、CentOS Stream 和 AlmaLinux 系统,运行命令:

dnf install rsync

注意,传输的双方(服务端及客户端)都必须安装 rsync。

# 3、测试 rsync

我们进入客户端(mirror),同步服务端中的目录 /var/www/wwwroot/

进入客户端(mirror):

首先创建目录 /var/www/wwwroot/,运行命令:

mkdir -p /var/www/wwwroot/

接下来我们运行 rsync 同步:

rsync -avz --exclude=**/ss-admin/ -e ssh root@192.168.0.1:/var/www/wwwroot/ /var/www/wwwroot/

其中 --exclude 选项用于设置我们需要排除的目录或文件,192.168.0.1是服务端(server)的IP地址。

命令行将显示如下提示:

The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
ECDSA key fingerprint is SHA256:kDI8DAZ1qDzRep14fcjetVeTVOjkJh5CKtzIFoTSFro.
ECDSA key fingerprint is MD5:50:42:49:f6:9c:66:38:50:73:a1:5b:dd:d6:56:d6:fc.
Are you sure you want to continue connecting (yes/no)?

我们输入 yes,然后输入服务端(server)中 root 用户的密码,我们将看到服务端(server)的 /var/www/wwwroot/ 目录下的所有文件和目录都被镜像到客户端(mirror)上的 /var/www/wwwroot/ 目录下,并且这些文件和目录应该具有与服务端(server)拥有相同的权限/所有权。

提示

如果服务器的 SSH 端口不是默认的22,您可以使用类似这样的方式指定端口: rsync -avz -e 'ssh -p [port]'

# 4、rsync 免密同步

通过以上步骤,我们已经实现了同步功能,但每执行一次 rsync 命令,我们需要输入一次服务器端的密码才能实现数据的同步,接下来,我们将介绍如何实现 rsync 免密验证同步功能。

首先,我们需要在客户端(mirror)上生成公钥私钥对,键入命令后一直回车即可,密钥对将保存在 /root/.ssh/ 目录中。

进入客户端(mirror):

我们运行 ssh-keygen 生成公钥私钥对:

ssh-keygen -t rsa -b 2048

命令将显示类似提示文字:

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):【在此回车】
Enter passphrase (empty for no passphrase):【在此回车】
Enter same passphrase again:【在此回车】
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256: TDA3tWeRhQIqzTORLaqy18nKnQOFNDhoAsNqRLo1TMg root@fedora
The key's randomart image is:
+---[RSA 2048]----+
|O+. +o+o. .+. |
|BEo oo*....o. |
|*o+o..*.. ..o |
|.+..o. = o |
|o o S |
|. o |
| o +. |
|....=. |
| .o.o. |
+----[SHA256]-----+

在上面的命令中,有三次提示输入,只需按回车即可。

接下来,我们在客户端(mirror)中使用 scp 命令将公钥文件发送给服务端(server):

scp -P 22 /root/.ssh/id_rsa.pub root@192.168.0.1:/home/

其中 192.168.0.1 是服务端(server)的IP地址。

然后,我们进入服务端(server)服务器,将 SSH 公钥放入 /root/.ssh/authorized_keys 中。

进入服务端(server):

mkdir -p /root/.ssh/
cat /home/id_rsa.pub >> /root/.ssh/authorized_keys

接下来,我们进入客户端(mirror),尝试下免密验证登录:

ssh -p 22 root@192.168.0.1

其中 192.168.0.1 是服务端(server)的IP地址。

如果登录成功,SSH 免密登录就能正常工作了,接下来,我们在客户端(mirror)中使用密钥运行 rsync 命令:

rsync -avz --delete --exclude=**/ss-admin/ -e ssh root@192.168.0.1:/var/www/wwwroot/ /var/www/wwwroot/

可以发现,命令行不再要求我们输入 root 用户的密码,rsync 命令将直接同步文件。

# 5、创建计划任务(Cron Job)

我们已经通过 rsync 命令同步成功目录与文件了,接下来我们希望自动化运行,我们需要在客户端(mirror)中创建一个 cron 计划任务。

进入客户端(mirror):

以 root 身份运行命令:

crontab -e

输入以下计划任务:

*/1 * * * * /usr/bin/rsync -azq --delete --exclude=**/ss-admin/ -e ssh root@192.168.0.1:/var/www/wwwroot/ /var/www/wwwroot/

此任务将每1分钟运行一次 rsync 命令,我们也可以调整 cron 表达式的值,设置其他命令运行频率。

以上计划任务使用 rsync 默认安装的位置(/usr/bin/rsync),如果 rsync 安装在其他位置,可以使用以下命令确定 rsync 安装位置:

which rsync

至此,计划任务配置完成。

# 6、更多

rsync 更多配置信息可以参考 rsync 官网 https://rsync.samba.org/ (opens new window)

上次更新: 2023/9/24 下午12:07:33