6 种算法原理 · 流程图解 · 交互演示 · 配置示例
| 算法 | 指令 | 核心原理 | 会话保持 | 适用场景 |
|---|---|---|---|---|
| 轮询 | (默认) |
按顺序依次分配 | ❌ | 服务器性能一致 |
| 加权轮询 | weight=N |
按权重比例分配 | ❌ | 服务器性能不同 |
| IP Hash | ip_hash |
客户端 IP 哈希映射 | ✅ | 需要会话保持 |
| 最少连接 | least_conn |
分配给当前连接数最少的服务器 | ❌ | 长连接/请求耗时差异大 |
| 随机 | random |
随机选择后端服务器 | ❌ | 均匀分配,简单场景 |
| 通用 Hash | hash $key |
自定义 key 哈希映射 | ✅ | 自定义路由规则 |
按照 upstream 中定义的服务器顺序,依次将每个新请求分配给下一台服务器。到达列表末尾后,从头开始循环。
这是最简单的负载均衡算法,不需要任何额外配置,Nginx 默认即使用此算法。
Nginx 使用平滑加权轮询 (Smooth Weighted Round-Robin) 算法。
每轮选择前,每台服务器的 currentWeight += effectiveWeight,然后选出 currentWeight 最大的服务器,被选中的服务器 currentWeight -= totalWeight。
这样保证:权重越高的服务器被选中越频繁,同时分配平滑均匀,不会出现连续集中分配的情况。
权重比例 5 : 3 : 1 → 请求分配比例
对客户端 IPv4 地址的前三个八位组(或整个 IPv6 地址)进行哈希运算:
hash = hash(IP前3段) % server_count
同一 IP 的请求永远映射到同一台后端服务器,实现会话保持(Session Affinity)。
real_ip 模块获取真实 IPNginx 实时跟踪每台后端服务器的活跃连接数,新请求到来时,选择当前活跃连接数最少的服务器。
当配置了 weight 时,Nginx 使用加权公式:
选择 (active_conn × 256 / weight) 最小的服务器
这意味着权重高的服务器在同等连接数下更容易被选中。
每个请求随机选择一台后端服务器。在请求数量足够大时,请求会近似均匀地分布到所有服务器上。
random [two] 模式:先随机选两台服务器,再从这两台中选出连接数更少的一台。结合了随机性和最少连接的优点。
使用用户自定义的变量作为哈希 key,Nginx 计算哈希值后对服务器数量取模:
server_index = hash($key) % server_count
常用 key 包括:
$binary_remote_addr — 客户端 IP(比 ip_hash 更精确)$request_uri — 请求 URI(缓存场景)$arg_xxx — 查询参数(如用户ID、租户ID)$cookie_xxx — Cookie 值添加 consistent 参数后使用一致性哈希算法(Ketama),其核心优势: