Nginx负载均衡采用策略模式实现,通过函数指针ngx_http_upstream_init_peer_t抽象调度逻辑,支持轮询、加权轮询、IP hash等算法动态切换,新增算法无需修改主流程。

Nginx 的负载均衡不是靠硬编码实现的,而是通过策略模式(Strategy Pattern)在核心模块中动态切换算法逻辑。这种设计让 upstream 模块既能保持接口统一,又能灵活支持轮询(round-robin)、加权轮询、IP hash、最少连接(least_conn)、随机(random)等多种策略,且新增算法无需修改调度主流程。
upstream 模块中的策略抽象:ngx_http_upstream_init_peer_t
Nginx 将“选择后端服务器”这一行为抽象为函数指针类型 ngx_http_upstream_init_peer_t,定义在 src/http/ngx_http_upstream.h 中:
- 每个负载均衡算法在初始化 upstream 时,会注册自己的
init函数(如ngx_http_upstream_init_round_robin); - 该函数负责构建并挂载具体的
get和free回调(即真正选节点和释放节点的逻辑); - 后续请求调度时,Nginx 统一调用
pc->get(...),不感知具体算法——这是策略模式的核心体现。
轮询策略的典型实现:ngx_http_upstream_rr_peer_data_t
以默认的 round-robin 为例,其数据结构 ngx_http_upstream_rr_peer_data_t(定义于 src/http/ngx_http_upstream_round_robin.h)封装了:
-
peers:指向所有后端节点数组及权重信息; -
current:当前轮询位置(实现“下一个可用节点”的游标); -
tries:重试次数限制(配合失败重试机制); -
get回调内部按需跳过失效节点、处理权重、更新游标,最终返回一个ngx_peer_connection_t*。
算法注册与配置解析的联动
Nginx 在解析 upstream {...} 块时,根据指令(如 least_conn、hash $remote_addr consistent)触发不同初始化函数:
-
ngx_http_upstream_least_conn→ 注册ngx_http_upstream_init_least_conn; -
hash指令 → 调用ngx_http_upstream_init_hash,构造一致性哈希环; - 所有初始化函数最终都设置
us->peer.init指向各自的init_peer实现,并将算法上下文(如rrp或hash结构体)存入us->peer.data。
运行时调度:一次请求中的策略执行链
当 worker 进程处理一个请求并进入 upstream 阶段时,调度流程为:
- 调用
us->peer.init(r, &us->peer)初始化本次请求的 peer 上下文; - 循环调用
pc->get(pc, r)获取可用后端(可能多次,直到成功或耗尽 tries); - 若失败,调用
pc->free(pc, r, state)通知算法标记节点异常或调整状态; - 整个过程对上层透明,仅依赖函数指针和数据结构约定。

















