一、項目總覽
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添加相關端口規則后,才確保服務間通信正常。最終通過逐一排查和修正,實現了全流程自動化備份與監控。