Nginx 作为高性能的反向代理服务器,其内置的负载均衡策略非常成熟和强大。这些策略主要在 upstream 模块中配置,用于将客户端请求分发到一组后端服务器。
1. 轮询(Round Robin)
-
默认策略。如果没有显式指定,Nginx 就使用此策略。
-
工作原理:将每个新请求按顺序依次分配给后端服务器列表中的下一台。循环往复。
-
配置示例:
nginx
upstream backend_servers {
server 192.168.1.100;
server 192.168.1.101;
server 192.168.1.102;
}
- 特点:绝对平均,假设所有服务器性能相同且请求处理耗时相似。
2. 加权轮询(Weighted Round Robin)
-
轮询的增强版,考虑了服务器性能差异。
-
工作原理 :通过
weight参数指定权重。权重越高,被分配到的请求比例越大。 -
配置示例:
nginx
upstream backend_servers {
server 192.168.1.100 weight=3; # 处理3个请求
server 192.168.1.101 weight=2; # 处理2个请求
server 192.168.1.102 weight=1; # 处理1个请求
# 请求分配模式大致为:100, 100, 100, 101, 101, 102, 100, 100, 100...
}
- 应用场景:服务器配置不均(CPU、内存不同)。
3. 最少连接(Least Connections)
-
工作原理 :将新请求优先分配给当前活跃连接数最少的后端服务器。
-
配置指令 :
least_conn -
配置示例:
nginx
upstream backend_servers {
least_conn;
server 192.168.1.100;
server 192.168.1.101;
}
- 应用场景:请求处理时间长短不一(如有的请求是短 API 调用,有的是长耗时计算),能更公平地分配负载。
4. 加权最少连接(Weighted Least Connections)
-
最少连接的增强版,同样考虑服务器权重。
-
工作原理:在考虑活跃连接数的同时,结合权重进行更智能的分配。
-
配置示例:
nginx
upstream backend_servers {
least_conn;
server 192.168.1.100 weight=3;
server 192.168.1.101 weight=2;
}
5. IP 哈希(IP Hash)
-
工作原理 :根据客户端 IP 地址计算哈希值,将同一 IP 的请求总是路由到同一台后端服务器。
-
配置指令 :
ip_hash -
配置示例:
nginx
upstream backend_servers {
ip_hash;
server 192.168.1.100;
server 192.168.1.101;
}
-
关键特性:
-
会话保持:确保来自同一客户端的请求会话(Session)不丢失,无需额外配置 Session 共享。
-
缺点:服务器数量变化时(增/删),大部分 IP 的映射会改变,可能导致会话失效。
-
-
应用场景:对会话一致性有要求,且没有外部 Session 存储(如 Redis)的应用。
6. 通用哈希(Generic Hash)
-
IP 哈希的通用版本,可以基于任意变量(如 URL、请求参数)进行哈希。
-
配置指令 :
hash -
配置示例:
nginx
upstream backend_servers {
hash $request_uri consistent; # 按请求URI哈希
server 192.168.1.100;
server 192.1.68.1.101;
}
-
consistent参数 :启用一致性哈希,能最大程度减少后端服务器增减时带来的缓存失效或会话影响。 -
应用场景:缓存代理、需要将特定请求固定到特定服务器的场景。
7. 最短响应时间(Least Time)
-
Nginx Plus 专有功能(商业版)。
-
工作原理 :综合最短平均响应时间 和最少活动连接数两个指标,将请求发给当前响应最快、连接最少的服务器。
-
配置指令 :
least_time header或least_time last_byte-
header: 只计算到接收完响应头的时间。 -
last_byte: 计算到接收完整个响应体的时间。
-
-
配置示例:
nginx
upstream backend_servers {
least_time header;
server 192.168.1.100;
server 192.168.1.101;
}
- 应用场景:对延迟极其敏感的应用,追求最优的用户体验。
负载均衡策略对比表
| 策略 | 指令 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 轮询 | (默认) | 简单,绝对公平 | 忽略服务器性能差异和请求耗时 | 服务器同构,请求简单 |
| 加权轮询 | weight |
考虑服务器性能 | 忽略请求实际处理时间 | 服务器配置不均 |
| 最少连接 | least_conn |
动态,适合请求耗时不均 | 忽略服务器性能差异 | 请求处理时间差异大 |
| IP哈希 | ip_hash |
会话保持简单 | 服务器增减影响大,可能负载不均 | 需要会话保持且无共享Session |
| 通用哈希 | hash |
灵活,可一致性哈希 | 配置稍复杂 | 缓存代理,特定请求路由 |
| 最短响应时间 | least_time (Plus) |
性能最优,延迟最低 | Nginx Plus 专有,需付费 | 对延迟敏感的商业应用 |
其他关键配置参数
在 server 指令中,除了 weight,还有:
-
max_fails和fail_timeout: 定义在特定时间内失败多少次后,将该服务器标记为不可用(健康检查)。 -
backup: 将该服务器标记为备份服务器,只有当所有主服务器都不可用时才会被使用。 -
down: 手动将服务器标记为永久不可用。
nginx
upstream backend_servers {
server 192.168.1.100 max_fails=3 fail_timeout=30s;
server 192.168.1.101 backup;
}