5月27日 21:45
Nginx 的负载均衡有哪些策略?如何配置?
Nginx 负载均衡有哪些策略?如何配置?
Nginx 通过 upstream 模块实现负载均衡,内置 5 种策略,另有第三方扩展策略。面试核心答案:轮询(默认)、加权轮询、最少连接、IP 哈希、一致性哈希。
1. 轮询(Round Robin,默认)
按顺序依次分配请求,服务器性能相近时使用。
nginxupstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; }
2. 加权轮询(Weighted Round Robin)
权重越高分配越多,适用于服务器性能不均。
nginxupstream backend { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=1; }
3. 最少连接(Least Connections)
将请求分给当前活动连接数最少的服务器,适用于请求处理时间差异大的场景。
nginxupstream backend { least_conn; server 192.168.1.100:8080; server 192.168.1.101:8080; }
4. IP 哈希(IP Hash)
同一客户端 IP 始终分配到同一台服务器,实现会话保持。
nginxupstream backend { ip_hash; server 192.168.1.100:8080; server 192.168.1.101:8080; }
注意:ip_hash 在后端服务器增减时会导致大量请求重新分配,一致性哈希可解决此问题。
5. 一致性哈希(Hash)
基于指定 key(如 URI、Cookie)做哈希,consistent 参数启用一致性哈希算法,减少服务器变动时的映射抖动。
nginxupstream backend { hash $request_uri consistent; server 192.168.1.100:8080; server 192.168.1.101:8080; }
服务器状态参数
nginxupstream backend { server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.102:8080 down; # 永久下线 server 192.168.1.103:8080 backup; # 备用,主服务不可用时启用 server 192.168.1.104:8080 max_conns=100; # 最大并发连接数 }
策略选择速查
| 场景 | 推荐策略 |
|---|---|
| 服务器性能相近 | 轮询 |
| 服务器性能不均 | 加权轮询 |
| 请求处理时间差异大 | 最少连接 |
| 需要会话保持 | IP 哈希 / 一致性哈希 |
| 需要缓存命中 | 一致性哈希(基于 URI) |
完整配置示例
nginxhttp { upstream backend { least_conn; server 192.168.1.100:8080 weight=3 max_fails=3 fail_timeout=30s; server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=30s; server 192.168.1.103:8080 backup; keepalive 32; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
健康检查
开源版 Nginx 仅支持被动健康检查(通过 max_fails / fail_timeout 判断),商业版 Nginx Plus 提供主动健康检查。
面试追问
Q:ip_hash 和一致性哈希的区别? ip_hash 以客户端 IP 为 key,后端变动时映射大规模失效;一致性哈希通过虚拟环减少变动影响,且可自定义 key(URI、Cookie 等),灵活性更高。
Q:Nginx 负载均衡能做四层转发吗?
能。使用 stream 模块可做 TCP/UDP 四层负载均衡,配置方式与 HTTP 的 upstream 类似。
Q:如何实现更精细的会话保持?
Nginx Plus 支持 sticky cookie 指令;开源版可配合一致性哈希 hash $cookie_jsessionid consistent 实现基于 Cookie 的会话粘滞。