Nginx通过ip_hash和hash两类哈希机制实现请求路由:ip_hash基于客户端IP实现会话保持,确保同一IP请求始终路由至同一后端,不支持权重;hash支持任意变量(如$request_uri、$arg_user_id)进行通用哈希路由,可选一致性哈希减少节点变动影响。

Nginx 主要通过 ip_hash 和 hash 两类哈希机制实现请求路由,用途和原理不同,需按场景选择。
ip_hash:基于客户端 IP 的会话保持
适用于需要 Session 粘性的业务(如登录态、购物车),确保同一 IP 的请求始终落到同一台后端服务器。
- 启用方式:在 upstream 块中添加
ip_hash;指令 - 计算逻辑:取客户端真实 IP(注意代理链下需用
$remote_addr或$http_x_forwarded_for配合set_real_ip_from),经哈希后对服务器总数取模:server_index = hash(client_ip) % n - 自动剔除失效节点:当某台 server 不可用时,Nginx 会临时将其从哈希环中排除,请求重映射到其他可用节点;该 server 恢复后,原有 IP 的请求仍会回到它(哈希结果不变)
- 限制:不支持权重(weight 参数会被忽略),且 IPv6 地址需完整参与哈希;若用户 IP 频繁变化(如移动网络、NAT 网关),可能导致会话丢失
hash 指令:通用键值哈希路由
适用于缓存一致性或数据分片场景(如将相同用户 ID 的请求固定到同一台 API 服务),支持任意变量作为哈希输入。
- 语法示例:
hash $request_uri consistent;或hash $arg_user_id; - 可选
consistent参数启用一致性哈希,减少后端增减时的缓存击穿 - 支持的变量包括:请求路径(
$request_uri)、查询参数($arg_key)、请求头($http_x_user_token)、Cookie(需配合map提取)等 - 注意:哈希表在 Nginx 启动时初始化,不可动态扩容;变量为空或非法时可能触发默认 fallback 行为
底层哈希实现特点
Nginx 自研哈希表采用开链法(链地址法),结构为二维数组(桶数组 + 元素链),具备以下特性:
- 哈希函数固定,输出稳定,相同输入必得相同索引
- 桶数量(size)与元素数在配置加载时确定,运行期不可变更
- 冲突通过链式结构处理,但实际实现倾向用紧凑数组替代链表以提升缓存命中率
- 所有哈希操作均在内存中完成,无锁设计,性能高效
常见误配与建议
避免因配置不当导致路由异常或负载倾斜:
- 使用
ip_hash时,若后端服务器性能差异大,建议搭配健康检查(max_fails/fail_timeout)及时隔离故障节点 - 用
hash $arg_token时,确保 token 字段始终存在且格式统一,否则空值哈希可能集中打到某一台机器 - 不要在
hash中直接使用未清洗的$args(含排序/编码差异),应提取关键字段 - history 模式前端应用的
try_files属于静态文件路由,与负载均衡哈希无关,勿混淆



















