1. 项目说明
该项目共分为2个子项目,由环境搭建和实施备份两部分组成 该项目旨在复习巩固系统服务部署使用、shell编程等知识。
2. 项目背景知识
2.1. 总体需求
某企业里有一台Web服务器,里面的数据很重要,但是如果硬盘坏了数据就会丢失,现在领导要求把数据 做备份,这样Web服务器数据丢失在可以进行恢复 要求如下: 每天00点整在Web服务器上按日期打包备份系统配置文件、网站程序目录及访问日志文件 通过rsync命令推送到备份服务器上保存 备份服务器定时清除旧记录 搭建邮件告警平台
2.2. 备份需求
所有服务器的备份目录必须都为/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把备份成功或失败结果信息发送到系统管理员邮箱里。
任务清单
1. 项目环境搭建 可以使用iventoy网启安装3台centos7.9服务器 按照规划,最小化部署系统,关闭防火墙,禁用SELinux,确保能够联网。
2. 服务器部署
2.1. Web服务器搭建部署 验证Rsync服务能否推送成功。 开发脚本实现打包备份、推送、校验、删除。 配置定时任务每天0点定时推送(0时是时间的一个分割点)。
2.2. NFS服务器搭建部署 验证Rsync服务能否推送成功。 开发脚本实现打包备份、推送、校验、删除。 配置定时任务每天0点定时推送(0时是时间的一个分隔点)。 配置脚本和web服务器类似,过程略。
2.3. 搭建备份服务器 rsync服务器搭建部署。 开发脚本实现校验、删除、报警。 配置实时任务每天6点实时执行。 配置告警邮件发送平台
关闭防火墙和selinux,设置主机名,设置静态ip

重启服务
配置完基本的内容后进行虚拟机的镜像克隆
并更改静态ip(nfs01 192.168.47.138 backup 192.168.47.139)
web01服务器环境搭建
更换yum源并下载安装包
yum install vim tree tar net-tools rsync nfs-utils -y
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum install epel-release -y
yum install nginx -y
mkdir -p /www/sczl
cd /www/sczl
下载nginx是要先下载epel-release依赖
使用xftp将web01源文件上传至/www/sczl 并解压缩
vim /etc/nginx/nginx.conf # 修改第42行之后的路径
42 root /www/sczl;
systemctl start nginx
systemctl enable nginx
重启服务并测试打开windows端浏览器输入服务端IP地址
nfs01服务器环境搭建
更换yum源并下载安装包
yum install vim tree tar net-tools rsync -y
检查
部署共享存储,nfs01为服务端,web01为客户端
更换yum源并下载安装包
yum install rpcbind -y
yum install nfs-utils -y
mkdir /nfsfile
echo "welcome to www.openlab.com" > /nfsfile/readme
chmod -Rf 777 /nfsfile
vim /etc/exports # 编辑nfs配置文件,添加如下内容
/nfsfile 192.168.88.0/24(rw,sync,all_squash)
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
编辑nfs01配置文件,添加内容
/nfsfile 192.168.88.0/24(rw,sync,all_squash)
web01客户端操作:
showmount -e 192.168.47.138
mkdir /web_nfs
mount -t nfs 192.168.47.139:/nfsfile /web_nfs
cd /web_nfs
ls
cd ~
vim /etc/fstab # 永久挂载
192.168.88.201:/nfsfile /web_nfs nfs defaults 0 0
mount -a
df -h
backup服务器环境搭建
更换yum源并下载安装包
yum install vim tree tar net-tools rsync mailx -y
创建rsync账户及共享目录并修改目录属主为rsync
开机并启动服务
vim /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 # 日志文件
fake super = yes # 无需rsync以root身份运行,允许接受数据
[backup]
path = /backup # 目录
ignore errors # 有错误时忽略
read only = false # 可读可写
list = false # 阻止远程列表
hosts allow = 192.168.88.0/24 # 允许IP
hosts deny = 0.0.0.0/32 # 禁止IP
auth users = rsync # 用于认证的账户
secrets file = /etc/rsync.password # 存放用户和密码的文件
创建rsync虚拟账户名和密码,并赋予密码文件600权限
useradd -M -s /sbin/nologin rsync
mkdir /backup
chown -R rsync /backup
systemctl enable –now rsyncd
ps -ef | grep rsync
root 1333 1 0 15:09 ? 00:00:00 /usr/bin/rsync –daemon –no-detach
root 1335 1261 0 15:09 pts/0 00:00:00 grep –color=auto rsync
echo "rsync:rsync123" > /etc/rsync.password
chmod 600 /etc/rsync.password
配置备份脚本
配置web01客户端本地备份脚本
web01客户端主机需要打包备份的内容
tree /var/log/nginx # 日志
tree /www # 网站主数据
以及定时任务和备份脚本源文件 :/var/spool/cron/root、/etc/rc.local、/server/scripts
编写备份web01服务器的脚本
mkdir /backup
mkdir -p /server/scripts
vim /server/scripts/backup.sh
#!/bin/bash
# Date:2025-8-8
# Author:zy
# Mail:zy@126.com
# Function: Regularly backup data from web servers
# Version: V1.0
Date=$(date +%F_Week0%w) # 定义时间方式
Host_IP=$(ifconfig ens32 | awk '/inet / {print $2}') # 获取IP,注意网卡名
Backup_Dir="/backup/" # 本地备份路径
Backup_Server_IP=192.168.88.202 # 备份服务器的IP
# 创建指定目录和IP的目录
[ ! -d $Backup_Dir/$Host_IP ] && mkdir -p $Backup_Dir/$Host_IP
# 输出提示信息
echo ${Date} ${Host_IP} start backup ……
# 按要求打包备份所有本地重要文件
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/ &&\\
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" -a -name "*flag*" -mtime +7|xargs rm -f
echo "Local backup successful, the backup files have been pushed to the backup server"
vim /etc/rsync.password # 客户端建立认证的文件密码如下:
rsync123 # 注意:只写密码
chmod 600 /etc/rsync.password # 密码认证文件必须为600
测试
bash /server/scripts/backup.sh
在backup服务器中可以看到推送的数据
ls /backup/192.168.88.200/
配置nfs01客户端本地备份脚本
nfs01客户端主机需要打包备份的内容:
tree /nfsfile/ # 共享目录数据
/nfsfile/
└── readme
以及/var/log/message文件、mount -l 挂载信息
编写备份nfs01服务器的脚本
mkdir /backup
mkdir -p /server/scripts
vim /server/scripts/backup.sh
#!/bin/bash
# Date:2025-8-8
# Author:zy
# Mail:zy@126.com
# Function: Regularly backup data from nfs servers
# Version: V1.0
Date=$(date +%F_Week0%w) # 定义时间方式
Host_IP=$(ifconfig ens32 | awk '/inet / {print $2}') # 获取IP,注意网卡名
Backup_Dir="/backup/" # 本地备份路径
Backup_Server_IP=192.168.88.202 # 备份服务器的IP
mount -l > /var/log/mount.log # 挂载日志
# 创建指定目录和IP的目录
[ ! -d $Backup_Dir/$Host_IP ] && mkdir -p $Backup_Dir/$Host_IP
# 输出提示信息
echo ${Date} ${Host_IP} start backup ……
# 按要求打包备份所有本地重要文件
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/ &&\\
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" -a -name "*flag*" -mtime +7|xargs rm -f
echo "Local backup successful, the backup files have been pushed to the backup server"
vim /etc/rsync.password # 客户端建立认证的文件密码如下:
rsync123 # 注意:只写密码
chmod 600 /etc/rsync.password # 密码认证文件必须为600
测试
在backup服务器中可以看到推送的数据
ls /backup/
配置定时任务
web01服务器编辑定时任务,实现每天00:00定时备份本地数据,并推送到Rsync服务器上
systemctl status crond
crontab -e # 添加:
00 00 * * * /bin/sh /server/scripts/backup.sh >/dev/null 2>&1
nfs01服务器过程同上
systemctl status crond
crontab -e # 添加:
00 00 * * * /bin/sh /server/scripts/backup.sh >/dev/null 2>&1
backup服务器编写脚本,实现删除180天前的所有备份数据,但保存每周一的
mkdir -p /server/scripts
cd /server/scripts/
vim /server/scripts/del_bak_data.sh
#!/bin/bash
# Date:2025-8-8
# Author:zy
# Mail:zy@126.com
# Function: Delete all backup data from 180 days ago, but save every Monday
# Version: V1.0
Backup_Dir="/backup/"
# 删除7天前的压缩包和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
# 注意:Backup_Dir:-/tmp表示检查环境变量 Backup_Dir 是否已设置。如果设置了,就使用其值;如果没有设置,就使用默认值 /tmp
backup服务器配置定时任务,实现服务端180天前数据自动删除
crontab -e
# crond-id-003:data backup
00 00 * * * /bin/sh /server/scripts/del_bak_data.sh >/dev/null 2>&1
数据传输完整性验证与监控告警
验证数据完整性
backup服务端针对客户端备份时的md5指纹数据,利用MD5命令进行验证,完成数据传输过程完整性验证。
vim send_mail.sh
#!/bin/bash
# Date:2025-8-8
# Author:zy
# Mail:zy@126.com
# Function: Verify the integrity of backup files
# Version: V1.0
Date=$(date +%F_Week0%w)
Backup_Dir="/backup/"
Check_Log="/tmp/bak.log_$(date +%F)" # 定时检查备份结果的文件
Admin_Mail=17674044@qq.com # 管理员邮箱
find $Backup_Dir -type f -name "${Date}.flag"|xargs md5sum -c >> $Check_Log
if [ -n "cat $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{,.ori} && > $Check_Log
配置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
vim /etc/mail.rc
# 最后一行后添加以下内容:
set from= 2359025274@qq.com
set smtp=smtps://smtp.qq.com:465 # ssl端口默认465
set smtp-auth-user= 2359025274@qq.com
set smtp-auth-password=sggthegnldmoebjd
set smtp-auth=login
set nss-config-dir=/root/.certs/ # 设置证书路径
set ssl-verify=ignore # 启用加密ssl传输in
测试邮件服务
echo "testmail" | mail -s "testmail" 2359025274@qq.com
bash /server/scripts/send_mail.sh
评论前必须登录!
注册