Nginx 通过 upstream 块中的 hash 指令实现基于 URL 参数的一致性哈希分发,如 hash $arg_uid consistent;,配合 map 预处理空参、set 拼接多参数,并用自定义日志验证哈希效果。

Nginx 本身没有名为 hash 的独立指令,但可通过 upstream 块中的 hash 指令(配合变量)实现基于 URL 参数的请求一致性哈希分发。核心是让相同参数值的请求始终落到同一台后端服务器,适用于缓存亲和、会话保持等场景。
启用 hash 负载均衡并指定参数变量
在 upstream 块中使用 hash $arg_<i>param_name</i> consistent;,其中 $arg_xxx 是 Nginx 内置变量,自动提取请求中的 URL 参数(如 ?uid=123 → $arg_uid 值为 123)。
-
consistent启用一致性哈希,增减后端节点时仅少量键重映射,提升稳定性 - 若参数不存在或为空,Nginx 默认使用空字符串哈希,可能导致所有空参请求集中到一台机器;可配合
map提供默认值规避
处理缺失/空参数:用 map 预处理变量
直接哈希空参数易导致倾斜。推荐先用 map 构建安全变量:
map $arg_uid $hash_uid {
"" "default";
default $arg_uid;
}然后在 upstream 中引用:hash $hash_uid consistent;。这样 ?uid=、?uid 或无 uid 参数的请求都会归入 "default" 分组,避免意外集中。
支持多参数组合哈希
若需基于多个参数(如 uid 和 region)联合哈希,可用 concat 模块(需编译)或 Nginx 1.11.6+ 原生支持的变量拼接:
- 原生方式(推荐):
set $hash_key "${arg_uid}_${arg_region}";,再hash $hash_key consistent; - 注意:确保参数值不包含特殊字符(如
/、&),否则可能干扰解析;必要时用map过滤或替换
验证与调试技巧
开启 log_format 记录哈希键和选中后端,便于排查:
log_format hashlog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'hash_key:"$hash_key" upstream:"$upstream_addr"';搭配 access_log /path/to/hash.log hashlog;,观察日志中相同 hash_key 是否总对应同一 upstream_addr。


















