Nginx需编译集成upstream_fair模块实现基于响应速度的动态负载均衡,配置时在upstream块中添加fair指令,自动依据排队数与历史响应时间计算预期等待时间并优先调度最优节点,不支持weight且不可与ip_hash等哈希策略混用。

要让 Nginx 根据后端真实响应速度自动分配请求,核心是启用 upstream_fair 模块,并在 upstream 块中声明 fair 指令。它不是内置功能,必须手动编译集成,但配置本身简洁直接。
编译安装 upstream_fair 模块
该模块由社区维护(GitHub 项目 gnosek/nginx-upstream-fair),需与 Nginx 源码一起编译:
- 下载 Nginx 源码包(如 nginx-1.24.0)和 fair 模块源码,解压到本地目录
- 进入 Nginx 源码根目录,执行 configure 命令,关键参数为 --add-module=/path/to/nginx-upstream-fair
- 运行 make 编译,完成后替换原有 nginx 二进制文件(已安装 Nginx 时无需 make install,仅复制 objs/nginx 即可)
- 验证是否加载成功:执行 nginx -V 2>&1 | grep -o fair,有输出即表示模块就绪
配置 upstream 使用 fair 策略
在 nginx.conf 的 http 块内定义 upstream 组,语法与其他策略一致,只需加入 fair 行:
- server 行支持标准参数:端口、max_fails、fail_timeout、backup 等,fair 会尊重这些健康检查逻辑
- 不支持 weight 参数——fair 自身通过响应时间动态调整“事实权重”,显式 weight 会被忽略
- 示例配置:
upstream api_backend { server 10.0.1.10:8000; server 10.0.1.11:8000; server 10.0.1.12:8000; fair; }
fair 的调度逻辑与行为特点
它不是简单选“上次响应最快”的服务器,而是综合排队状态与历史响应趋势做判断:
- 每个请求到来时,fair 计算各后端的“预期等待时间”:包括当前排队请求数 + 近期平均响应时间估算值
- 优先选择总等待时间最短的节点,天然避开正卡顿或刚失败的实例
- 若某台服务器连续超时或失败,其 fail_count 上升,fair 会主动降低其被选中的概率,直到 fail_timeout 后自动恢复探测
- 无须额外监控脚本,所有决策基于实时请求反馈,适合响应时间波动大的服务(如含数据库查询、外部 API 调用的接口)
搭配建议与注意事项
fair 提升了动态适应性,但需注意部署边界:
- 避免与 ip_hash、url_hash 等哈希类策略混用——fair 依赖自由调度,哈希会强制绑定,导致失效
- 建议配合 proxy_next_upstream 配置(如 timeout、error),增强单点异常时的容错能力
- 日志中可通过 $upstream_addr 和 $upstream_response_time 字段观察实际分发效果和各节点延迟分布
- 若后端响应时间普遍超过 1 秒,fair 仍能工作,但建议结合 slow-start 或 max_conns 控制突发流量冲击











