项目说明

总体需求

某企业里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了数据就会丢失,现在领导要求把数据做备份,这样Web服务器数据丢失在可以进行恢复 要求如下:

  1. 每天00点整在Web服务器上按日期打包备份系统配置文件、网站程序目录及访问日志文件
  2. 通过rsync命令推送到备份服务器上保存
  3. 备份服务器定时清除旧记录
  4. 搭建邮件告警平台

备份需求

  • 所有服务器的备份目录必须都为/backup。
  • 要备份的系统配置文件包括但不限于:   - 定时任务服务的配置文件(/var/spool/cron/root)  (适合Web和NFS服务器)。   - 开机自启动的配置文件(/etc/rc.local)  (适合Web和NFS服务器)。   - 日常脚本的目录  (/server/scripts)。
  • Web服务器要求   - Web站点目录假定为/var/html/www,如果没有,可以先模拟创建。   - Web服务器访问日志路径假定为/app/logs,如果没有,可以先模拟创建。   - Web服务器本地保留打包后的7天备份数据即可(本地留存不能多于7天,因为数据太多硬盘会满)。
  • 备份服务器要求   - 保留最近7天所有备份数据,保留6个月内每周一的所有数据副本。   - 要按照备份数据服务器内网IP为目录名称,备份的文件按照时间、名称为文件名称。   - 需要确保备份的数据尽量完整准确,在备份服务器上对备份的数据是否完整进行检查。   - 备份服务器每天早晨8:00把备份成功或失败结果信息发送到系统管理员邮箱里。
服务器说明 备份目录 目录说明 备注
all server /backup 备份目录 统一服务器本地备份目录,便于管理
all server /var/spool/cron/root 定时任务服务配置文件 系统配置文件
all server /etc/rc.local 开机自启动配置文件 系统配置文件
all server /server/scripts 日常脚本目录 统一服务器本地脚本目录,便于管理
Web server /var/www/html web服务器站点目录 mkdir -p /var/www/html
Web server /app/logs web服务器访问日志路径 mkdir -p /app/logs

Rsync概述

作用:

  • rsync:remote sync(远程同步),是一个在 Linux 和其他 Unix-like 系统上一个非常强大的命令行工具,用于计算机之间进行数据同步,可以当做文件复制工具,替代cp和mv命令,主页:https://rsync.samba.org/

特点

  • 同步速度快:由于使用sync算法,其只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
  • 可以镜像保存整个目录树和文件系统
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等
  • 无须特殊权限即可安装
  • 优化的流程,文件传输效率高
  • 可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接
  • 支持匿名传输。

语法

标准结构:

Terminal window
rsync [选项] 源目录/文件 目标目录/文件
-a, --archive:归档模式,保留所有文件属性。
-v, --verbose:详细输出。
-r, --recursive:递归地同步目录。
-z, --compress:使用压缩传输数据,可以减少网络带宽。
-e, --rsh=COMMAND:指定远程 shell 程序(例如 SSH)。
--delete:删除目标中不在源中的文件。
--exclude=PATTERN:排除符合指定模式的文件或目录。

本地同步:

Terminal window
rsync -a source destination
# -a包含-r的递归功能同时可以同步修改时间、权限等元信息

远程同步:

Terminal window
# 默认使用ssh协议传输
rsync  -av  source/  username@remote_host:destination # 本地内容同步到远程即推送
rsync  -av  username@remote_host:source/  destination # 远程内容同步到本地即拉取
# 若两端都有rsync进程,可以使用rsync协议传输
rsync  -av  source/  192.168.122.32::module/destination      # 有2个冒号

增量备份:

Terminal window
# 只复制变动的内容
rsync  -a  --delete  --link-dest  /compare/path  /source/path  /target/path
# 分析
  # --link-dest参数指定基准目录/compare/path
  # 源目录/source/path跟基准目录进行比较
  # 之后找出变动的文件,将其拷贝到目标目录/target/path,未变动的文件会生成硬链接。
  # 该命令的第一次备份时为全量备份,之后为增量备份

项目环境

已知3台服务器主机名分别为web01、backup、nfs01,主机信息建下表。

主机名 IP地址 硬件 软件
web01 192.168.88.128 cpu:1颗4核
内存:4GB
HDD:20GB
网络:NAT
VmWare17
OpenEuler_2203
nginx1.20
rsync3.1.2
nfs01 192.168.88.129 cpu:1颗4核
内存:4GB
HDD:20GB
网络:NAT
VmWare17
OpenEuler_2203
nfs
rpcbind
rsync3.1.2
backup 192.168.88.130 cpu:1颗4核
内存:4GB
HDD:20GB
网络:NAT
VmWare17
OpenEuler_2203
mailx12.5
rsync3.1.2

实验环境下实施步骤

环境搭建

web01服务器环境搭建

需要确保关闭防火墙和selinux,设置主机名,配置yum源

Terminal window
# 彻底关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
vim /etc/selinux/config # 修改SELINUX=disabled
# 修改主机名
hostnamectl set-hostname web01
reboot
# 重做yum源,使用阿里云镜像仓库
yum clean all && yum makecache
# 安装所需软件
yum install nano tree tar net-tools rsync nfs-utils nginx -y

部署网站示例:

Terminal window
mkdir /www
# 使用ftp工具将sczl示例网站上传至www目录下,结构如下

示例网站目录结构 修改nginx配置文件,部署网站:

Terminal window
nano /etc/nginx/nginx.conf
# 修改server块:
server {
listen 80;
server_name 192.168.88.128;
root /www/sczl;
index index.html index.htm;
}
# 检测语法
nginx -t
# 若成功则输出
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 启动nginx服务
systemctl start nginx
systemctl enable nginx
# 使用windows浏览器打开192.168.88.128,有网页显示,则正常
# 本地自测:
[root@web01 ~]# curl -I 192.168.88.128:80
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Sun, 28 Jun 2026 08:40:25 GMT
Content-Type: text/html
Content-Length: 91358
Last-Modified: Sun, 28 Jun 2026 08:28:38 GMT
Connection: keep-alive
ETag: "6a40db36-164de"
Accept-Ranges: bytes

nfs服务器环境搭建

同上需要确保关闭防火墙和selinux,设置主机名,配置yum源(略过) 部署共享存储: nfs01为服务端,web01为客户端 nfs01服务端操作:

Terminal window
# 安装软件
yum install rpcbind nfs-utils -y
# 创建并配置共享目录
mkdir /nfsfile
echo "welcome to www.openlab.com" > /nfsfile/readme
chmod -Rf 777 /nfsfile
vim /etc/exports
# 添加如下内容
/nfsfile 192.168.88.0/24(rw,sync,all_squash)
# 启动服务
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server

web01客户端操作:

Terminal window
# 显示服务端共享目录
showmount -e 192.168.88.129
# 输出为:
Export list for 192.168.88.129:
/nfsfile 192.168.88.0/24
# 创建挂载目录
mkdir /web_nfs
# 将远端/nfsfile目录挂载到本地/web_nfs目录上
mount -t nfs 192.168.88.129:/nfsfile /web_nfs
# 此时,/web_nfs目录内应有readme
[root@web01 web_nfs]ls
readme
# 实现永久挂载
vim /etc/fstab
# 添加:
192.168.88.129:/nfsfile /web_nfs nfs defaults 0 0
# 重新加载挂载项,并查看
mount -a
df -h
# 示例输出:
[root@web01 web_nfs]df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.7G 0 1.7G 0% /dev/shm
tmpfs 676M 17M 659M 3% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 35G 5.2G 28G 16% /
tmpfs 1.7G 0 1.7G 0% /tmp
/dev/sda1 920M 145M 712M 17% /boot
192.168.88.129:/nfsfile 35G 2.6G 30G 8% /web_nfs

backup服务器环境搭建

同上需要确保关闭防火墙和selinux,设置主机名,配置yum源(略过) 修改rsync配置文件:

Terminal window
nano /etc/rsyncd.conf
# 修改文件,内容如下
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
[backup]
path = /backup
ignore errors
read only = false
list = false
hosts allow 192.168.88.0/24
hosts deny = 0.0.0.0/32
auth users = rsync
secrets file = /etc/rsync.password
# 同时要根据配置文件设置
useradd -M -s /sbin/nologin rsync
mkdir /backup
chown -R rsync /backup
# 启动服务,设计开机自启
systemctl enable --now rsyncd
# 创建rsync虚拟账户名和密码,并赋予密码文件600权限
echo "rsync:rsync123" > /etc/rsync.password
chmod 600 /etc/rsync.password

配置备份脚本

配置web01客户端本地备份脚本

web01客户端主机需要打包备份的内容:/var/log/nginx下的日志文件和/www下的网站主数据以及定时任务和备份脚本源文件:/var/spool/cron/root、/etc/rc.local、/server/scripts 编写备份web01服务器的脚本:

#!/bin/bash
# 定义时间
Date=$(date +%F_Week0%w)
# 获取IP
Host_IP=$(ifconfig ens32 | awk '/inet / {print $2}')
# 本地备份路径
Backup_Dir="/backup/"
# 备份服务器的IP
Backup_Server_IP=192.168.88.130
# 创建指定目录和IP的目录
[ ! -d "$Backup_Dir/$Host_IP" ] && mkdir -p "$Backup_Dir/$Host_IP"
# 输出提示信息
echo "${Date} ${Host_IP} 开始备份 ......"
# 按要求打包备份所有本地重要文件
cd / &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_cron_bak_${Date}.tar.gz" var/spool/cron &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_rc_local_bak_${Date}.tar.gz" etc/rc.d/rc.local &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_scripts_bak_${Date}.tar.gz" server/scripts/ &&\
tar zcf "$Backup_Dir$Host_IP/www_${Date}.tar.gz" www/ &&\
tar zcf "$Backup_Dir$Host_IP/nginx_logs_${Date}.tar.gz" var/log/nginx/
# 给所有备份的压缩文件建立指纹,放入指纹库flag,后面会验证完整性
find "${Backup_Dir:-/tmp}" -type f -name "*${Date}.tar.gz" | xargs md5sum \
> "$Backup_Dir/$Host_IP/${Date}.flag"
# 把备份推送到备份服务器
rsync -az "$Backup_Dir" "rsync@${Backup_Server_IP}::backup" --password-file=/etc/rsync.password
# 删除7天以前的所有本地备份数据
find "${Backup_Dir:-/tmp}" -type f \( -name "*.tar.gz" -o -name "*.flag" \) -mtime +7 | \
xargs rm -f
echo "本地备份成功,备份文件已推送到备份服务器"
Terminal window
vim /etc/rsync.password
# 只写入密码 rsync123
# 修改权限为600
chmod 600 /etc/rsync.password
# ----- 测试 -----
bash /server/scripts/backup.sh
# 成功输出
2026-07-01_Week03 192.168.88.128 开始备份 ......
本地备份成功,备份文件已推送到备份服务器
# 在backup服务器中可以看到推送的数据
[root@backup ~] ls /backup/192.168.88.128/
2026-07-01_Week03.flag sys_rc_local_bak_2026-07-01_Week03.tar.gz nginx_logs_2026-07-01_Week03.tar.gz sys_scripts_bak_2026-07-01_Week03.tar.gz sys_cron_bak_2026-07-01_Week03.tar.gz www_2026-07-01_Week03.tar.gz

配置nfs01客户端本地备份脚本

nfs01客户端主机需要打包备份的内容:/nfsfile、/var/log/message文件以及mount -l 挂载信息。 编写备份nfs01服务器的脚本:

#!/bin/bash
# 定义时间
Date=$(date +%F_Week0%w)
# 获取IP
Host_IP=$(ifconfig ens32 | awk '/inet / {print $2}')
# 本地备份路径
Backup_Dir="/backup/"
# 备份服务器的IP
Backup_Server_IP=192.168.88.130
# 挂载日志
mount -l > /var/log/mount.log
# 创建指定目录和IP的目录
[ ! -d "$Backup_Dir/$Host_IP" ] && mkdir -p "$Backup_Dir/$Host_IP"
# 输出提示信息
echo "${Date} ${Host_IP} 开始备份 ......"
# 按要求打包备份所有本地重要文件
cd / &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_cron_bak_${Date}.tar.gz" var/spool/cron &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_rc_local_bak_${Date}.tar.gz" etc/rc.d/rc.local &&\
tar zcf "${Backup_Dir}${Host_IP}/sys_scripts_bak_${Date}.tar.gz" server/scripts/ &&\
tar zcf "$Backup_Dir$Host_IP/nfs_${Date}.tar.gz" nfsfile/ &&\
tar zcf "$Backup_Dir$Host_IP/mount_logs_${Date}.tar.gz" var/log/mount.log/
# 给所有备份的压缩文件建立指纹,放入指纹库flag,后面会验证完整性
find "${Backup_Dir:-/tmp}" -type f -name "*${Date}.tar.gz" | xargs md5sum \
> "$Backup_Dir/$Host_IP/${Date}.flag"
# 把备份推送到备份服务器
rsync -az "$Backup_Dir" "rsync@${Backup_Server_IP}::backup" --password-file=/etc/rsync.password
# 删除7天以前的所有本地备份数据
find "${Backup_Dir:-/tmp}" -type f \( -name "*.tar.gz" -o -name "*.flag" \) -mtime +7 | \
xargs rm -f
echo "本地备份成功,备份文件已推送到备份服务器"
Terminal window
vim /etc/rsync.password
# 只写入密码 rsync123
# 修改权限为600
chmod 600 /etc/rsync.password
# ----- 测试 -----
bash /server/scripts/backup.sh
# 成功输出
[root@nfs01 ~] bash /server/scripts/backup.sh
2026-07-01_Week03 192.168.88.129 开始备份......
本地备份成功,备份文件已推送到备份服务器
# 在backup服务器可以看到推送的数据
[root@backup ~] ls /backup/
192.168.88.128 192.168.88.129
[root@backup ~] ls /backup/192.168.88.129/
2026-07-01_Week03.flag sys_cron_bak_2026-07-01_Week03.tar.gz
mount_logs_2026-07-01_Week03.tar.gz sys_rc_local_bak_2026-07-01_Week03.tar.gz
nfs__2026-07-01_Week03.tar.gz sys_scripts_bak_2026-07-01_Week03.tar.gz

配置定时任务

web01与nfs01服务器编辑定时任务,实现每天00:00定时备份本地数据,并推送到Rsync服务器上

Terminal window
# 安装crontabs
yum install crontabs
# 编辑定时服务
crontab -e
# 写入如下信息
00 00 * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1

backup服务器编写脚本,实现删除180天前的所有备份数据,但保存每周一的

Terminal window
# 创建目录
mkdir -p /server/scripts
# 编写脚本
nano /server/scripts/del_bak_data.sh
# 内容如下:
#!/bin/bash
Backup_Dir="/backup"
# 删除七天前的压缩包和flag文件,但是每周一的不删
find "${Backup_Dir:-/tmp}" -type f -name "*.tar.gz*" ! -name "*week01*" -o -name "*flag*" \
-mtime +7 | xargs rm -f
# 删除180天前所有的压缩包和flag文件
find "${Backup_Dir:-/tmp}" -type f -name "*.tar.gz*" -name "*flag*" -mtime + 180 | xargs rm -f
# 提示信息
echo "删除备份脚本已执行,删除了180天前所有的备份文件,以及7天前除去每周一的备份都已删除"
# 注意:Backup_Dir:-/tmp表示检查环境变量 Backup_Dir 是否已设置。如果设置了,就使用其值;
# 如果没有设置,就使用默认值 /tmp

数据传输完整性验证与监控告警

验证数据完整性

backup服务端针对客户端备份时的md5指纹数据,利用MD5命令进行验证,完成数据传输过程完整性验证。

# 在backup服务器编写脚本
nano /server/scripts/send_mail.sh
# 内容如下
#!/bin/bash
Date=$(date +%F_Week0%w)
Backup_Dir="/backup/"
Check_Log="/tmp/bak.log_$(date + %F)"
Admin_Mail=4866*****@qq.com
find "$Backup_Dir" -type f -name "${Date}.flag" | xargs md5sum -c >> "$Check_Log"
if [ -s "$Check_Log" ]
then
mail -s "$Date backup data info" $Admin_Mail < "$Check_Log"
else
echo "$Date backup data error,pls check it." > "$Check_Log"
mail -s "$Date backup data info" $Admin_Mail < "$Check_Log"
fi
# 保留日志备份,然后清空原始日志
cp "$Check_Log" "${Check_Log}.ori" && > "$Check_Log"

配置邮件告警

Terminal window
# 安装邮件服务
yum install mailx -y
# 配置qq邮箱ssl证书
mkdir -p /root/.certs
cd /root/.certs
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
# 预期输出:
Notice: Trust flag u is set automatically if the private key is present.
# 编辑mail配置文件
vim /etc/mail.rc
# 在末尾添加(本项目使用的是qq邮箱)
set smtp=smtps://smtp.qq.com:465
set smtp-auth=login
set smtp-auth-user=4866*****@qq.com
set smtp-auth-password=vmo**********idf
set ssl-verify=ignore

测试邮件服务:

Terminal window
echo "testmail" | mail -s "testmail" 4866*****@qq.com
bash /server/scripts/send_mail.sh

当邮箱出现testmai和类似于2026-07-02_Week04 backup data info的邮件则成功。 至此自动化备份全网服务器数据平台项目配置结束。