一、引言:为什么需要精通 rsync 选项?

在 Nginx 运维中,无论是多节点集群的静态资源同步、配置文件分发,还是网站数据的备份,rsync 几乎是每日必用的工具。然而,仅仅会用 rsync src dest 是远远不够的。

错误的选项组合可能导致

  • 同步后文件权限错乱,Nginx 无法读取。
  • 传输了大量无用的日志或临时文件,浪费带宽。
  • 目标目录积累了大量已删除的旧文件,占用磁盘空间。

本文将为你梳理 rsync 最核心、最常用的选项,并结合 Nginx 的典型应用场景,助你写出高效、安全、可靠的同步命令。


二、rsync 核心选项速查表

1. 基础模式:归档与详细输出

表格

选项 全称 功能说明
-a --archive 归档模式(最常用!)。这是一个“超级开关”,它等价于 -rlptgoD,即递归、保留软链接、权限、时间戳、属主、属组和设备文件。对于同步 Nginx 的 HTML、配置文件等,这是首选。
-v --verbose 详细模式。显示同步过程中的文件列表,便于调试和确认。

常用组合rsync -av

2. 性能优化:压缩与断点续传

选项 全称 功能说明
-z --compress 传输时压缩。在传输过程中对文件进行压缩,能显著减少网络流量,尤其适合文本文件(如 HTML, CSS, JS, conf)。但会增加 CPU 开销,对于已压缩的图片/视频效果不大。
-P --partial --progress 显示进度 + 断点续传--partial 保留部分传输的文件,--progress 显示实时传输进度。在同步大文件时非常有用。

常用组合rsync -avzP

3. 精确控制:镜像与过滤

选项 全称 功能说明
--delete 删除目标端多余文件。使目标目录成为源目录的严格镜像。例如,你在源端删除了一个旧的 JS 文件,使用此选项后,目标端的该文件也会被自动清理。慎用!确保你的源是“唯一可信源”。
--exclude 排除指定文件或目录。避免同步无用或敏感文件。可多次使用。
--include 包含匹配的文件。通常与 --exclude='*' 结合使用,实现“只同步特定类型文件”的需求。

Nginx 场景示例

# 同步静态资源,并排除 .git 和日志文件
rsync -avz --delete \
    --exclude='.git' \
    --exclude='*.log' \
    /local/deploy/html/ user@nginx-server:/var/www/html/

4. 安全与限制

选项 全称 功能说明
--dry-run -n 模拟运行。执行命令但不实际修改任何文件,仅显示将会发生什么。这是验证复杂命令是否正确的黄金法则
--bwlimit=KBPS 限速。限制 I/O 带宽,单位为 KB/s。防止同步任务占满服务器带宽,影响线上业务。例如 --bwlimit=5000 表示限速 5MB/s。
--max-size=SIZE 限制同步文件的最大大小。例如 --max-size=100M 可以避免意外同步超大文件。

三、Nginx 场景下的最佳实践组合

场景 1:同步前端构建产物到 Nginx 服务器

目标:将 dist/ 目录下的所有文件同步到 Nginx 的 root 目录,并保持严格的镜像关系。

rsync -avzP --delete \
    --exclude='.DS_Store' \
    --exclude='node_modules/' \
    ./dist/ \
    deploy_user@192.168.1.100:/var/www/myapp/
  • -a: 保留所有文件属性。
  • -vzP: 详细、压缩、显示进度。
  • --delete: 确保旧版本文件被清理。
  • --exclude: 过滤掉开发环境文件。

场景 2:分发 Nginx 配置文件

目标:将新的 nginx.conf 和 sites-enabled/ 下的配置同步到多台服务器。

# 使用 --dry-run 先预览
rsync -avn \
    --exclude='*.bak' \
    /etc/nginx/ \
    root@nginx-server:/etc/nginx/

# 确认无误后,去掉 -n 执行
rsync -av \
    --exclude='*.bak' \
    /etc/nginx/ \
    root@nginx-server:/etc/nginx/
  • 注意:同步配置文件后,必须在目标服务器上执行 nginx -t && systemctl reload nginx 来重载配置。

场景 3:备份 Nginx 日志(增量备份)

目标:每天将日志文件备份到远程存储,且只传输新增内容。

rsync -av \
    --backup \
    --backup-dir=/backup/logs/$(date +%Y%m%d) \
    /var/log/nginx/ \
    backup_user@backup-server:/archive/nginx-logs/
  • --backup: 如果目标文件已存在,则对其进行备份。
  • --backup-dir: 指定备份文件的存放目录,按日期组织。

四、一个至关重要的细节:路径末尾的斜杠 /

rsync 对路径末尾是否有 / 极其敏感,这决定了同步的行为:

  • 有斜杠 src/:同步的是 src/ 目录下的内容
    rsync -a /home/user/docs/ /backup/
    # 结果: /backup/file1.txt (直接在 backup 下)
  • 无斜杠 src:同步的是 src 这个目录本身
    rsync -a /home/user/docs /backup/
    # 结果: /backup/docs/file1.txt (在 backup 下创建 docs 目录)

✅ 黄金法则:当你想把 A 目录里的所有东西放进 B 目录里时,A 后面要加 /


五、总结

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐