上周朋友的一台低配云服务器因为宿主机硬件故障直接宕掉了,虽然后面厂商把磁盘救了回来,但也着实让人出了一身冷汗。我自己的几台小服务器平时挂着个人博客和几个自用小工具,数据虽然不多,但要是全都放在机器本地磁盘上,一旦机器出故障就彻底被动了。
趁着周末,我花了半个小时把宝塔里的网站目录和 MySQL 数据库统一配置了自动备份,数据会自动打包上传到远端对象存储。下面把配置思路和几处容易掉坑的细节记录一下,备忘的同时也给需要的朋友做个参考。
1. 存储桶准备与对应插件安装
对象存储市面上主流的几家都可以(腾讯云 COS、阿里云 OSS、七牛云,或者支持 S3 协议的 Cloudflare R2 等)。我这里用的是之前闲置的存储桶。
在对象存储控制台新建一个 Bucket(存储桶),权限切记设为私有读写,不要图省事开成公共读,免得数据库备份直接暴露在外网。
接着去宝塔面板的【软件商店】搜索对应的插件:
- 阿里云选“阿里云OSS”;
- 腾讯云选“腾讯云COS”;
- 其他自建 MinIO 或海外 S3 兼容存储可以直接搜“S3对象存储”。
安装好插件后打开设置界面,把云厂商给的 AccessKey、SecretKey、Bucket 名称和所属地域节点填进去,点击保存后列出文件列表,只要能正常刷新出来,就说明认证成功了。
2. 计划任务与备份策略设置
很多小内存 VPS(比如 1G 或 2G 内存的轻量机)如果在白天跑打包,CPU 和磁盘 I/O 很容易瞬间跑满,进而引发 Web 服务 502。因此备份时间和频次需要根据机器配置和数据更新频率来规划。
我目前的配置策略参考如下:
| 机器内存规格 | 备份对象 | 执行周期与时刻 | 远端保留份数 | 建议原因 |
|---|---|---|---|---|
| 1 核 1G / 2G | MySQL 数据库 | 每天 03:30 执行 | 15 份 | 数据文件小,打包极快,凌晨低峰期执行不影响访问 |
| 1 核 1G / 2G | 网站文件 | 每周一次(周日 04:30) | 3 份 | 静态文件变动少,频繁全量压缩会给低配机造成沉重 I/O 压力 |
| 2 核 4G 及以上 | MySQL 数据库 | 每天 02:00 / 14:00 各一次 | 30 份 | 机器资源充足,高频备份能最大程度降低数据丢失风险 |
| 2 核 4G 及以上 | 网站文件 | 隔天或每周两次(凌晨 03:00) | 5 份 | 保证附件与静态代码定期快照,兼顾存储成本 |
在宝塔的【计划任务】中添加任务时注意:把网站备份与数据库备份拆成两个独立的计划任务,并且执行时间至少错开半小时以上,避免系统同时执行两个高压力的 tar 压缩任务。
在任务界面的“备份到”一栏,选择刚刚绑定的对象存储插件,本地保留份数建议设为 1 份或 0 份(如果磁盘空间特别吃紧直接设 0,仅保留远端)。
3. 几个容易踩坑的细节
排除无用的缓存与日志目录
很多人直接把整个网站根目录一股脑打包,结果把几十万个临时缓存文件和动辄几个 G 的 access.log 全压进去了,不仅打包极慢,还容易导致脚本超时中断。 在网站备份设置里,一定要在排除规则中填上不需要的目录,例如:/runtime//cache//wp-content/cache/*.log
本地磁盘必须留有足够的缓冲空间
宝塔备份到远端对象存储的逻辑是:先在服务器本地/www/backup 目录打包生成 .tar.gz 压缩包,然后再调用 API 上传至对象存储,上传完毕后再删掉本地缓存。
如果你的网站文件有 5G,而服务器本地可用磁盘只剩下 2G,打包过程中磁盘就会被瞬间写满(100%),随之而来的就是 MySQL 宕机、系统进程异常崩溃。配置前一定要先去首页确认系统剩余磁盘空间。
定期检查任务日志与告警
任务跑完后,去计划任务右侧点击“日志”看一眼,确保看到类似上传成功、已删除本地临时文件 的提示。如果配置了宝塔的消息通道(微信/钉钉/邮箱),可以顺手把任务失败告警勾上,避免备份断了一个月自己还毫无知觉。
4. 容灾恢复的验证
“没有经过恢复验证的备份,等于没有备份。” 这是运维里的一句老话。
全部设置好之后,手动执行一次备份任务,去对象存储后台把生成的 .sql.gz 和打包文件下载回本地,解压看一看 SQL 文件是否完整、表结构是否正常,或者在本地测试环境尝试还原一下。确认文件有效之后,这套自动容灾体系才算真正落了地。