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