rsync 增量发布是什么场景
用 rsync 把构建产物或配置目录同步到多台服务器,是小型集群最常见的发布方式:它只传差异块,几台机器几秒钟就能同步完成,还能用 --delete 让远端与源目录严格一致。风险也集中在这个选项上——它会删除目标端所有多余文件,路径写错或结尾斜杠位置不对,可能一次性清空站点根目录。稳妥流程永远是先用演练模式核对清单,再正式同步,最后逐台复核。
基本信息
| 适用平台 | Linux、macOS(两端都需安装 rsync) |
|---|---|
| 场景 | 多机增量发布与目录同步 |
| 常用流程 | 演练预览、正式同步、逐台复核 |
| 关键选项 | -a 归档 -z 传输压缩 --delete 删除目标端多余文件 --exclude 排除项 |
| 斜杠语义 | 源路径结尾有斜杠同步目录内容,没有则同步目录本身 |
| 最大风险 | --delete 用错路径会清空目标目录 |
典型使用场景
- 把前端构建产物同步到多台 Web 服务器,保持各机版本一致。
- 更新配置目录,同步后用远程执行命令触发服务重载。
- 首次同步新目录先不加删除选项试跑,确认路径无误再加固。
- 把本地备份目录镜像到远端存储,保留删除语义以保持完全一致。
- 批量分发证书或静态资源到多台机器。
安全发布流程
安全发布流程
rsync -avn --delete /var/www/app/dist/ web1:/var/www/app/dist/ | head -40 # 先演练
rsync -avn --delete /var/www/app/dist/ web2:/var/www/app/dist/ | head -40
rsync -avz --delete --exclude '.env' /var/www/app/dist/ web1:/var/www/app/dist/
rsync -avz --exclude '.env' /var/www/app/dist/ web1:/var/www/app/dist/ # 首次不加删除
for h in web1 web2; do
rsync -avz --delete /var/www/app/dist/ $h:/var/www/app/dist/ || echo "$h 失败"
done
ssh web1 'ls -l /var/www/app/dist/index.html' # 逐台复核产物
ssh web1 'sha256sum /var/www/app/dist/index.html' # 与本地摘要比对选项与写法对照
| 选项或写法 | 作用 | 使用要点 |
|---|---|---|
| -a | 归档模式 | 保留权限、属主与时间戳 |
| -z | 传输压缩 | 文本类产物收益明显,已压缩文件收益有限 |
| -n 演练 | 只打印不写入 | 发布前必做的第一步 |
| --delete | 删除目标端多余文件 | 首次上线不要加,确认路径后再考虑 |
| --exclude | 排除指定模式 | 环境文件与上传目录要显式排除 |
| 结尾斜杠 | 影响同步语义 | 带斜杠同步内容,不带则同步目录本身 |
源路径结尾斜杠是发版事故高发点:带斜杠表示把目录内容同步到目标目录里,不带斜杠表示在目标里再建一层同名目录,两者结果差别很大,动手前用演练模式确认。
用 --exclude 保护不该被覆盖的内容:用户上传目录、环境变量文件、运行期生成的缓存。这些排除项最好固化进发布脚本,而不是每次临时手写。
多机发布要逐台复核结果:一台成功一台失败的半完成状态比全失败更难排查。脚本里应显式判断每台的退出码,失败就中止后续步骤并保留现场。