用 rsync + SSH 密钥免密登录可实现秒级增量同步,关键在于预置公钥、使用绝对路径、添加 --delete -avz 参数及排除动态文件;需停用宝塔站点并确保跨云网络与防火墙配置正确。

用 rsync + SSH 密钥免密登录实现秒级同步
宝塔面板本身不提供跨服务器源码传输功能,直接在面板里点“上传”或“下载”只作用于本机。真要快,得绕过面板,用底层 rsync 配合预置的 SSH 密钥——实测 100MB 源码(含千级小文件)3 秒内完成增量同步。
关键不是“怎么传”,而是“怎么让每次传输都跳过认证和全量重传”:
- 目标服务器必须提前配置好 SSH 公钥登录(
~/.ssh/authorized_keys中已写入源服务器的公钥) - 源码路径统一用绝对路径,避免宝塔默认的
/www/wwwroot/xxx因用户权限导致rsync权限拒绝 - 务必加
--delete和-avz:前者保证目标与源严格一致,后者开启归档、压缩、保留权限时间戳
示例命令(在源服务器执行):
rsync -avz --delete -e "ssh -p 2222" /www/wwwroot/my-site/ user@192.168.3.5:/www/wwwroot/my-site/注意末尾斜杠——
/my-site/ 表示同步目录内容,/my-site(无斜杠)会把整个目录复制进去。
避免宝塔后台进程锁住文件导致 rsync 失败
宝塔的站点监控、防篡改、计划任务等模块可能对网站目录加文件锁或频繁读写,rsync 同步时容易报错 Permission denied 或卡在某个 .log 文件上。
不是关掉宝塔服务,而是精准规避:
- 同步前临时停用该站点:在宝塔面板 → 网站 → 找到站点 → 点击“停止”按钮(不是删,是停)
- 排除动态生成文件:用
--exclude跳过runtime/、cache/、logs/、.user.ini等非源码文件 - 别同步
.bt_backup目录——这是宝塔备份专用,跨服务器同步会污染目标备份列表
增强版命令:
rsync -avz --delete --exclude="runtime/" --exclude="cache/" --exclude="logs/" --exclude=".user.ini" -e "ssh -p 2222" /www/wwwroot/my-site/ user@192.168.3.5:/www/wwwroot/my-site/
不同云厂商服务器间 SSH 连通性问题怎么快速定位
阿里云/腾讯云/华为云默认安全组禁止非 22 端口入站,且部分厂商默认关闭 root 登录。同步失败时,先别调 rsync 参数,先确认基础链路通不通:
- 用
ssh -p 2222 user@192.168.3.5手动连——如果输密码才进得去,说明密钥没配对;如果直接 Connection refused,看目标服务器sshd_config的Port和PermitRootLogin - 检查源服务器能否解析目标 IP:
ping 192.168.3.5不通?不是网络问题,是私网 IP 跨云不可达——必须用公网 IP 或打通 VPC 对等连接 - 目标服务器防火墙(如
ufw或firewalld)是否放行了对应端口?sudo ufw status看一眼比猜强
为什么不用 scp 或 tar over ssh
scp 每次都是全量拷贝,没有增量逻辑;tar | ssh 虽快但无法校验一致性、不能跳过未修改文件、出错就中断重来。而 rsync 的核心优势在于“只传差量”:
- 首次同步走完整流程,后续哪怕只改了一个 CSS 文件,
rsync也只传那个文件,其他全部跳过 - 断点续传可靠:
rsync自带校验,传输中 Ctrl+C 再执行一次,它自动从断点继续 - 跨平台兼容好:Linux 之间、Linux 到 macOS 都能用同一套命令,不用装额外工具
真正容易被忽略的是:宝塔面板里“文件”功能看到的修改时间,可能和 rsync 实际对比的 mtime 不一致——因为某些宝塔插件会偷偷 touch 文件。所以首次部署后,建议在目标服务器手动跑一遍 rsync --dry-run 看输出,确认“sending incremental file list”下只有预期变更项,再正式执行。