必须在upstream块内显式配置zone指令才能实现多worker共享后端状态,语法为zone name size;,需搭配max_fails/fail_timeout或health_check才生效,修改后须nginx -s reload。

要在 Nginx 的 stream 模块中实现多个 worker 进程间共享后端状态(比如健康标记、连接数、哈希映射),必须在 upstream 块内显式配置 zone 指令。它不是可选优化,而是启用跨进程同步的强制前提。
zone 指令必须写在 upstream 块内部
zone 只在 stream { upstream { ... } } 结构中生效,不能放在 server 或全局 stream 块里。语法固定为:
-
zone name size;,例如zone mysql_zone 64k; -
name是自定义标识符,只能含字母、数字、下划线,不能有句点或特殊符号 -
size推荐从64k起步;后端节点多于 10 个时建议设为1m,太小会触发 warning,太大则浪费内存 - Nginx 版本必须 ≥ 1.9.0;Windows 原生版不支持,需用 WSL2 + Linux 环境
共享内容不止是“是否宕机”
这块共享内存承载的是整个 upstream 组的运行时上下文,包括:
- 每台
server的实时状态(up/down/unavail)、失败次数、上次失败时间 -
least_conn所需的各后端当前活跃连接数 -
hash或ip_hash类算法的会话绑定映射(确保同一客户端始终落到同一后端) -
slow_start阶段的权重爬升进度
必须搭配基础健康机制才实际生效
仅加 zone 不会自动识别故障,还需明确配置探测逻辑:
- 设置
max_fails和fail_timeout,否则节点即使持续不可达也不会被标记为down - 若 upstream 中只有一个 server,这两个参数会被忽略,该节点永不标记为不可用
- 使用
health_check(如health_check interval=5s fails=2 passes=2 port=3306;)能更主动感知 TCP 层连通性 -
proxy_next_upstream的重试行为也依赖 zone 中的状态,超时值建议按地域调优(如跨洲访问设为 3s,同区域压至 1s)
典型 stream upstream 配置示例
以下是一个可用于 MySQL 集群负载均衡的完整片段:
stream {
upstream mysql_cluster {
zone mysql_zone 64k;
least_conn;
server 192.168.5.10:3306 weight=3;
server 192.168.5.11:3306 weight=3;
server 192.168.5.12:3306 backup;
health_check interval=5s fails=2 passes=2 port=3306;
}
server {
listen 3306;
proxy_pass mysql_cluster;
}
}
注意:修改 zone 配置后必须执行 nginx -s reload(非 restart),避免新旧 worker 争抢共享内存;多个 upstream 块可共用同一 zone 名称,但 size 只需在第一个中声明。











