fair是第三方nginx负载均衡模块,基于实时响应时间动态调度,适配nginx 1.14–1.16,不兼容1.17+、http/2及stream模块,需手动编译,不支持weight和backup,推荐用nginx plus的least_time或服务层lb替代。

fair不是Nginx官方内置的负载均衡算法,而是由第三方开发的模块,它基于后端节点的实时响应时间动态分配请求,比least_conn更关注实际处理效率,而非仅连接数。但要注意:该模块已多年未更新,不兼容新版Nginx(1.17+),且不支持HTTP/2和stream模块,生产环境需谨慎评估。
fair模块的安装与编译
由于fair未被收录进主流发行版源或OpenResty,默认不可直接启用,需手动编译:
- 下载源码:从GitHub仓库获取最新可用版本(注意检查commit时间,通常只适配到Nginx 1.14–1.16)
- 解压后进入Nginx源码目录,执行
./configure --add-module=/path/to/nginx-upstream-fair,再make && make install - 验证是否加载成功:运行
nginx -V 2>&1 | grep -o fair,有输出即表示模块已编入
在upstream中启用fair调度
配置语法简洁,无需额外参数,只需在upstream块中声明fair指令:
upstream backend {
fair;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
fair会自动记录每个server最近几次响应耗时(默认取最近3次RTT平均值),优先将新请求转发给响应最快的那个节点。它不依赖健康检查指令,但建议仍配合max_fails和fail_timeout使用,避免故障节点持续接收流量。
与least_conn的关键区别
两者目标不同,适用场景也不同:
- least_conn:适合长连接、连接生命周期差异大的场景(如WebSocket、gRPC流式调用),只看当前活跃连接数,不感知响应快慢
- fair:适合短连接、响应时间波动明显的服务(如API网关后接异构数据库或Python服务),能快速绕过变慢的实例,但对突发延迟敏感(一次超时就可能临时降权)
- fair不支持权重(
weight)、备份节点(backup)等高级特性,扩展性较弱
替代方案建议(推荐用于新项目)
若因兼容性或维护性放弃fair,可考虑更现代的替代方式:
- 使用
ip_hash+ 自定义健康探测脚本,实现“稳定+可控”的组合 - 升级至Nginx Plus,启用
least_time指令(支持header/last_byte两种指标),功能完整且持续维护 - 在服务层做客户端负载均衡(如Ribbon、gRPC LB),由应用自行决策,Nginx退为纯反向代理











