Nginx实现基于响应时间的静态资源负载均衡需编译集成fair模块,在upstream块末尾添加fair指令,依赖最近3次RTT均值动态选节点,并配合max_fails=2、fail_timeout=10s增强稳定性,禁用weight和ip_hash以保障时效性。

要实现基于响应时间的静态资源负载均衡,核心是让 Nginx 在 upstream 中启用 fair 调度算法——它不轮询、不固定权重,而是实时依据后端服务器的响应耗时(RTT)动态选节点,特别适合静态资源这类 I/O 密集、响应快慢差异明显的场景。
编译安装 fair 模块
fair 是第三方模块,Nginx 官方不内置,必须手动编译集成:
- 从 GitHub 获取
nginx-upstream-fair源码(推荐 gnosek 维护的原始版本) - 进入你当前使用的 Nginx 源码目录,执行:
./configure --add-module=/path/to/nginx-upstream-fair [其他原有参数] - 运行
make && make install完成安装 - 验证是否成功:
nginx -V 2>&1 | grep -o fair,有输出即表示模块已加载
upstream 中启用 fair 算法
fair 指令本身无参数,位置必须在 upstream 块内、所有 server 行之后(顺序敏感):
upstream static_servers {
server 192.168.5.10:8080;
server 192.168.5.11:8080;
server 192.168.5.12:8080;
fair; # 必须放在最后,且不能加任何参数
}
fair 默认基于最近 3 次响应时间的平均值做决策,无需额外配置即可开始按响应快慢分发请求。
适配静态资源的健壮性增强
静态资源服务虽轻量,但节点偶发卡顿或网络抖动会影响 fair 的判断。建议搭配以下参数提升稳定性:
-
max_fails=2 fail_timeout=10s:防止某台机器短暂超时后仍被持续压测 - 避免使用
weight:fair 本身会动态调整“事实权重”,显式设 weight 会干扰其行为 - 静态资源通常无状态,不需
ip_hash或hash $request_uri,否则削弱 fair 的时效性优势
反向代理静态资源 location 配置
确保静态资源请求实际走 upstream,例如匹配常见后缀:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2|ttf)$ {
proxy_pass http://static_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
expires 7d;
add_header Cache-Control "public, immutable";
}
注意:不要在该 location 中开启 proxy_buffering off 等可能放大延迟波动的设置;fair 依赖准确的响应时间采样,缓冲策略应保持默认。











