落叶的心思的博客

一个记录与折腾的小站

用 rsync 在本地 NAS 自动备份远程网站和数据库

发布时间:

发布者:

分类:

阅读数:

46

点赞数:

0

阅读时长预计:

5 分钟

前言

今天突然想起来,我的网站在本地一直没备份。虽然服务器每天都有定时备份,但谁也不知道哪天会炸。每次手动下载备份又太麻烦,于是我就想起了 rsync。
干脆用它把远程备份自动同步到本地 NAS,这样就不用每天动手了。今天就把整个过程写出来,算是给各位站长分享一下。

当然啦,每个人的习惯和环境都不一样,你完全可以用其他方法来备份网站和数据库。我这里分享的只是我自己使用的一种方式,也比较适合我自己的 NAS 环境。大家可以参考我的,也可以根据自己的需求去调整,完全不必拘泥于我的方法。

第一步:前提条件

  1. 本地 NAS 已安装 rsync 和 ssh。
  2. 远程服务器也安装了 rsync 和 SSH 服务。
  3. 拥有远程服务器的 SSH 登录权限。
  4. 远程网站服务器上已经备份好网站文件和数据库
  5. 假设要备份的路径:
    • 网站文件:/www/backup/site/example.com/
    • 数据库备份:/www/backup/database/mysql/blog/
  6. 本地 NAS 存储路径:
    • 网站:/volume1/backup/site/
    • 数据库:/volume1/backup/database/

第二步:配置 SSH 无密码登录

2.1 在本地 NAS 生成 SSH Key

ssh-keygen -t ed25519 -f ~/.ssh/id_rsync

解释:

  • -t ed25519:使用 ed25519 算法,安全且短小
  • -f ~/.ssh/id_rsync:指定密钥文件名
  • 回车选择空密码即可
    生成后会有:
  • 私钥:~/.ssh/id_rsync
  • 公钥:~/.ssh/id_rsync.pub

2.2 将公钥拷贝到远程服务器

假设 SSH 用户为 root,端口为 21222:

ssh-copy-id -i ~/.ssh/id_rsync.pub -p 21222 root@remote.server.com

测试无密码登录:

ssh -i ~/.ssh/id_rsync -p 21222 root@remote.server.com

如果不需要输入密码,说明配置成功。

第三步:测试 rsync 命令

3.1 备份网站

rsync -avz --delete -e "ssh -i ~/.ssh/id_rsync -p 21222" \
root@remote.server.com:/www/backup/site/example.com/ \
/volume1/backup/site/

解释:

  • -avz:归档模式 + 详细输出 + 压缩
  • –delete:删除本地不存在的远程文件
  • -e “ssh -i …”:指定 SSH 私钥和端口
  • 后面两个路径:远程源 → 本地目标

3.2 备份数据库

rsync -avz --delete -e "ssh -i ~/.ssh/id_rsync -p 21222" \
root@remote.server.com:/www/backup/database/mysql/blog/ \
/volume1/backup/database/

第四步 :方式 A:写自动化脚本 + crontab

4.1 创建脚本

nano /home/user/backup_site.sh
#!/bin/bash

set -e  # 遇错立即退出
exec >> /home/user/rsync_backup.log 2>&1  # 所有日志写到文件

# 备份网站
/usr/bin/rsync -avz --delete \
-e "ssh -i /home/user/.ssh/id_rsync -p 21222" \
root@remote.server.com:/www/backup/site/example.com/ \
/volume1/backup/site/

# 备份数据库
/usr/bin/rsync -avz --delete \
-e "ssh -i /home/user/.ssh/id_rsync -p 21222" \
root@remote.server.com:/www/backup/database/mysql/blog/ \
/volume1/backup/database/

exit 0

给脚本执行权限:

chmod +x /home/user/backup_site.sh

4.2 添加 cron 定时任务

crontab -e

添加:

0 3 * * * /home/user/backup_site.sh
  • 每天凌晨 3 点执行
  • 日志写入 /home/user/rsync_backup.log

第五步:方式 B:直接在 crontab 写命令

打开 crontab:

crontab -e

添加两行:

0 3 * * * /usr/bin/rsync -avz --delete -e "ssh -i /home/user/.ssh/id_rsync -p 21222" root@remote.server.com:/www/backup/site/example.com/ /volume1/backup/site/ >> /home/user/rsync_backup.log 2>&1
30 3 * * * /usr/bin/rsync -avz --delete -e "ssh -i /home/user/.ssh/id_rsync -p 21222" root@remote.server.com:/www/backup/database/mysql/blog/ /volume1/backup/database/ >> /home/user/rsync_backup.log 2>&1
  • 第一行:网站备份
  • 第二行:数据库备份,错开半小时
  • 日志记录到同一个文件
    不写脚本也能实现自动化备份。

第六步:查看日志

cat /home/user/rsync_backup.log

可以看到文件传输列表和大小,确认备份是否成功。

第七步:小技巧(可选)

数据库备份按日期命名,避免覆盖:

DATE=$(date +"%Y%m%d")
rsync -avz -e "ssh -i ~/.ssh/id_rsync -p 21222" \
root@remote.server.com:/www/backup/database/mysql/blog/db_blog_$DATE.sql.gz \
/volume1/backup/database/

脚本可以随时手动运行测试:

/home/user/backup_site.sh

set -e 保证出错立即停止,方便排查问题。

总结

  • 配置 SSH Key 免密码登录
  • 使用 rsync 增量备份网站和数据库
  • 可选择脚本方式或直接 cron 方式
  • 日志记录清晰,方便查看
  • 可选按日期命名,避免覆盖

转载声明:

转载此文章请注明出处。

若本文内容侵犯了您的权益,请通过本站下方邮箱与我联系,我会尽快处理,谢谢!

分享到:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注