Nginx原生ip_hash和hash $request_uri均不支持weight,强行混用会报错;可通过consistent_hash模块、backup配合、健康检查及session解耦等组合策略实现业务连续性。

直接说结论:Nginx 原生的 ip_hash 和 hash $request_uri 都不支持权重,无法与 weight 参数共存;所谓“带权重的哈希绑定”在标准 upstream 中不可行。但业务连续性目标可以通过组合策略务实达成。
ip_hash 本身不支持 weight,强行混用会报错
Nginx 明确禁止在启用了 ip_hash 的 upstream 块中设置 weight、backup 或 max_fails 等参数。配置示例如下:
- ✅ 合法:
upstream backend { ip_hash; server 192.168.1.10; server 192.168.1.11; } - ❌ 报错:
upstream backend { ip_hash; server 192.168.1.10 weight=2; }—— 启动失败,提示 “weight is not allowed when ip_hash is used”
这是因为 ip_hash 的设计目标是确定性映射(同一 IP 总落同一台),而权重机制会动态调整调度分布,二者逻辑冲突。
基于 AIOZ Stream API 的免费音频上传技能,通过三步流程(Create → Upload Part → Complete)将本地音频文件上传至 AIOZ 流媒体平台。支持默认快速上传方式,使用默认编码配置,上传完成后返回 HLS 流媒体播放链接。使用 API Key (stream-publ...)进行认证。
url_hash 同样不兼容 weight,但可配合 backup 实现部分容灾
第三方模块 url_hash(需编译启用)或官方 hash $request_uri 也禁用 weight。但它能保障相同 URL 落同一节点,对缓存友好:
- 适用场景:静态资源 CDN、图片/JS/CSS 缓存节点、内容分发边缘层
- 提升连续性的做法:搭配
backup服务器,当主节点异常时,同 URL 请求自动切到备用机,缓存虽丢失但服务不中断 - 示例:
upstream cache_pool { hash $request_uri consistent; server 192.168.2.10; server 192.168.2.11; server 192.168.2.12 backup; }
真正兼顾“一致性”与“权重”的替代方案:使用 consistent_hash 模块
若必须按客户端特征(如 IP 或 UID)做哈希 + 支持权重,推荐使用开源模块 nginx-consistent-hash(或 OpenResty 内置的 balancer_by_lua*):
- 它实现一致性哈希,节点增减仅影响少量 key,大幅降低会话迁移比例
- 支持为每个
server设置weight,高权重节点分配更多哈希槽位 - 典型配置:
upstream backend { consistent_hash $remote_addr; server 192.168.1.10 weight=3; server 192.168.1.11 weight=1; } - 注意:需重新编译 Nginx 或使用预编译支持该模块的发行版(如 Tengine、OpenResty)
不依赖哈希,也能提升业务连续性的实用技巧
很多场景下,“绑定”不是刚需,用健康检查 + 快速故障转移更可靠:
- 对所有后端启用
max_fails=2 fail_timeout=10s,Nginx 在 10 秒内失败 2 次即临时摘除节点 - 配合
proxy_next_upstream error timeout http_500,单次请求失败自动重试另一台 - session 不依赖后端存储?改用 JWT 或 Redis 共享 session,彻底解耦绑定需求
- 前端加 retry 逻辑或使用 service mesh 的熔断重试策略,从更上层保障连续性

















