网站备份的重要性
如果你有“为什么要备份”的疑问,那么你应该庆幸没有遇到过服务器存储介质损毁的灾难。
网站的备份是非常必要的,尽管你的 VPS 服务商如何宣传他们服务器的稳定性,你都不能完全信赖,否则一旦出现故障你就会丢掉所有数据,亲身经历过给大家的忠告。。。
常见的动态网站一般包含:网站文件、数据库、Nginx/Apache配置文件,只要备份好这几样东西,即使服务器没了也能恢复。
使用宝塔面板的朋友可以添加任务计划自动备份网站和数据库,没有用宝塔等面板管理服务器的可以接着往下看。
实现思路
编写一个 Shell 脚本并定时执行,将网站文件、数据库、Nginx/Apache配置文件打包为压缩文件,然后通过 SCP 传输到其它 VPS 存储,或者使用 NAS 定时多版本存储备份文件。
方案一:备份到 NAS
如果你有群晖 NAS,建议使用本方案,如果没有 NAS 并计划备份到其它 VPS 服务器,可以根据方案二操作。
1.创建脚本存放目录
mkdir ~/auto_backup && cd ~/auto_backup
2.编写脚本文件
nano backup_website.sh
写入代码:
#!/bin/bash
# 定义网站备份文件存放目录
wwwroot_backup_dir="/root/auto_backup/data/wwwroot"
# 定义数据库备份文件存放目录
db_backup_dir="/root/auto_backup/data/database"
# 定义 Nginx 配置文件的备份存放目录
nginx_backup_dir="/root/auto_backup/data/nginx"
# 定义站点 Nginx 配置文件的备份存放目录
sitesconf_backup_dir="/root/auto_backup/data/nginx/sites-available"
# 网站根目录上层路径
www_root="/www/wwwroot"
# 网站根目录名称
site_name_1="iknow.nicvos.com"
site_name_2="blog.nicvos.com"
# 数据库名称、用户和密码
db_1="www_nicvos_com"
db_1_user="www_nicvos_com"
db_1_passwd="1234567890"
db_2="blog_nicvos_com"
db_2_user="blog_nicvos_com"
db_2_passwd="1234567890"
# Nginx 站点配置文件路径
nginx_site_config_1="/etc/nginx/sites-available/iknow.nicvos.com.conf"
nginx_site_config_2="/etc/nginx/sites-available/blog.nicvos.com.conf"
# Nginx 主配置文件路径
nginx_main_config="/etc/nginx/nginx.conf"
# 获取当前日期时间
current_time="$(date +%Y%m%d-%H%M)"
# 判断网站备份文件存放的目录是否存在
if [ -d "$wwwroot_backup_dir" ]; then
# 清空目录内的文件
rm -rf "$wwwroot_backup_dir"/*
else
# 创建目录
mkdir -p "$wwwroot_backup_dir"
fi
# 判断数据库备份文件存放的目录是否存在
if [ -d "$db_backup_dir" ]; then
# 清空目录内的文件
rm -rf "$db_backup_dir"/*
else
# 创建目录
mkdir -p "$db_backup_dir"
fi
# 判断站点 Nginx 配置文件的备份存放目录是否存在
if [ -d "$sitesconf_backup_dir" ]; then
# 清空目录内的文件
rm -rf "$nginx_backup_dir"/*
else
# 创建目录
mkdir -p "$sitesconf_backup_dir"
fi
# 备份网站目录为 zip 压缩包,使用网站名称和当前时间命名。
zip -q -r "$wwwroot_backup_dir/$site_name_1-$current_time.zip" "$www_root/$site_name_1"
# 检查命令是否执行成功
if [ $? -eq 0 ]; then
echo "$current_time 备份 $site_name_1 网站目录成功"
else
echo "$current_time 备份 $site_name_1 网站目录失败"
fi
zip -q -r "$wwwroot_backup_dir/$site_name_2-$current_time.zip" "$www_root/$site_name_2"
# 检查命令是否执行成功
if [ $? -eq 0 ]; then
echo "$current_time 备份 $site_name_2 网站目录成功"
else
echo "$current_time 备份 $site_name_2 网站目录失败"
fi
# 导出数据库为 sql 文件,使用数据库名称和当前时间命名
mysqldump -u $db_1_user -p$db_1_passwd $db_1 > "$db_backup_dir/$db_1-$current_time.sql"
# 检查命令是否执行成功
if [ $? -eq 0 ]; then
echo "$current_time 备份 $db_1 数据库成功"
else
echo "$current_time 备份 $db_1 数据库失败"
fi
mysqldump -u $db_2_user -p$db_2_passwd $db_2 > "$db_backup_dir/$db_2-$current_time.sql"
# 检查命令是否执行成功
if [ $? -eq 0 ]; then
echo "$current_time 备份 $db_2 数据库成功"
else
echo "$current_time 备份 $db_2 数据库失败"
fi
# 备份 Nginx 配置文件
cp $nginx_main_config $nginx_backup_dir
# 备份站点 Nginx 配置文件
cp $nginx_site_config_1 $sitesconf_backup_dir
cp $nginx_site_config_2 $sitesconf_backup_dir
以上脚本的原理:通过变量定义需要备份的站点目录、数据库、Nginx配置文件以及备份文件存放的目录,每次备份前会清空备份文件存放的目录,然后执行各项备份命令。
备份前清空备份文件存放的目录的原因:群晖 NAS 支持多版本备份,为了避免重复备份所以 VPS 不保留旧的备份文件。
3.安装 zip 压缩工具
apt install -y zip
4.首次运行脚本
bash ~/auto_backup/backup_website.sh
执行脚本后,检查是否成功备份:
# 检查网站目录是否被分别压缩为zip压缩包
ls /root/auto_backup/data/wwwroot
# 检查数据库是否被导出为 SQL 文件
ls /root/auto_backup/data/database
# 检查 Nginx 主配置文件是否备份成功
ls /root/auto_backup/data/nginx
# 检查站点 Nginx 配置文件是否备份成功
ls /root/auto_backup/data/nginx/sites-available
5.配置定时任务
crontab -e
在 crontab 文件底部添加一行代码:
# 每天 01:00 运行脚本备份 Nginx 配置文件、网站数据、数据库,输入结果到 backup_website.log。
0 1 * * * bash /root/auto_backup/backup_website.sh > /root/auto_backup/backup_website.log 2>&1
6.群晖 NAS 创建备份任务
群晖 ActiveBackupforBusiness 套件备份 VPS 的方法见下文:
备份模式:多版本
备份文件夹:/root/auto_backup
任务名称:VPS 数据备份
本地路径:/ActiveBackupforBusiness/VPS数据备份
启用计划:每天/02:00
保留策略:保留过去 30 天内的所有版本
方案二:备份到其它 VPS
这个方案我用不到,所以还没写适用的脚本,太困了先不写了,有需要的朋友可以留言让我加急写脚本~
4 条评论
博客咋自动跳转到知识库了?
老戴,我把域名给换过来啦,最近忙没来得及通知
寒山博客:nicvos.com
寒山的知识库:iknow.nicvos.com
nice!
水文一篇,还没写完整