Nginx 官方无 constant 算法,正确写法是 hash $variable consistent;它基于哈希环+虚拟节点,查找复杂度 O(log N),推荐用 $request_uri 或 $cookie_sessionid 作键,避免动态变量,并严格遵循语法。

Nginx 官方 upstream 中没有 constant 算法,也不存在名为 constant 的一致性哈希实现。你可能混淆了术语:
-
consistent(注意拼写)是 Nginx 中启用一致性哈希的关键字,必须跟在hash指令后; -
constant并非 Nginx 负载均衡算法,也不是任何主流模块(如ngx_http_consistent_hash或 OpenResty)中的合法指令或参数。
真正能实现“极速一致性哈希匹配”的,是 hash $variable consistent; 这一组合,它底层基于轻量级哈希环+虚拟节点,查找时间复杂度接近 O(log N),实际性能远优于普通取模哈希的重映射开销。
选对哈希键:决定命中率与稳定性
哈希键不是越长越好,而是要兼顾稳定性、区分度和业务语义:
$request_uri
适合静态资源、API 缓存(如/api/user/123?version=2),URI 相同则总打同一台,本地缓存/Redis 二级缓存复用率高。
✅ 推荐用于 CDN 回源、图片/JS/CSS 分发层。$cookie_sessionid或$http_x_user_id
适合登录态绑定,比 IP 更可靠(避开 NAT、IPv6、代理穿透问题)。
⚠️ 若 Cookie 为空,Nginx 默认 fallback 到轮询;可兜底写成:set $ch_key "$cookie_sessionid:$remote_addr"; hash $ch_key consistent;$binary_remote_addr
比$remote_addr更精准(兼容 IPv4/IPv6 二进制格式),适合真实 IP 会话粘滞。
❌ 不要用$time_iso8601、$request_id、$msec等每次请求都变的变量——哈希完全失效。
正确配置 consistent 哈希(不是 constant)
语法必须严格,常见错误包括空格、大小写、拼写:
upstream api_backend {
hash $request_uri consistent; # ✅ 正确:hash + 变量 + consistent(三者间有空格)
server 10.0.1.10:8000 weight=3;
server 10.0.1.11:8000 weight=2;
server 10.0.1.12:8000 weight=1;
}
⚠️ 注意:
-
consistent是hash指令的修饰符,不能单独写,也不能写成consistent_hash(那是第三方模块的指令名); - 官方
hash ... consistent不支持max_fails/fail_timeout与weight共存于同一行(部分版本会忽略 weight); - 若需完整支持权重 + 一致性 + 健康检查,建议使用
ngx_http_consistent_hash模块(需编译)或 OpenResty。
提速关键:减少哈希计算开销
一致性哈希本身很快,但慢常出在变量生成环节:
- 避免运行时拼接(如
"$host$request_uri")——每次请求都要字符串连接; - 优先用原生变量(
$request_uri、$arg_id),而非map或set多层赋值; - 如需提取路径前缀(如
/api/v1/统一哈希),可用map预处理一次,而不是每次set:
map $request_uri $api_route {
~^(/api/v\d+/[^?]+) $1;
default "";
}
upstream api_route {
hash $api_route consistent;
server 10.0.2.20:8080;
server 10.0.2.21:8080;
}
验证是否真“一致”
别只看配置,要实测:
- 用
curl -I http://domain/some-path多次请求同一 URI; - 在后端加响应头
X-Upstream: $hostname或 Nginx 自定义日志记录$upstream_addr; - 观察是否始终落在同一台机器(即使中间下线一台 server,其余请求应基本不变)。
不复杂但容易忽略











