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

要让 Nginx 多个 worker 进程共享同一套 upstream 后端状态(比如谁健康、谁刚失败、当前连接数多少),必须显式配置 upstream 块内的 zone 指令。不加 zone,每个 worker 都各自维护一套独立状态,互相不可见——这是同步失效的根本原因。
zone 指令是开启共享内存的唯一开关
它不是可选项,而是强制前提:
- 语法必须写在
upstream块内部,格式为:zone name size;,例如zone backend_zone 64k; -
name是自定义标识符(如backend_zone),不能含点号或特殊字符 -
size指定共享内存大小,常见值为64k(2–5 个后端节点够用)或1m(节点多或启用了ip_hash等映射时建议) - Nginx 1.9.0 及以上版本才支持;Windows 原生版不支持,会报错“zone directive is not supported”
共享内存里实际存什么
这块内存不是只记“up/down”,而是承载整个 upstream 组的运行时上下文:
- 每台
server的实时状态(up/down/unavail)、失败次数、上次失败时间 -
least_conn所需的各后端当前活跃连接数 -
ip_hash或hash $arg_key的客户端绑定映射关系(确保不同 worker 对同一 IP 总选同一台后端) -
slow_start阶段中权重的动态爬升进度
光有 zone 不会自动标记故障节点
必须配合基础健康机制,状态才能真正更新和传播:
- 必须为每个
server设置max_fails和fail_timeout,否则即使节点失联,Nginx 也不会将其置为down - 若
upstream中只有一个server,这两个参数会被忽略,该节点永不标记为不可用 -
proxy_next_upstream的重试逻辑也依赖 zone 中的实时状态,建议按地域调优超时值(如亚洲用户访问美国节点设为3s)
典型配置与验证要点
一个可用的 upstream 示例:
upstream backend {<br> zone backend_zone 64k;<br> least_conn;<br> server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;<br> server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;<br>}
注意事项:
- 多个
upstream块可共用同一zone名称,但size只需在第一个中指定 - 修改
zone配置后必须执行nginx -s reload(不是restart),避免新旧 worker 争抢共享内存 - 可通过日志变量
$pid和$upstream_addr压测验证:同一客户端 IP 在不同 worker 下是否始终转发到相同后端


















