Nginx 通过 upstream 模块实现负载均衡,配合 proxy_pass 指令将用户请求按预设策略分配到后端服务器集群。其核心原理是定义服务器组并配置调度算法,实现请求的分发与容错。
Nginx 实现负载均衡的核心步骤- 定义服务器组:在 http 块中使用 upstream 指令声明后端服务器集群,例如:upstream backend { server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 配置代理转发:在 server 块中通过 proxy_pass 将请求指向服务器组:server { listen 80; location / { proxy_pass
http://backend;
}} - 启用健康检查:通过 max_fails 和 fail_timeout 参数检测服务器状态,自动剔除故障节点。例如:upstream backend { server 10.0.0.101:8089 max_fails=3 fail_timeout=30s;}
Nginx 常用负载均衡策略1. 轮询(Round Robin,默认策略)- 规则:按顺序依次将请求分配到每台服务器,实现平均分流。
- 配置示例:upstream backend { server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 特点:简单高效,适用于服务器性能相近且请求耗时均匀的场景。
2. 加权轮询(Weighted Round Robin)- 规则:根据服务器权重分配流量,权重越高处理请求越多。
- 配置示例:upstream backend { server 10.0.0.101:8089 weight=3; # 分配3份请求 server 10.0.0.102:8089 weight=1; # 分配1份请求}
- 特点:适用于服务器性能差异较大的场景(如新老机器混用)。
3. 最少连接(Least Connections)- 规则:优先将请求分配给当前连接数最少的服务器。
- 配置示例:upstream backend { least_conn; server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 特点:适合请求处理耗时差异较大的场景(如文件上传、复杂计算)。
4. IP 哈希(IP Hash)- 规则:根据客户端 IP 计算哈希值,固定分配到同一台服务器。
- 配置示例:upstream backend { ip_hash; server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 特点:
优点:保证会话粘性(如用户登录状态)。
缺点:服务器宕机时,部分用户需重新建立会话。
5. 随机(Random)- 规则:随机选择一台服务器处理请求,可结合 two 和 least_conn 优化。
- 配置示例:upstream backend { random two least_conn; # 从两台随机服务器中选连接数少的 server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 特点:避免热点倾斜,适用于分布式缓存等场景。
6. 哈希(Hash)- 规则:对任意键(如 URI、用户 ID)计算哈希值,实现一致性哈希分配。
- 配置示例:upstream backend { hash $request_uri consistent; server 10.0.0.101:8089; server 10.0.0.102:8089;}
- 特点:比 IP 哈希更灵活,适合分布式缓存或数据分片场景。
7. Fair(第三方模块)- 规则:根据服务器响应时间分配流量,优先选择响应快的节点。
- 配置说明:需安装 upstream_fair 模块,非 Nginx 官方支持。
8. 最少时间(Least Time,商业版 Nginx Plus)- 规则:选择平均响应时间最短的服务器,综合考量连接数和响应速度。
高可用与健康检查Nginx 通过以下机制保障服务可用性:
- 健康检测:通过 max_fails 和 fail_timeout 参数检测服务器状态,自动剔除故障节点。
- Keepalived 集成:结合 Keepalived 实现主备切换,避免单点故障。
面试回答模板问题:Nginx 如何实现负载均衡?常用策略有哪些?回答:Nginx 通过 upstream 模块定义服务器组,并配合 proxy_pass 实现请求分发。常见策略包括:
- 轮询:默认策略,平均分配请求。
- 加权轮询:按服务器权重分配流量,适用于性能差异场景。
- 最少连接:优先分配给连接数少的服务器,适合长连接或耗时请求。
- IP 哈希:基于客户端 IP 固定分配,保证会话粘性。
- 随机/哈希:避免热点倾斜,支持自定义键(如 URI、用户 ID)。
- Fair/最少时间:根据响应时间动态分配(需第三方模块或商业版支持)。
此外,Nginx 支持健康检查,可自动剔除故障节点,结合 Keepalived 实现高可用。