一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中负载均衡如何配合 fair 算法按响应时间动态分发流量

时间:2026-08-27 11:31:51 编辑:袖梨 来源:一聚教程网

必须使用第三方fair模块实现Nginx按后端响应时间动态分发流量,该模块非内置,需手动编译集成nginx-upstream-fair,配置时在upstream块中server行后单独写fair;,依赖最近3次RTT均值计算预期等待时间并优先调度最优节点,不支持weight、ip_hash等哈希策略。

要让 Nginx 按后端响应时间动态分发流量,必须使用第三方 fair 模块——它不是 Nginx 内置功能,而是通过实时采集各节点的响应耗时(默认取最近 3 次 RTT 平均值),每次选“预期等待时间最短”的节点转发请求,从而实现真正基于性能的自适应调度。

编译安装 fair 模块是前提

标准包(如 apt/yum 安装的 nginx)不含该模块,直接写 fair; 会报错 unknown directive "fair"。必须手动集成:

  1. 下载对应版本的 Nginx 源码和 nginx-upstream-fair 源码
  2. 进入 Nginx 源码目录,执行:./configure --add-module=/path/to/nginx-upstream-fair
  3. make && make install 完成安装
  4. 验证:运行 nginx -V 2>&1 | grep -o fair,有输出即成功加载

upstream 中正确启用 fair 策略

配置看似简单,但顺序和写法很关键:

  1. fair; 必须单独成行,且放在所有 server 行之后
  2. 每个 server 可加 max_fails=2 fail_timeout=10s 做基础健康保护,但不能写 weight ——显式权重会被 fair 忽略,甚至导致失效
  3. 示例写法:
<!-- 正确 -->

upstream api_cluster {

server 192.168.2.10:8080 max_fails=2 fail_timeout=10s;

server 192.168.2.11:8080 max_fails=2 fail_timeout=10s;

fair;

}

避免常见冲突与失效场景

fair 的动态性依赖自由调度能力,以下做法会让它退化或完全不生效:

  1. 禁用 ip_hashhash $request_uri 等哈希类指令——它们强制绑定请求与节点,和 fair 的按需选择逻辑冲突
  2. 不要混用 least_connrandom;fair 是独立策略,不可叠加
  3. 若所有后端响应普遍超时(如平均 >2s),fair 会趋于轮询行为,此时应先排查下游瓶颈,而非调优 Nginx

观察效果与辅助优化建议

部署后需验证是否真按响应快慢分发:

  1. 开启 access_log,用 $upstream_response_time$upstream_addr 字段分析各节点实际延迟分布
  2. 配合 proxy_next_upstream timeout error,让失败请求自动重试其他节点
  3. 对长连接敏感的服务,加上 proxy_http_version 1.1; proxy_set_header Connection ''; 并启用 keepalive,减少建连开销干扰 RT 判断

热门栏目