网站备份的重要性

如果你有“为什么要备份”的疑问,那么你应该庆幸没有遇到过服务器存储介质损毁的灾难。

网站的备份是非常必要的,尽管你的 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

这个方案我用不到,所以还没写适用的脚本,太困了先不写了,有需要的朋友可以留言让我加急写脚本~

Last modification:December 31, 2023
If you think my article is useful to you, please feel free to appreciate