Nginx 提供了哪些内置的负载均衡策略(算法)?
Nginx 作为一款高性能的反向代理和负载均衡器,提供了多种内置的负载均衡策略(算法),以适应不同的业务场景。
以下是 Nginx 开源版(免费版)中内置的 6 种主要负载均衡策略,以及 Nginx Plus(商业版)专属的策略:
1. 轮询 (Round Robin) —— 默认策略
这是 Nginx 的默认负载均衡算法。它会按时间顺序将请求逐一分配到不同的后端服务器。
- 工作原理:请求依次分发,A -> B -> C -> A -> B...
- 适用场景:后端服务器的硬件配置(CPU、内存等)基本一致,且每个请求的处理时间相差不大。
- 配置示例:plaintext
upstream backend { server backend1.example.com; server backend2.example.com; }
2. 加权轮询 (Weighted Round Robin)
基于默认的轮询策略,但引入了 weight(权重)参数。
- 工作原理:权重越高的服务器,被分配到的请求越多。默认权重为 1。
- 适用场景:后端服务器硬件性能不均等。可以让性能好的服务器承担更多流量。
- 配置示例:plaintext
upstream backend { server backend1.example.com weight=3; # 接收 75% 的请求 server backend2.example.com weight=1; # 接收 25% 的请求 }
3. IP 哈希 (IP Hash)
根据客户端的 IP 地址计算出一个哈希值,并将该请求分配给对应的后端服务器。
- 工作原理:Nginx 使用 IPv4 地址的前三个字节(或整个 IPv6 地址)进行哈希计算。这保证了同一个客户端 IP 的请求总会被转发到同一台后端服务器(除非该服务器宕机)。
- 适用场景:需要会话保持(Session Persistence)的场景。例如,用户的登录 Session 存在某台具体的后端服务器内存中,未做分布式 Session 共享。
- 配置示例:plaintext
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
4. 最少连接数 (Least Connections)
将新请求分配给当前活跃连接数最少的后端服务器。
- 工作原理:Nginx 会实时记录各台服务器当前的连接数,寻找最闲的服务器。如果有多台服务器连接数相同,则在这些服务器之间使用加权轮询。
- 适用场景:请求处理时间长短不一的场景(如:大文件下载、复杂的数据库查询、长轮询)。可以避免某些服务器堆积过多耗时请求而过载。
- 配置示例:plaintext
upstream backend { least_conn; server backend1.example.com; server backend2.example.com; }
5. 通用哈希 / URL 哈希 (Generic Hash)
允许用户自定义哈希的 Key(键),可以是文本、Nginx 变量(如 $request_uri、$remote_addr)或它们的组合。
- 工作原理:根据用户指定的变量计算哈希值。最常见的是 URL 哈希,即保证访问同一个 URL 的请求总是被发送到同一台服务器。
- 适用场景:缓存系统(如 CDN 节点、Redis、Memcached 等后端)。同一个 URL 固定打到同一台机器,可以极大提高缓存命中率。
- 配置示例:注:强烈建议加上plaintext
upstream backend { hash $request_uri consistent; # consistent 表示使用一致性哈希算法 server backend1.example.com; server backend2.example.com; }consistent参数开启*一致性哈希,这样在增加或移除后端服务器时,只会影响少部分请求的路由,不会导致大面积缓存失效。*
6. 随机 (Random)
将请求随机分发给后端服务器。
- 工作原理:随机选择一台服务器。它还支持“两次随机选择” (Two Choices) 算法:即随机挑两台服务器,然后把请求发给这两台里面连接数较少(或延迟较低)的那台。
- 适用场景:多个负载均衡器向同一个后端集群转发流量的大型分布式环境(这种做法可以避免多个负载均衡器在同一时间将流量打到同一台服务器上,引发“羊群效应”)。
- 配置示例:plaintext
upstream backend { random two least_conn; # 随机选两台,然后发给这两台中连接数最少的 server backend1.example.com; server backend2.example.com; }
👑 附加:Nginx Plus(商业版)专属策略
最短时间 (Least Time)
- 工作原理:将请求分配给平均响应时间最短且活跃连接数最少的服务器。
- 配置指令:
least_time header | last_byte; - 适用场景:对延迟要求极其苛刻的微服务或高频交易环境。
💡 总结与选型建议
| 业务场景 | 推荐算法 |
|---|---|
| 无状态服务,服务器性能一致 | 轮询 (Round Robin) |
| 无状态服务,服务器性能有强有弱 | 加权轮询 (Weighted Round Robin) |
| 需要基于 IP 绑定用户 Session | IP 哈希 (IP Hash) |
| 长短请求混合,耗时差异大 | 最少连接数 (Least Connections) |
| 后端是缓存服务器,追求缓存命中率 | URL 哈希 (Hash $request_uri consistent) |