Nginx负载均衡算法实现原理与配置
一 核心机制与模块
- 基于 ngx_http_upstream_module 实现,在 http { upstream { … } } 中定义后端服务器组,通过 proxy_pass 将请求反向代理到该组;同一 upstream 可与 proxy_pass / fastcgi_pass / uwsgi_pass / scgi_pass / memcached_pass / grpc_pass 等指令配合,覆盖多协议场景。Nginx 默认负载均衡策略为 轮询(Round Robin)。
二 开源版内置算法与关键实现
- 轮询 Round Robin:默认策略,按序将请求分发到后端;实现简单、开销低,适合后端性能接近的场景。
- 加权轮询 Weighted Round Robin:为 server 设置 weight,按权重比例分配;Nginx 采用“平滑加权轮询”(维护 current_weight/effective_weight/total_weight 等状态),避免长时段把请求都打到高权重节点。示例:weight=3:1:1 时,长期比例趋近 3:1:1。
- 最少连接 Least Connections:优先选择“活跃连接数/权重”最小的后端,适合请求处理时长差异大的场景;可与权重结合使用。
- IP 哈希 ip_hash:按客户端 源 IP 计算哈希,将同一 IP 固定到同一后端,用于会话保持;IPv4 使用前 3 个八位字节,IPv6 使用完整地址;在 NAT/代理 环境下可能出现负载不均或粘连失效。
- 通用哈希 Generic Hash:通过 hash $variable [consistent] 按自定义键(如 $request_uri、$cookie_sessionid)做哈希;启用 consistent 时使用“一致性哈希”,后端节点增删时仅少量键重映射,适合缓存与按业务键粘性。
- 随机 Random(Two-Choices):在权重基础上随机挑选 2 台候选,再按指定度量(如 least_conn;商业版的 least_time=header|last_byte)选出一台,缓解“羊群效应”。least_time 为 Nginx Plus 特性。
三 商业版增强算法
- 最短时间 Least Time(Nginx Plus):综合“最少连接”与“平均响应时间”选择目标,支持 least_time=header(首字节)或 least_time=last_byte(完整响应),显著降低高并发下的客户端延迟。
四 配置示例与常用参数
- 基础轮询与加权轮询
upstream backend {
server 10.0.0.11:8080 weight=3;
server 10.0.0.12:8080 weight=1;
server 10.0.0.13:8080; # weight 默认为 1
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 最少连接
upstream backend {
least_conn;
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
- IP 哈希与会话保持
upstream backend {
ip_hash;
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
- 通用哈希(一致性)
upstream backend {
hash $request_uri consistent;
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
- 健康探测与故障隔离
upstream backend {
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
}
- 备份节点
upstream backend {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
server 10.0.0.13:8080 backup;
}
- 上游长连接(提升性能)
upstream backend {
server 10.0.0.11:8080;
keepalive 32;
}
上述示例覆盖了 upstream 定义、算法选择、proxy_pass 反向代理、健康检查和备份节点 等常用模式;在生产中建议结合 日志与监控 验证分配效果与后端健康。
五 算法选择与注意事项
- 选择建议
- 后端性能接近:优先 轮询;性能差异明显:用 加权轮询。
- 请求耗时差异大或长连接多:用 最少连接。
- 需要会话保持且无法改造应用:用 ip_hash;更灵活可控:用 通用哈希 + consistent。
- 对延迟极敏感且使用商业版:用 least_time。
- 关键注意
- ip_hash 在 NAT/代理 场景可能不均;必要时改用 通用哈希 + 用户标识/Cookie。
- 使用 一致性哈希 时,后端节点变更仍会造成少量键重映射,做好容量与灰度规划。
- 为提升吞吐与降低握手开销,配置 upstream keepalive;为提升稳定性,配置 max_fails/fail_timeout 与必要的 备份节点。