本文约 2,649 字,预计阅读 7 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:备份和源数据一起没了,是最常见的备份失败
硬盘损坏、服务器被删除、账号被入侵、机房故障——这些场景的共同点是:本地备份一并完蛋。
所以异地不是”加分项”,而是备份的必要条件。业界通用的 3-2-1 原则就是为此设计的。
原理分析:3-2-1 原则
3 份副本(原始 + 2 份备份)
2 种不同介质(本地磁盘 + 对象存储)
1 份异地(不同物理位置 / 不同服务商)
在 WordPress 场景中,一个务实的落地方案是:
| 副本 | 位置 | 介质 | 更新频率 |
|---|---|---|---|
| 原始数据 | 站点服务器 | 云盘 | — |
| 副本 1 | 服务器本地备份目录 | 同盘或挂载盘 | 每日 |
| 副本 2 | 对象存储(OSS/COS/S3) | 异地 | 每日 |
| 副本 3(可选) | 另一台服务器或网盘 | 异地 | 每周 |
注意:副本 1(服务器本地)不算真正的”异地”,它的价值是恢复速度快,真正的保障是副本 2。
保姆级实操
第一步:选择异地存储
| 方案 | 成本 | 速度 | 可靠性 | 适用 |
|---|---|---|---|---|
| 对象存储(OSS/COS/S3) | 低(几分钱/GB/月) | 快 | 极高(11 个 9) | 首选 |
| 另一台云服务器 | 中 | 快 | 高 | 有多台机器时 |
| 网盘(Google Drive/OneDrive) | 低 | 中 | 取决于服务商 | 小站点 |
| FTP/SFTP 到异地 | 低 | 中 | 取决于对方 | 有现成空间时 |
| 本地 NAS / 外接硬盘 | 一次性 | 慢 | 中 | 个人站点 |
对象存储是最推荐的:便宜、可靠、支持生命周期规则(自动归档/删除)。
第二步:创建私有存储桶
以阿里云 OSS 为例:
- 创建 Bucket,读写权限选 私有;
- 开启服务端加密(可选);
- 设置生命周期规则:30 天后转低频存储,90 天后转归档,365 天后删除。
绝对不要设为公共读——备份里有数据库账号、用户邮箱、密码哈希。
用命令行验证权限:
ossutil stat oss://my-wp-backup/db-2026-10-10.sql.gz
# 应显示 ACL: private
第三步:加密备份
即使存储桶是私有的,也建议加密数据库备份:
# 对称加密
gpg --symmetric --cipher-algo AES256 --output db-2026-10-10.sql.gz.gpg db-2026-10-10.sql.gz
或用 openssl:
openssl enc -aes-256-cbc -pbkdf2 -in db.sql.gz -out db.sql.gz.enc -pass file:/root/.bkpass
密钥管理是关键:
- 不要把密钥和备份放一起;
- 用密码管理器保存;
- 密钥丢失 = 备份丢失,要有备份密钥的备份。
第四步:自动上传脚本
#!/usr/bin/env bash
# /usr/local/bin/offsite-backup.sh
set -euo pipefail
BK="/backup/db"
BUCKET="oss://my-wp-backup/db"
LOG="/var/log/offsite-backup.log"
# 同步新增备份到对象存储
rclone copy "$BK" remote:wp-backup/db --include "*.sql.gz" --log-file="$LOG"
RC=$?
if [ $RC -ne 0 ]; then
curl -s "https://告警webhook" -d "text=异地备份同步失败"
exit 1
fi
# 清理 30 天前的异地备份(依赖生命周期规则可省略)
rclone delete remote:wp-backup/db --min-age 30d
crontab:
30 4 * * * /usr/local/bin/offsite-backup.sh
第五步:定期验证异地备份可用
# 下载最近一份并导入测试库
rclone copy remote:wp-backup/db/db-2026-10-10.sql.gz /tmp/
mysql -e "CREATE DATABASE wp_verify;"
gunzip < /tmp/db-2026-10-10.sql.gz | mysql wp_verify
mysql -e "SELECT COUNT(*) FROM wp_verify.wp_posts;"
mysql -e "DROP DATABASE wp_verify;"
建议每月做一次,并记录到运维日志。
第六步:访问控制
- 存储桶的访问密钥要最小权限:只用子账号,只授予该 Bucket 的写入权限;
- 不要把 AccessKey 提交进 Git;
- 定期轮换密钥。
# 检查脚本里是否泄露密钥
grep -rn "LTAI\|AKIA\|SecretId" /root/*.sh /usr/local/bin/*.sh
常见踩坑与失败案例
- Bucket 设成公共读 —— 备份被搜索引擎收录或被扫描器下载,数据库账号泄露。创建后立刻检查 ACL。
- 案例:某公司把数据库备份放在 Web 可访问目录,且开启了目录列表,被扫描器抓走全部用户数据。备份文件必须放在 Web 根目录之外。
- 加密后丢失密钥 —— 见过最无奈的事故。密钥要单独保管,且至少要两份。
- 异地同步静默失败 —— 密钥过期、网络不通、rclone 配置丢失。必须有告警。
- 成本失控 —— 每日全量同步大体积备份会产生流量和存储费用。用增量同步(
rclone copy默认只传新文件)+ 生命周期规则控制。 - 只同步不验证 —— 同步日志显示成功,但文件是 0 字节。校验文件大小。
总结
异地备份的落地顺序是:选对象存储开私有 Bucket → 加密备份 → 自动同步 → 失败告警 → 每月验证。三条纪律:备份绝不放 Web 可访问目录;存储桶必须私有;密钥与备份分开保管。这套做下来,即使整台服务器被删除,你也能在半小时内从异地恢复——这才是备份真正的意义。
