防火墙环境下的全网服务器数据自动化备份平台搭建:基于 rsync 的完整实施指南
一、项目总览
1.内容介绍
本文以 3 台 CentOS 7.9 服务器(Web 服务器、NFS 服务器、备份服务器)为载体,详解如何在全防火墙开启的前提下,搭建一套自动化数据备份平台:每日自动打包 Web 站点、NFS 共享数据及系统关键配置,通过 rsync 增量同步至备份服务器,同时实现旧数据智能清理、备份完整性校验与邮件告警。
2.核心目标
- 自动备份:Web/NFS 服务器每日 0 点自动打包关键数据(系统配置、网站目录、日志等),通过 rsync 推送到备份服务器;
- 存储优化:本地保留 7 天备份,备份服务器保留 7 天内所有数据 + 6 个月内每周一数据;
- 监控告警:备份完成后自动校验完整性,每日 8 点通过邮件发送成功 / 失败报告;
- 防火墙兼容:仅开放 rsync(873)、SMTPs(465)等必要端口,保障安全性。
3.备份要点
- 所有服务器统一备份目录:均为/backup,便于标准化管理;
- Web 服务器需备份内容:
- 系统配置:定时任务(/var/spool/cron/root)、开机自启脚本(/etc/rc.local)、运维脚本(/server/scripts);
- 业务数据:网站目录(/www)、访问日志(/var/log/nginx);
- 本地保留策略:仅保留 7 天备份,避免磁盘占满。
- NFS 服务器需备份内容:
- 系统配置:同 Web 服务器(定时任务、开机自启等);
- 业务数据:共享目录(/nfsfile)、挂载状态日志(/var/log/mount.log)。
- 备份服务器要求:
- 按源服务器内网 IP 创建目录(如/backup/192.168.120.131),文件命名包含时间(如2025-08-07_Week04);
- 保留 7 天内所有数据 + 6 个月内每周一数据(满足合规性与长期归档需求);
- 每日校验备份完整性,通过邮件推送结果。
4.实施大纲
5.选择Rsync的原因:增量同步机制
-
算法优势:仅传输文件差异块(delta编码),比全量传输快90%
-
硬链接优化:–link-dest参数创建硬链接,节省存储空间
避坑点:
-
权限问题:必须设置secrets file权限为600
-
防火墙:需开放873端口(firewall-cmd --add-port=873/tcp --permanent)
-
连接限制:配置文件中的max connections需根据服务器性能调整
6.软硬件环境清单
主机名 | IP地址 | 硬件 | 软件 |
---|---|---|---|
web01 | 192.168.120.131 | cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT | VmWare17 Centos7.9 nginx1.20 rsync3.1.2 |
nfs01 | 192.168.120.132 | cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT | VmWare17 Centos7.9 nfs rpcbind rsync3.1.2 |
backup | 192.168.120.133 | cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT | VmWare17 Centos7.9 mailx12.5 rsync3.1.2 |
二、项目环境(所有服务器通用步骤)
项目拓扑图
1. 安装 CentOS 7.9 系统
通过 VmWare 17 创建 3 台虚拟机,配置如下:
- 内存:2GB,硬盘:20GB,CPU:2 核
- 镜像:CentOS-7-x86_64-DVD-2207-02.iso
- 网络模式:NAT(确保三台机器在同一网段)
2.初始化系统(以web1为例,nfs1/backup步骤相同)
(1)关闭 SELinux(重启生效)
SELinux 是 Linux 的安全子系统,默认开启会严格限制文件访问权限,可能导致 rsync 同步、脚本执行失败。
# 永久关闭SELinux
[root@web1 ~]# sed -i '7s/enforcing/disabled/gp' /etc/selinux/config
(2)开启并配置防火墙
所有服务器均开启 firewalld,需按角色开放特定端口,既保障安全又不阻碍备份流程:
# 启动firewalld并设置开机自启
[root@web1 ~]# systemctl enable --now firewalld
# 验证防火墙状态(确保显示“active (running)”)
[root@web1 ~]# systemctl status firewalld
# 开放SSH端口(远程管理必备)
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-service=ssh
# 允许本地回环地址(服务内部通信)
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-interface=lo
# 重新加载规则(使配置生效)
[root@web1 ~]# firewall-cmd --reload
# 验证规则(应包含“ssh”和“lo”)
[root@web1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
(3)配置时间服务器同步
多服务器协同工作时,时间不一致会导致定时任务执行偏差(如备份时间不同步),需通过 chrony 同步时间:
[root@web1 ~]# yum install chrony -y
# 启动服务并设置开机自启
[root@web1 ~]# systemctl enable --now chronyd
[root@web1 ~]# vim /etc/chrony.conf
#配置阿里时间服务器(国内访问速度快,稳定性高)
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony# 重启服务使配置生效
[root@web1 ~]# systemctl restart chronyd
# 验证同步结果(出现"*"表示成功同步到阿里服务器)
[root@web1 ~]# chronyc sources -v
210 Number of sources = 1.-- Source mode '^' = server, '=' = peer, '#' = local clock./ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 17 1 -1982us[-8372us] +/- 94ms
(4)配置静态 IP
动态 IP 可能导致服务器重启后 IP 变化,破坏 rsync 同步、NFS 挂载等依赖固定 IP 的服务:
主机名 | IP地址 | 网关 | DNS |
---|---|---|---|
web1 | 192.168.120.131 | 192.168.120.2 | 114.114.114.114 |
nfs1 | 192.168.120.132 | 192.168.120.2 | 114.114.114.114 |
backup | 192.168.120.133 | 192.168.120.2 | 114.114.114.114 |
注意!!!别忘了使用以下命令,使配置生效(建议在虚拟机做)
[root@web1 ~]# nmcli connection reload
[root@web1 ~]# nmcli connection up ens32
(5)安装基础工具
安装常用工具:vim(编辑文件)、tree(目录树形展示)、tar(打包)、net-tools(网络工具)、rsync(同步)
[root@web1 ~]# yum install vim tree tar net-tools rsync -y
(6)替换yum源
CentOS 默认 YUM 源在国内访问较慢,替换为阿里源可加速软件下载:
# 第一步:修改自带yum配置文件,使其失效
[root@web1 ~]# cd /etc/yum.repos.d/
[root@web1 yum.repos.d]# cd ..
[root@web1 etc]# rm -rf yum.repos.d/
[root@web1 etc]# mkdir yum.repos.d
[root@web1 etc]# cd yum.repos.d/
#xftp上传配置文件
[root@web1 yum.repos.d]# ls
Centos-7.repo
[root@web1 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@web1 yum.repos.d]# yum makecache
[root@web1 yum.repos.d]# ls
Centos-7.repo epel.repo
三、服务部署
1.Web服务器部署
(1)防火墙专项配置(开放 Web 和备份端口)
Web 服务器需开放 HTTP 端口(供外部访问网站)和 rsync 端口(向备份服务器推送数据):
[root@web1 ~]# firewall-cmd --get-default-zone
public
# 开放HTTP服务
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-service=http
success
# 开放rsync端口(873端口,向backup推送备份数据)
[root@web1 ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
# 重新加载规则
[root@web1 ~]# firewall-cmd --reload
# 验证(应包含“http”和“873/tcp”)
[root@web1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client http mountd sshports: 873/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
(2)部署 Nginx Web 服务
[root@web1 ~]# yum install nginx -y > /dev/null && systemctl start nginx
[root@web1 ~]# systemctl status nginxActive: active (running) since 四 2025-08-07 18:24:12 CST; 22s ago
[root@web1 ~]# mkdir -p /www
[root@web1 ~]# cd /www
#xftp上传代码包(模拟实际业务)
[root@web1 www]# ls
sczl
[root@web1 www]# grep -n "/usr/share/nginx/html" /etc/nginx/nginx.conf
42: root /usr/share/nginx/html;
62:# root /usr/share/nginx/html;
# 定位到"root"配置行(默认第42行),替换为自定义目录
[root@web1 www]# sed -i '42s#/usr/share/nginx/html#/www/sczl#' /etc/nginx/nginx.conf
[root@web1 www]# systemctl enable --now nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@web1 www]# systemctl restart nginx
# 验证网站访问
[root@web1 www]# curl 192.168.120.131
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>FullPage</title>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<link type="text/css" rel="stylesheet" href="css/common.min.css" />
<link type="text/css" rel="stylesheet" href="css/font-awesome.css" />
<link rel="stylesheet" href="css/swiper-3.3.1.min.css">
<link rel="stylesheet" href="css/animate.min.css">
<link rel="stylesheet" href="css/style.css">
2.Nfs服务器部署
(1)防火墙专项配置(开放 NFS 和备份端口)
NFS 服务依赖 rpc-bind(端口 111)、mountd(动态端口)、nfs(端口 2049),需开放相关服务:
[root@nfs1 ~]# firewall-cmd --get-default-zone
public
# 开放rpcbind
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=rpc-bind
success
# 开放NFS
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=nfs
success
# 开放mountd
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-service=mountd
success
# 开放rsync端口
[root@nfs1 ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
[root@nfs1 ~]# firewall-cmd --reload
success
[root@nfs1 ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client mountd nfs rpc-bind sshports: 873/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
(2)部署 NFS 服务
[root@nfs1 ~]# yum install rpcbind nfs-utils -y
# 启动服务并设置开机自启,注意启动顺序
[root@nfs1 ~]# systemctl enable --now rpcbind
[root@nfs1 ~]# systemctl enable --now nfs-server
# 创建共享目录并添加测试数据
[root@nfs1 ~]# mkdir -p /nfsfile
[root@nfs1 ~]# echo "张德帅长的真帅!!!" > /nfsfile/zds
[root@nfs1 ~]# chmod -R 777 /nfsfile
[root@nfs1 ~]# cat /nfsfile/zds
张德帅长的真帅!!!
[root@nfs1 ~]# vim /etc/exports
# 说明:
# /nfsfile:共享目录;192.168.120.0/24:允许访问的网段;
# rw:读写权限;all_squash:将客户端用户映射为匿名用户;sync:同步写入磁盘(数据更安全)
/nfsfile 192.168.120.0/24(rw,all_squash,sync)
[root@nfs1 ~]# systemctl restart rpcbind
[root@nfs1 ~]# systemctl restart nfs-server# 在Web服务器验证NFS挂载(确保共享正常)
[root@web1 ~]# yum install nfs-utils -y
[root@web1 ~]# showmount -e 192.168.120.132
Export list for 192.168.120.132:
/nfsfile 192.168.120.0/24
[root@web1 ~]# mkdir /web_nfs
[root@web1 ~]# mount -t nfs 192.168.120.132:/nfsfile /web_nfs
[root@web1 ~]# ls /web_nfs/
zds
[root@web1 ~]# cat /web_nfs/zds
张德帅长的真帅!!!
3.backup服务器部署
(1)防火墙专项配置(开放接收备份和邮件端口)
备份服务器需接收 rsync 同步数据(873 端口),并通过 SMTPs 发送邮件(465 端口):
[root@backup ~]# firewall-cmd --get-default-zone
public
# 开放rsync端口(873,接收web01/nfs01的备份数据)
[root@backup ~]# firewall-cmd --permanent --zone=public --add-port=873/tcp
success
# 开放SMTPs端口(465,向QQ邮箱发送告警邮件)
[root@backup ~]# firewall-cmd --permanent --zone=public --add-port=465/tcp
success
[root@backup ~]# firewall-cmd --reload
success
[root@backup ~]# firewall-cmd --list-all
public (active)target: defaulticmp-block-inversion: nointerfaces: ens32 losources: services: dhcpv6-client sshports: 873/tcp 465/tcpprotocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
(2)部署 rsync 服务端(接收备份数据)
rsync 服务端负责接收 Web/NFS 服务器的备份数据,需配置用户、权限、共享目录:
① 配置 rsync 服务
[root@backup ~]# vim /etc/rsyncd.conf
#配置内容
uid = rsync # 运行rsync的用户(非root,更安全)
gid = rsync # 运行rsync的组
use chroot = no # 关闭安全限制(简化配置)
max connections = 200 # 最大连接数
timeout = 300 # 超时时间(秒)
pid file = /var/run/rsyncd.pid # 进程ID文件
lock file = /var/run/rsync.lock # 锁文件
log file = /var/log/rsyncd.log # 日志文件
fake super = yes # 允许非root用户处理文件权限 [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 # 密码文件路径
②初始化 rsync 服务
# 创建rsync用户(无需登录权限)
[root@backup ~]# useradd -M -s /sbin/nologin rsync
# 创建备份目录并修改属主
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync /backup
# 验证服务
[root@backup ~]# ps -ef | grep rsync
root 4037 1 0 19:02 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
root 4047 3325 0 19:02 pts/1 00:00:00 grep --color=auto rsync# 创建密码文件(格式:用户名:密码)
[root@backup ~]# echo "rsync:zds612612" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# systemctl enable --now rsyncd
四、备份实施
1.脚本开发
(1)配置web1备份脚本
①配置web1客户端本地备份脚本
- web服务器需要备份的目录:/var/log/nginx ; /www ; /var/spool/cron/root ;/etc/rc.local ; /server/scripts
[root@web1 ~]# mkdir -p /server/scripts
[root@web1 ~]# vim /server/scripts/backup.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:定期备份网络服务器中的数据
#版本:V1.0# 定义日期格式(如2025-08-06_Week03,Week01=周一)
Date=$(date +%F_Week0%w)
# 获取本机IP(需与网卡名匹配,此处为ens32)
Host_IP=$(ifconfig ens32 | awk '/broadcast/{print $2}')
# 本地备份目录
Backup_Dir="/backup/"
# 备份服务器IP
Backup_Server_IP=192.168.120.133# 若本地备份目录不存在则创建(按IP分目录)
[ ! -d $Backup_Dir/$Backup_Server_IP ] && mkdir -p $Backup_Dir/$Host_IP# 输出备份开始提示
echo ${Date}${Host_IP} "开始备份......"# 打包需备份的文件(分步骤确保完整性)
cd / &&\ # 切换到根目录,避免路径错误
# 打包定时任务配置(/var/spool/cron)
tar cf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz var/spool/cron &&\
# 追加开机自启配置(/etc/rc.d/rc.local)
tar rf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz etc/rc.d/rc.local &&\
# 追加脚本目录(/server/scripts)
tar rf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz server/scripts/ &&\
# 单独打包网站目录(/www)并压缩
tar zcf $Backup_Dir$Host_IP/www_${Date}_tar.gz www/ &&\
# 单独打包Nginx日志(/var/log/nginx)并压缩
tar zcf $Backup_Dir$Host_IP/nginx_log_${Date}_tar.gz var/log/nginx/ &&\# 生成MD5校验值(用于验证备份完整性)
find ${Backup_Dir:-/tmp} -type f -name "*${Date}_tar.gz*" | xargs md5sum > $Backup_Dir/$Host_IP/${Date}.flag# 推送备份到backup服务器(使用rsync协议)
rsync -az $Backup_Dir rsync@${Backup_Server_IP}::backup --password-file=/etc/rsync.password# 清理本地7天前的备份(避免磁盘占满)
find ${Backup_Dir:-/tmp} -type f -name "*.tar.gz" -a -name "*flag*" -mtime +7 | xargs rm -fecho "本地备份成功,备份文件已推送到备份服务器"
②配置 rsync 客户端认证(用于连接备份服务器)
Web 服务器作为 rsync 客户端,需配置密码文件以连接服务端:
[root@web1 ~]# vim /etc/rsync.password
# 客户端建立认证的文件密码如下:
zds612612
# 密码认证文件必须为600
[root@web1 ~]# chmod 600 /etc/rsync.password
③测试备份脚本
[root@web1 ~]# bash /server/scripts/backup.sh
2025-08-07_Week04192.168.120.131 开始备份......
本地备份成功,备份文件已推送到备份服务器#backup端操作
[root@backup ~]# cd /backup/
[root@backup backup]# ls
192.168.120.131
[root@backup backup]# tree 192.168.120.131/
192.168.120.131/
├── 2025-08-07_Week04.flag
├── F_week.flag
├── nginx_log_2025-08-07_Week04_tar.gz
├── nginx_log_F_week_tar.gz
├── sys_file_bak_2025-08-07_Week04_tar.gz
├── sys_file_bak_F_week_tar.gz
├── www_2025-08-07_Week04_tar.gz
└── www_F_week_tar.gz0 directories, 8 files
(2)配置nfs1备份脚本
- nfs1客户端主机需要打包备份的内容:/nfsfile/ ; /var/log/message文件;mount -l 挂载信息
①编写备份脚本
[root@nfs1 ~]# mkdir -p /server/scripts
[root@nfs1 ~]# vim /server/scripts/backup.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:定期备份nfs服务器中的数据
#版本:V1.0Date=$(date +%F_Week0%w)
Host_IP=$(ifconfig ens32 | awk '/broadcast/{print $2}')
Backup_Dir="/backup/"
Backup_Server_IP=192.168.120.133# 记录挂载信息(需备份)
mount -l > /var/log/mount.log[ ! -d $Backup_Dir/$Backup_Server_IP ] && mkdir -p $Backup_Dir/$Host_IPecho ${Date}${Host_IP} "开始备份......"# 打包NFS相关文件
cd / &&\
tar cf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz var/spool/cron &&\
tar rf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz etc/rc.d/rc.local &&\
tar rf ${Backup_Dir}${Host_IP}/sys_file_bak_${Date}_tar.gz server/scripts/ &&\
# 打包NFS共享目录
tar zcf $Backup_Dir$Host_IP/www_${Date}_tar.gz nfsfile/ &&\
# 打包挂载日志
tar zcf $Backup_Dir$Host_IP/nginx_log_${Date}_tar.gz var/log/mount.log &&\
# 生成MD5校验值
find ${Backup_Dir:-/tmp} -type f -name "*${Date}_tar.gz*" | xargs md5sum > $Backup_Dir/$Host_IP/${Date}.flag
# 推送备份到backup
rsync -az $Backup_Dir rsync@${Backup_Server_IP}::backup --password-file=/etc/rsync.password
# 清理本地7天前数据
find ${Backup_Dir:-/tmp} -type f -name "*.tar.gz" -a -name "*flag*" -mtime +7 | xargs rm -fecho "本地备份成功,备份文件已推送到备份服务器"
②配置 rsync 客户端认证(用于连接备份服务器)
[root@nfs1 ~]# echo "zds612612" > /etc/rsync.password
[root@nfs1 ~]# chmod 600 /etc/rsync.password
[root@nfs1 ~]# ll /etc/rsync.password
-rw------- 1 root root 10 8月 7 20:15 /etc/rsync.password
③测试备份脚本
[root@nfs1 ~]# bash /server/scripts/backup.sh
2025-08-07_Week04192.168.120.132 开始备份......
本地备份成功,备份文件已推送到备份服务器#backup端操作
[root@backup backup]# ls
192.168.120.131 192.168.120.132
[root@backup backup]# tree 192.168.120.132
192.168.120.132
├── 2025-08-07_Week04.flag
├── nginx_log_2025-08-07_Week04_tar.gz
├── sys_file_bak_2025-08-07_Week04_tar.gz
└── www_2025-08-07_Week04_tar.gz
2.校验告警
(1)编写旧数据清理脚本(/server/scripts/del_bak_data.sh)
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:清理旧备份:保留7天内所有数据+180天内每周一数据
#版本:V1.0Backup_Dir="/backup/"# 删除7天前的非周一数据(保留周一)
find ${Backup_Dir:-/tmp} -type f -name "*.tar.gz*" ! -name "*week01*" -o -name "*flag*" -mtime +7 | xargs rm -f# 删除180天前的所有数据(包括周一)
find ${Backup_Dir:-/tmp} -type f -name "*.tar.gz*" -name "*flag*" -mtime +180 | xargs rm -f
(2)验证数据完整性(/server/scripts/send_mail.sh)
- backup服务端针对客户端备份时的md5指纹数据,利用MD5命令进行验证,完成数据传输过程完整性验证。
[root@backup backup]# vim /server/scripts/send_mail.sh
#!/bin/bash#日期:2025-08-07
#作者:张德帅
#邮箱:3436804884@qq.com
#功能:验证备份完整性
#版本:V1.0Date=$(date +%F_Week0%w)
Backup_Dir="/backup/"
Check_log="/tmp/bak.log_$(date +%F)" # 验证日志
Admin_Mail=3436804884@qq.com # 管理员邮箱# 用MD5校验当天备份文件
find $Backup_Dir -type f -name "${Date}.flag" | xargs md5sum -c >> $Check_log# 发送邮件(若日志为空则提示错误)
if [ -n "cat $Check_log" ]
thenmail -s "$Date 备份数据信息" $Admin_Mail < $Check_log
elseecho "$Date 备份数据错误,请检查" > $Check_logmail -s "$Date 备份数据信息" $Admin_Mail < $Check_log
fi# 备份日志
cp $Check_log{,.ori} && > $Check_log
(3)配置邮件服务(基于 QQ 邮箱 SMTP)
[root@backup ~]# yum install mailx -y
[root@backup ~]# mkdir -p /root/.certs
[root@backup ~]# cd /root/.certs
[root@backup .certs]# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt[root@backup .certs]# vim /etc/mail.rc
# 最后一行后添加以下内容:
set from=3436804884@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=3436804884@qq.com
set smtp-auth-password=tf*********jge
set smtp-auth=login
set nss-config-dir=/root/.certs/
set ssl-verify=ignore #测试邮件
[root@backup .certs]# echo "testmail" | mail -s "testmail" 3436804884@qq.com
3.定时任务
(1)web服务器配置定时任务(每天 0 点自动备份)
[root@web1 ~]# crontab -e
* * * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1
[root@web1 ~]# crontab -l
* * * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1
[root@web1 ~]# systemctl enable --now crond
(2)web服务器配置定时任务(每天 0 点自动备份)
[root@nfs1 ~]# crontab -e
* * * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1
[root@nfs1 ~]# crontab -l
* * * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1
[root@nfs1 ~]# systemctl enable --now crond
(3)backup服务器配置定时任务(清理数据 + 发送邮件)
为了方便测试,我将每天八点发送邮件改为每分钟
[root@backup .certs]# crontab -e
# 每天0点执行清理脚本
0 0 * * * /bin/sh /server/scripts/del_bak_data.sh >/dev/null 2>&1
# 每分钟执行验证与邮件脚本
* * * * * /bin/sh /server/scripts/send_mail.sh >/dev/null 2>&1
(4)进入QQ邮箱查看
五、总结
在独自完成项目时,遇到了不少具体问题。比如 rsync 认证失败,排查后发现是密码文件权限未设为 600,调整权限至 600 后,客户端与备份服务器的同步才恢复正常;编写 web 备份脚本时,不仅变量名输入有误,还误将-type f写成-type -f,导致 find 命令无法正确匹配文件,修正语法后才顺利生成校验值。
另外,打包文件时出现tar: server/scripts:无法 stat的错误,经查是混淆了目录路径,实际脚本目录为/server/scripts却漏写了根路径,补全后解决;防火墙配置也多次出问题,像 mountd 服务未开放端口导致 NFS 挂载失败,通过firewall-cmd添加相关端口规则后,才确保服务间通信正常。最终通过逐一排查和修正,实现了全流程自动化备份与监控。