搬瓦工 VPS Rsync 远程文件同步备份教程
Rsync 是 Linux 系统上最经典、最可靠的文件同步工具,内置于几乎所有 Linux 发行版中。它使用增量传输算法,只传输源文件和目标文件之间的差异部分,在带宽有限的情况下效率极高。Rsync 通过 SSH 隧道加密传输数据,安全可靠。本教程将介绍如何在搬瓦工 VPS 上使用 Rsync 建立完善的远程备份方案。
一、Rsync 核心特性
- 增量传输:基于 rolling checksum 算法,只传输文件变化的部分。
- SSH 加密:默认通过 SSH 协议加密传输,无需额外配置。
- 保留属性:完整保留文件权限、所有者、时间戳、软链接等元数据。
- 带宽限制:支持限速传输,避免占满服务器带宽。
- 断点续传:支持
--partial参数实现断点续传。
二、基本用法
# 本地目录同步
rsync -avz /opt/app/ /backup/app/
# 推送到远程服务器
rsync -avz /opt/app/ user@remote-server:/backup/app/
# 从远程服务器拉取
rsync -avz user@remote-server:/opt/app/ /backup/app/
# 参数说明:
# -a 归档模式(等同于 -rlptgoD),保留所有文件属性
# -v 详细输出
# -z 传输时压缩数据
三、常用参数组合
# 完整备份命令(推荐)
rsync -avzP --delete \
--exclude='*.log' \
--exclude='node_modules' \
--exclude='.git' \
--exclude='__pycache__' \
-e "ssh -p 22 -i /root/.ssh/id_ed25519" \
/opt/app/ \
backup-user@backup-server:/backup/vps-app/
# 参数说明:
# -P 显示进度并支持断点续传(等同于 --partial --progress)
# --delete 删除目标中源不存在的文件(镜像同步)
# --exclude 排除匹配的文件或目录
# -e 指定远程 shell 命令(可设置 SSH 端口和密钥)
四、带宽限制与性能优化
# 限速传输(单位 KB/s)
rsync -avz --bwlimit=5000 /opt/app/ user@remote:/backup/app/
# 使用更快的压缩算法
rsync -avz -e "ssh -c aes128-gcm@openssh.com" /opt/app/ user@remote:/backup/
# 大量小文件优化
rsync -avz --no-compress --whole-file /opt/many-small-files/ user@remote:/backup/
五、排除规则文件
cat > /opt/rsync/excludes.txt <<'EOF'
*.log
*.log.*
*.tmp
*.swp
*.cache
.git/
node_modules/
__pycache__/
vendor/
.env
*.pid
EOF
rsync -avzP --exclude-from=/opt/rsync/excludes.txt \
/opt/app/ user@remote:/backup/app/
六、快照式备份(硬链接)
# 使用 --link-dest 创建空间高效的快照备份
DEST="/backup/snapshots/$(date +%Y-%m-%d_%H%M)"
LATEST="/backup/snapshots/latest"
rsync -avz --delete \
--link-dest="$LATEST" \
/opt/app/ "$DEST/"
# 更新 latest 软链接
rm -f "$LATEST"
ln -s "$DEST" "$LATEST"
使用硬链接,未变化的文件不占用额外空间,每个快照目录看起来都是完整的备份。
七、自动化备份脚本
cat > /opt/rsync/backup.sh <<'EOF'
#!/bin/bash
set -euo pipefail
REMOTE="backup-user@backup-server"
REMOTE_DIR="/backup/vps"
SSH_KEY="/root/.ssh/id_ed25519"
EXCLUDES="/opt/rsync/excludes.txt"
LOG="/var/log/rsync-backup.log"
LOCK="/tmp/rsync-backup.lock"
# 防止重复运行
exec 200>"$LOCK"
flock -n 200 || { echo "备份正在进行中" >> "$LOG"; exit 0; }
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"; }
log "开始 Rsync 备份"
# 备份数据库
docker exec postgres pg_dumpall -U postgres > /tmp/db-dump.sql 2>/dev/null
log "数据库导出完成"
# 执行 Rsync 同步
rsync -avz --delete \
--exclude-from="$EXCLUDES" \
--bwlimit=10000 \
-e "ssh -i $SSH_KEY -o StrictHostKeyChecking=accept-new" \
/opt/app/ /var/www/ /etc/nginx/ /tmp/db-dump.sql \
"$REMOTE:$REMOTE_DIR/" 2>> "$LOG"
rm -f /tmp/db-dump.sql
log "Rsync 备份完成"
EOF
chmod +x /opt/rsync/backup.sh
echo "0 3 * * * /opt/rsync/backup.sh" | crontab -
八、Rsync 守护进程模式
# 在备份服务器上配置 rsyncd
cat > /etc/rsyncd.conf <<'EOF'
uid = nobody
gid = nogroup
use chroot = yes
max connections = 4
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[backup]
path = /backup
comment = VPS Backup
read only = no
auth users = backup_user
secrets file = /etc/rsyncd.secrets
hosts allow = your-vps-ip
EOF
echo "backup_user:backup_pass_2026" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
systemctl enable --now rsync
九、常见问题
Permission denied 错误
确认 SSH 密钥权限正确(600),且目标目录对备份用户可写。
chmod 600 /root/.ssh/id_ed25519
ssh -i /root/.ssh/id_ed25519 backup-user@backup-server "ls -la /backup/"
传输中断后恢复
# 使用 --partial 和 --append-verify 续传大文件
rsync -avz --partial --append-verify /opt/large-file user@remote:/backup/
总结
Rsync 是 Linux 上最可靠的文件同步备份工具,配合 crontab 可以建立稳定的定时备份方案。如果需要实时同步,可以参考 Lsyncd 教程;需要加密去重备份,推荐 Restic 或 BorgBackup。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,购买链接:bwh81.net。