rsync 是轻量高效下发 nginx 配置的方案,核心是精准推送与权限/一致性保障;需满足配置目录同步、节点结构一致、控制机可执行等前提,配合 ssh 免密、最小化 sudo 和校验机制确保安全稳定。

rsync 本身不是配置管理工具,但它在多机 Nginx 集群中快速下发统一配置文件时,是非常轻量、高效且可控的方案。关键不在于“复杂功能”,而在于“精准推送 + 权限/一致性保障”。
明确目标与前提
你要同步的是 /etc/nginx/ 或其子目录(如 /etc/nginx/conf.d/),不是整个系统;所有目标节点已安装 Nginx,且结构一致;你有一台可执行 rsync 的“控制机”(如 CI 服务器或运维跳板机)。
核心操作:单条命令完成全量下发
在控制机上执行:
rsync -avz --delete --rsync-path="sudo rsync" \ -e "ssh -p 22" \ /etc/nginx/ \ user@192.168.1.101:/etc/nginx/ \ user@192.168.1.102:/etc/nginx/ \ user@192.168.1.103:/etc/nginx/
- -avz:归档模式+详细输出+压缩传输
- --delete:确保目标与源完全一致,删掉目标上源里没有的文件(防残留旧配置)
-
--rsync-path="sudo rsync":因 Nginx 配置需写入
/etc/nginx/,目标机需允许该用户免密 sudo 执行 rsync(比直接用 root 更安全) - -e "ssh -p 22":指定 SSH 端口,可按需调整
- 多个目标地址连续列出,rsync 会逐个推送(无需循环脚本)
必须配套的安全与可用性措施
仅靠一条命令不够稳定,还需三项基础准备:
-
SSH 免密登录:在控制机生成密钥对,公钥部署到所有 Nginx 节点的
~user/.ssh/authorized_keys,并限制命令权限(如command="sudo rsync --server...") -
sudo 权限最小化:目标节点的
/etc/sudoers中添加一行:user ALL=(ALL) NOPASSWD: /usr/bin/rsync --server --sender * -
配置校验机制:推送后加一句校验,例如:
for h in 192.168.1.101 192.168.1.102; do ssh $h "nginx -t 2>/dev/null && echo OK || echo FAIL"; done
进阶建议:避免手工重复,小步自动化
把上面逻辑封装成简单脚本,比如 push-nginx-conf.sh:
#!/bin/bash
CONF_DIR="/etc/nginx"
NODES=("192.168.1.101" "192.168.1.102" "192.168.1.103")
USER="deploy"
rsync -avz --delete --rsync-path="sudo rsync" -e "ssh -o StrictHostKeyChecking=no" \
"$CONF_DIR/" "${USER}@${NODES[0]}:$CONF_DIR/" \
"${USER}@${NODES[1]}:$CONF_DIR/" \
"${USER}@${NODES[2]}:$CONF_DIR/"
echo "Reloading nginx on all nodes..."
for node in "${NODES[@]}"; do
ssh "$USER@$node" "sudo nginx -s reload 2>/dev/null"
done
运行 ./push-nginx-conf.sh 即完成“修改→推送→重载”闭环,无需人工干预每台机器。











