Nginx原生不支持运行时权重调整与节点性能感知,需依赖第三方模块实现动态负载均衡:fair模块按响应时间自动选点,upsync+Consul支持毫秒级权重热更新,OpenResty通过Lua脚本实现业务定制化调度。

用 fair 模块按响应速度自动分发
适合后端延迟波动大、机器性能不均的环境,比如混合云部署或微服务实例响应差异明显时。
- 需手动编译安装:下载
nginx-upstream-fair源码,执行./configure --add-module=/path/to/fair,再make && make install - 验证加载成功:
nginx -V 2>&1 | grep fair应有输出 - 在
upstream块中仅加一行fair;,无需参数,例如:
upstream backend {
fair;
server 192.168.1.10:8080 max_fails=2 fail_timeout=10s;
server 192.168.1.11:8080 max_fails=2 fail_timeout=10s;
} - 避免与
ip_hash或hash同时使用,否则 fair 失效
用 upsync + Consul 实现毫秒级权重热更新
适合需要根据 CPU、QPS 或健康状态自动升降权值的运维闭环场景,比如自动扩缩容或故障降权。
- 编译时加入
nginx-upsync-module,启用配置拉取能力 -
upstream中配置 Consul 地址和同步策略,例如:
upstream backend {
upsync 127.0.0.1:8500/v1/kv/upstreams/backend/ upsync_type=consul upsync_interval=500ms;
upsync_dump_path /var/tmp/upstream_backup.conf;
include /var/tmp/upstream_backup.conf;
} - Consul 中写入 JSON 节点列表,含
weight字段,变更后模块自动刷新所有 worker 进程 - 推荐搭配监控系统(如 Prometheus + Alertmanager)触发 Consul 写入,形成自动化链路
用 Lua 脚本实现业务维度调度
适合灰度发布、用户分组路由、接口分级限流等强业务耦合场景,灵活性最高但开发维护成本也高。
- 必须使用 OpenResty 或编译启用
ngx_http_lua_module,检查命令:nginx -V | grep lua - 禁用传统
upstream,改用balancer_by_lua_block在请求阶段决策目标地址 - 可读取
$arg_uid、$request_uri等变量,调用 Redis/Consul 获取实时权重或健康状态 - 建议配合
lua_shared_dict缓存节点状态,避免每次请求都远程查询 - 示例逻辑:UID 末位为 0 的请求打到新版本节点,其余走旧版;或响应超时达阈值则临时降权


















