Nginx 作为一款高性能的负载均衡器,提供了多种负载均衡策略(也叫做调度算法或方法),可以根据不同的业务场景进行选择。
以下是 Nginx 中主要的几种负载均衡策略:
1. 轮询(Round Robin)
- 默认策略。如果未显式配置任何策略,则使用此策略。
- 工作原理:将请求按顺序、均匀地分配给后端每一台服务器。第一次请求分给服务器1,第二次给服务器2,... 分配完最后一台后,又回到第一台,如此循环。
-
配置示例:
upstream my_backend { server backend1.example.com; server backend2.example.com; # 默认就是轮询 }
2. 加权轮询(Weighted Round Robin)
- 工作原理:在轮询的基础上,为服务器分配一个权重。权重越高,被分配到的请求比例就越大。这对于处理能力不同的服务器非常有用。
-
配置示例:
upstream my_backend { server backend1.example.com weight=3; # 接收~60%的请求 server backend2.example.com weight=2; # 接收~40%的请求 }
3. 最少连接数(Least Connections)
- 工作原理:将新的请求发送到当前活跃连接数最少的那台服务器。这考虑了服务器的当前负载,使得负载更加均衡。
-
配置指令:
least_conn -
配置示例:
upstream my_backend { least_conn; server backend1.example.com; server backend2.example.com; }
4. 加权最少连接数(Weighted Least Connections)
- 工作原理:这是“最少连接数”和“加权”的结合。Nginx 会考虑服务器的权重和当前连接数来决定将请求发给谁。
-
配置示例:
upstream my_backend { least_conn; server backend1.example.com weight=3; server backend2.example.com weight=2; }
5. IP 哈希(IP Hash)
- 工作原理:根据客户端的 IP 地址计算出一个哈希值,利用这个值将请求分配给固定的某台服务器。这可以保证来自同一个客户端的请求总是被转发到同一台后端服务器,常用于解决 Session 保持的问题。
-
配置指令:
ip_hash -
配置示例:
upstream my_backend { ip_hash; server backend1.example.com; server backend2.example.com; # 如果某台服务器需要下线,可以标记为 down,哈希会自动排除它 server backend3.example.com down; }
6. 通用哈希(Generic Hash)
-
工作原理:允许管理员自定义一个哈希的 key(可以是变量,如
$args、$uri等),根据这个 key 来计算哈希值并确定请求的路由。这可以用于将同一类请求(如访问同一资源)定向到特定服务器,提高缓存命中率。 -
配置指令:
hash -
配置示例:
upstream my_backend { hash $request_uri consistent; # 根据请求的URL进行哈希 server backend1.example.com; server backend2.example.com; }-
consistent参数可选,用于使用一致性哈希算法,能在服务器列表变化时最小化缓存失效。
-
7. 最少时间(Least Time)(仅限Nginx Plus)
- 工作原理:Nginx 商业版 Plus 的独有功能。它将请求发送到平均响应时间最短且活动连接数最少的服务器。这是最智能、最复杂的算法之一。
-
配置指令:
least_time -
配置示例:
upstream my_backend { least_time (header | last_byte); # 计算到收到响应头或最后一个字节的时间 server backend1.example.com; server backend2.example.com; }
8. 随机(Random)
-
工作原理:随机选择一个后端服务器。如果指定了
two参数,Nginx 会先随机选出两台服务器,然后根据加权最少连接数的策略从这两台中选出一台。这可以在高并发环境下降低轮询决策的开销。 -
配置指令:
random -
配置示例:
upstream my_backend { random two; server backend1.example.com weight=2; server backend2.example.com; server backend3.example.com; }
总结与选择建议
| 策略 | 指令 | 适用场景 |
|---|---|---|
| 轮询 | (默认) | 后端服务器配置相同,无状态服务 |
| 加权轮询 | weight |
后端服务器处理能力不均 |
| 最少连接数 | least_conn |
请求处理时间长短不一,需要动态平衡负载 |
| IP 哈希 | ip_hash |
需要保持会话(Session)一致性 |
| 通用哈希 | hash |
需要基于特定规则(如URL)进行路由,提高缓存效率 |
| 最少时间 | least_time |
(Nginx Plus) 追求最佳性能和响应速度 |
| 随机 | random |
大规模后端集群,降低选择开销 |
最常用的策略是加权轮询和IP哈希。根据你的业务需求(是否需要会话保持、后端服务器性能是否一致等)来选择合适的策略是关键。