自动化备份全网服务器数据平台
目录
项目说明
总体需求
某企业里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了数据就会丢失,现在领导要求把数据做备份,这样Web服务器数据丢失在可以进行恢复 要求如下:
- 每天00点整在Web服务器上按日期打包备份系统配置文件、网站程序目录及访问日志文件
- 通过rsync命令推送到备份服务器上保存
- 备份服务器定时清除旧记录
- 搭建邮件告警平台
备份需求
- 所有服务器的备份目录必须都为/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连接
- 支持匿名传输。
语法
标准结构:
rsync [选项] 源目录/文件 目标目录/文件-a, --archive:归档模式,保留所有文件属性。-v, --verbose:详细输出。-r, --recursive:递归地同步目录。-z, --compress:使用压缩传输数据,可以减少网络带宽。-e, --rsh=COMMAND:指定远程 shell 程序(例如 SSH)。--delete:删除目标中不在源中的文件。--exclude=PATTERN:排除符合指定模式的文件或目录。本地同步:
rsync -a source destination# -a包含-r的递归功能同时可以同步修改时间、权限等元信息远程同步:
# 默认使用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个冒号增量备份:
# 只复制变动的内容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源
# 彻底关闭防火墙systemctl stop firewalldsystemctl disable firewalld# 关闭selinuxvim /etc/selinux/config # 修改SELINUX=disabled# 修改主机名hostnamectl set-hostname web01reboot# 重做yum源,使用阿里云镜像仓库yum clean all && yum makecache# 安装所需软件yum install nano tree tar net-tools rsync nfs-utils nginx -y部署网站示例:
mkdir /www# 使用ftp工具将sczl示例网站上传至www目录下,结构如下
修改nginx配置文件,部署网站:
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 oknginx: configuration file /etc/nginx/nginx.conf test is successful# 启动nginx服务systemctl start nginxsystemctl enable nginx
# 使用windows浏览器打开192.168.88.128,有网页显示,则正常# 本地自测:[root@web01 ~]# curl -I 192.168.88.128:80HTTP/1.1 200 OKServer: nginx/1.21.5Date: Sun, 28 Jun 2026 08:40:25 GMTContent-Type: text/htmlContent-Length: 91358Last-Modified: Sun, 28 Jun 2026 08:28:38 GMTConnection: keep-aliveETag: "6a40db36-164de"Accept-Ranges: bytesnfs服务器环境搭建
同上需要确保关闭防火墙和selinux,设置主机名,配置yum源(略过) 部署共享存储: nfs01为服务端,web01为客户端 nfs01服务端操作:
# 安装软件yum install rpcbind nfs-utils -y# 创建并配置共享目录mkdir /nfsfileecho "welcome to www.openlab.com" > /nfsfile/readmechmod -Rf 777 /nfsfilevim /etc/exports# 添加如下内容/nfsfile 192.168.88.0/24(rw,sync,all_squash)# 启动服务systemctl start rpcbindsystemctl enable rpcbindsystemctl start nfs-serversystemctl enable nfs-serverweb01客户端操作:
# 显示服务端共享目录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]lsreadme# 实现永久挂载vim /etc/fstab# 添加:192.168.88.129:/nfsfile /web_nfs nfs defaults 0 0# 重新加载挂载项,并查看mount -adf -h# 示例输出:[root@web01 web_nfs]df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 4.0M 0 4.0M 0% /devtmpfs 1.7G 0 1.7G 0% /dev/shmtmpfs 676M 17M 659M 3% /runtmpfs 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% /boot192.168.88.129:/nfsfile 35G 2.6G 30G 8% /web_nfsbackup服务器环境搭建
同上需要确保关闭防火墙和selinux,设置主机名,配置yum源(略过) 修改rsync配置文件:
nano /etc/rsyncd.conf# 修改文件,内容如下
uid = rsyncgid = rsyncuse chroot = nomax connections = 200timeout = 300pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog 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 rsyncmkdir /backupchown -R rsync /backup
# 启动服务,设计开机自启systemctl enable --now rsyncd
# 创建rsync虚拟账户名和密码,并赋予密码文件600权限echo "rsync:rsync123" > /etc/rsync.passwordchmod 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)# 获取IPHost_IP=$(ifconfig ens32 | awk '/inet / {print $2}')# 本地备份路径Backup_Dir="/backup/"# 备份服务器的IPBackup_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 "本地备份成功,备份文件已推送到备份服务器"vim /etc/rsync.password# 只写入密码 rsync123
# 修改权限为600chmod 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)# 获取IPHost_IP=$(ifconfig ens32 | awk '/inet / {print $2}')# 本地备份路径Backup_Dir="/backup/"# 备份服务器的IPBackup_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 "本地备份成功,备份文件已推送到备份服务器"vim /etc/rsync.password# 只写入密码 rsync123
# 修改权限为600chmod 600 /etc/rsync.password
# ----- 测试 -----bash /server/scripts/backup.sh# 成功输出[root@nfs01 ~] bash /server/scripts/backup.sh2026-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.gzmount_logs_2026-07-01_Week03.tar.gz sys_rc_local_bak_2026-07-01_Week03.tar.gznfs__2026-07-01_Week03.tar.gz sys_scripts_bak_2026-07-01_Week03.tar.gz配置定时任务
web01与nfs01服务器编辑定时任务,实现每天00:00定时备份本地数据,并推送到Rsync服务器上
# 安装crontabsyum install crontabs# 编辑定时服务crontab -e
# 写入如下信息00 00 * * * /bin/sh /server/scripts/backup.sh > /dev/null 2>&1backup服务器编写脚本,实现删除180天前的所有备份数据,但保存每周一的
# 创建目录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/bashDate=$(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"配置邮件告警
# 安装邮件服务yum install mailx -y
# 配置qq邮箱ssl证书mkdir -p /root/.certscd /root/.certsecho -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crtcertutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crtcertutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crtcertutil -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:465set smtp-auth=loginset smtp-auth-user=4866*****@qq.comset smtp-auth-password=vmo**********idfset ssl-verify=ignore测试邮件服务:
echo "testmail" | mail -s "testmail" 4866*****@qq.combash /server/scripts/send_mail.sh当邮箱出现testmai和类似于2026-07-02_Week04 backup data info的邮件则成功。 至此自动化备份全网服务器数据平台项目配置结束。