nginx 本身不支持静态文件实时同步,需借助外部工具实现:① rsync + sersync(推荐,秒级同步);② 共享存储挂载(如 nfs/minio);③ ci/cd 批量分发(适合规范发布)。

Nginx 本身不提供静态文件实时同步能力,它只是一个反向代理和 Web 服务器,不能自动把一个节点上的文件变化“广播”给其他节点。所谓“通过 Nginx 实现静态文件实时同步”,实际是指:在 Nginx 集群环境中,借助外部工具协同 Nginx 工作,让所有 Nginx 节点的静态资源目录内容保持一致。核心思路是“Nginx 读本地,变更靠外力同步”。
下面分三种主流、可落地的方式说明:
✅ 推荐方案:rsync + sersync(适合中小规模集群)
sersync 基于 inotify 监控文件系统事件,能精准捕获新增、修改、删除操作,并只触发对应文件的 rsync 同步,效率高、延迟低(秒级)。
-
部署要点:
- 在主发布机(如 CI/CD 服务器或某台 Nginx)安装
sersync+rsync+inotify-tools - 配置
sersync.xml,指定监控目录(如/var/www/html)、目标 IP 列表、rsync 参数(含--delete保证一致性) - 所有目标 Nginx 节点需开通 rsync SSH 免密登录(或配置 rsync daemon)
- 启动
sersync -d -r -o /path/to/conf.xml
- 在主发布机(如 CI/CD 服务器或某台 Nginx)安装
-
优势:
- 不依赖共享存储,各节点仍独立读取本地文件,性能好
- 变更即同步,无定时轮询开销
- 支持排除
.git、.log等非静态文件
? 替代方案:共享存储挂载(适合云环境或强一致性要求)
把静态资源统一存放在 NFS、MinIO 或对象存储(如 OSS/S3),所有 Nginx 节点挂载同一路径(如 /data/static),直接读取。
-
配置要点:
- Nginx 的
root或alias指向挂载路径,例如:location /static/ { alias /data/static/; expires 1h; } - 确保挂载参数启用
hard,intr,noac(NFS)或使用 fuse 客户端(对象存储) - 需做好存储高可用与网络稳定性保障(避免单点故障或 IO 卡顿)
- Nginx 的
-
注意:
- 多节点并发写入仍需业务层规避(静态资源通常只由发布流程写入,不建议运行时修改)
- 文件元数据(如 mtime)在某些挂载方式下可能不同步,影响
if-modified-since判定
⚙️ 运维友好方案:CI/CD + 批量分发(适合有发布规范的团队)
将静态资源纳入 Git 版本管理,每次构建后通过 Ansible、Fabric 或简单 shell 脚本,用 rsync 批量推送到所有 Nginx 节点。
-
典型流程:
- 构建产物生成
dist/目录 - 执行分发脚本:
for host in web1 web2 web3; do rsync -avz --delete dist/ $host:/var/www/html/ done
- 可结合健康检查,失败节点自动告警或重试
- 构建产物生成
-
适用场景:
- 发布频率不高(如每日 1–3 次)
- 需要版本回滚、审计追溯
- 网络策略限制 SSH/rsync 直连,但允许跳板机操作
不复杂但容易忽略。











