# 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)。
← Windows 环境多服务文件同步 概述 →