fair算法实现智能负载均衡的关键是正确安装模块、严格配置upstream顺序、确保响应时间测量真实,它基于实时RTT动态选后端而非权重或轮询。

要用 fair 算法实现基于响应时间的智能负载均衡,关键不是“配对”或“调参”,而是把模块装对、配置写准、后端行为理清。它不靠人工设权重,也不按固定顺序轮询,而是实时看哪台后端最近响应最快,就优先发请求过去——前提是 Nginx 能真实测到这个“快慢”。
编译安装 fair 模块是前提
fair 不在 Nginx 官方源码里,必须手动集成:
- 下载当前使用的 Nginx 源码包(版本建议 1.20+),再从 GitHub 获取 gnosek/nginx-upstream-fair 的稳定版源码
- 进入 Nginx 源码目录,执行:
./configure --add-module=/path/to/nginx-upstream-fair [其他原有参数] - 运行 make && make install 完成替换
- 验证是否成功:nginx -V 2>&1 | grep -o fair,有输出即表示加载成功
upstream 块内配置要严格守序
配置看似简单,但顺序和语法容错极低:
- fair; 必须单独成行,且放在所有 server 行之后
- 每个 server 可设 max_fails=2 fail_timeout=5s 做基础熔断,但不能加 weight,否则 fair 自动降权逻辑失效
- 不支持 backup、slow_start 或 down 以外的状态标记,这些需靠外部健康检查系统补位
- 示例写法:
upstream api_backend {
server 192.168.3.10:8000 max_fails=2 fail_timeout=5s;
server 192.168.3.11:8000 max_fails=2 fail_timeout=5s;
server 192.168.3.12:8000 max_fails=2 fail_timeout=5s;
fair;
}
让响应时间测量真实可信
fair 默认用最近 3 次 RTT 平均值选节点,但这个“RTT”必须反映后端真实处理耗时:
- 关闭 CDN 或反向代理层对静态资源的缓存,否则 Nginx 测到的是缓存命中时间,不是后端响应时间
- 确保后端服务返回标准 X-Response-Time 或记录 access_log 中 $upstream_response_time,便于后续分析偏差
- 避免在 location 块中启用 proxy_buffering off,它会放大网络抖动对 RT 测量的影响
- 短连接 API 场景最适配 fair;若后端大量长连接(如 WebSocket),least_conn 更稳
配合 proxy_pass 使用时注意转发语义
fair 只管 upstream 内部选谁,不干预转发逻辑,所以 proxy_pass 配置要匹配业务特征:
- 不要混用 ip_hash 或 hash $request_uri,它们会锁定节点,抵消 fair 的动态优势
- 若服务无状态,直接透传 Host 和真实 IP 即可:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; - 对静态资源,建议加 expires 和 Cache-Control,减轻后端压力,也让 fair 更聚焦于“真正需要调度”的请求











