必须使用第三方fair模块实现Nginx按后端响应时间动态分发流量,该模块非内置,需手动编译集成nginx-upstream-fair,配置时在upstream块中server行后单独写fair;,依赖最近3次RTT均值计算预期等待时间并优先调度最优节点,不支持weight、ip_hash等哈希策略。
要让 Nginx 按后端响应时间动态分发流量,必须使用第三方 fair 模块——它不是 Nginx 内置功能,而是通过实时采集各节点的响应耗时(默认取最近 3 次 RTT 平均值),每次选“预期等待时间最短”的节点转发请求,从而实现真正基于性能的自适应调度。
标准包(如 apt/yum 安装的 nginx)不含该模块,直接写 fair; 会报错 unknown directive "fair"。必须手动集成:
./configure --add-module=/path/to/nginx-upstream-fair
make && make install 完成安装nginx -V 2>&1 | grep -o fair,有输出即成功加载配置看似简单,但顺序和写法很关键:
fair; 必须单独成行,且放在所有 server 行之后server 可加 max_fails=2 fail_timeout=10s 做基础健康保护,但不能写 weight ——显式权重会被 fair 忽略,甚至导致失效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 的动态性依赖自由调度能力,以下做法会让它退化或完全不生效:
ip_hash、hash $request_uri 等哈希类指令——它们强制绑定请求与节点,和 fair 的按需选择逻辑冲突least_conn 或 random;fair 是独立策略,不可叠加部署后需验证是否真按响应快慢分发:
$upstream_response_time 和 $upstream_addr 字段分析各节点实际延迟分布proxy_next_upstream timeout error,让失败请求自动重试其他节点proxy_http_version 1.1; proxy_set_header Connection ''; 并启用 keepalive,减少建连开销干扰 RT 判断