必须启用upstream_zone模块并配置zone指令,通过共享内存使所有worker进程同步后端状态(如健康状况、连接数、哈希映射等),否则各worker状态隔离;需配合max_fails和fail_timeout才能触发自动故障标记。

要让 Nginx 多个 worker 进程共享同一套 upstream 后端节点状态(比如谁健康、谁刚失败、当前连接数多少),核心就是启用 upstream_zone 模块并正确配置 zone 指令。它不是锦上添花的选项,而是解决状态隔离问题的必要基础设施。
为什么必须加 zone?
默认情况下,每个 worker 进程各自维护一份 upstream 状态——彼此完全隔离。一个 worker 把某台后端标记为 down,其他 worker 一无所知,仍可能把新请求发过去,造成服务中断或超时。加了 zone,所有 worker 才能读写同一块共享内存,真正实现状态同步。
-
zone必须显式声明,没有默认值;不写就等于没开启共享 - 仅支持 Nginx 1.9.0 及以上版本
- Windows 原生 Nginx 不支持该功能,需迁移到 WSL2 + Linux 环境
zone 共享内存里存什么?
这块共享内存不只是记录“是否宕机”,而是承载整个 upstream 组的运行时上下文:
- 每个
server的实时状态(up/down/unavail)、失败计数(max_fails)、上次失败时间 -
least_conn算法依赖的各后端当前活跃连接数 -
ip_hash或hash算法所需的会话绑定映射关系(确保不同 worker 对同一客户端 IP 总选同一台后端) -
slow_start阶段中权重的动态爬升进度
怎么配才生效?
光有 zone 不足以自动发现故障,还需配合基础健康机制才能触发状态更新:
- 在
upstream块内写:zone backend_zone 64k;(名称自定义,大小建议从 64k 起,节点多可设为 1m) - 必须搭配
max_fails和fail_timeout,否则即使某节点连续失败,也不会被自动标记为down - 若使用
proxy_next_upstream,它的重试逻辑也依赖 zone 中的实时状态,建议按地域调优超时值(如亚洲用户访问美国节点设为 3s,欧洲内部可压到 1s)
跨机器集群怎么办?
如果部署的是多台 Nginx 实例组成的集群(非单机多 worker),仅靠 zone 不够,需要更高级的同步能力:
- NGINX Plus 或企业版提供
ngx_stream_zone_sync_module,支持多节点间双向推送/拉取 zone 数据 - 通过
zone_sync_server声明对端地址,用zone_sync_interval控制同步频率(默认 1s) - 支持 TLS 加密同步(
zone_sync_ssl on),证书、CA、SNI 等参数均可配置











