Nginx多个worker进程共享upstream状态的核心是upstream块内必须配置zone指令,如zone backend_zone 64k,它启用共享内存以同步健康状态、连接数和哈希映射,且仅Nginx 1.9.0+支持。

要让 Nginx 多个 worker 进程共享 upstream 后端节点状态(比如健康标记、连接数、哈希映射),核心就是正确配置 upstream 块内的 zone 指令。它不是可选项,而是启用跨进程同步的必要前提。
zone 指令必须显式声明且位置固定
默认情况下,每个 worker 进程各自维护一份 upstream 状态,互不感知。加了 zone 才能打通隔离:
- 必须写在
upstream块内部,语法为:zone name size; -
name是自定义标识符(如backend_zone),不能含点号或特殊字符 -
size指定共享内存大小,常见值如64k或1m;太小会报 warning,太大则浪费资源 - Nginx 1.9.0 及以上版本才支持;Windows 原生版不支持,会提示
"zone" directive is not supported on this platform
共享内存里实际存什么
这个 zone 不只是记“谁挂了”,而是承载整个 upstream 组的运行时上下文:
- 每台
server的实时状态(up/down/unavail)、失败计数、上次失败时间 -
least_conn所需的各后端当前活跃连接数 -
ip_hash或hash $arg_key consistent的会话绑定映射关系 -
slow_start阶段的权重爬升进度
必须配合基础健康机制才真正生效
光有 zone 不会自动标记故障节点,还需搭配:
-
max_fails和fail_timeout参数,否则即使某节点失联,Nginx 也不会将其置为down - 若 upstream 中只有一个 server,这两个参数会被忽略,该节点永不标记为不可用
-
least_conn、ip_hash等算法只有在 zone 存在时,才能保证所有 worker 计算结果一致 - NGINX Plus 的 API(如
/api/6/http/upstreams/backend)读取的正是这个 zone 中的数据
典型配置与验证要点
一个可用的 upstream 示例:
upstream backend {
zone backend_zone 64k;
least_conn;
server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
}
注意事项:
- 多个 upstream 块可共用同一 zone 名称,但
size只需在第一个中指定 - 修改 zone 配置后必须执行
nginx -s reload(不是 restart),避免新旧 worker 争抢共享内存 - 可通过日志 +
$pid和$upstream_addr字段压测验证:同一客户端 IP 在不同 worker 下是否始终转发到相同后端


















