要实现基于特定参数的负载均衡绑定,需使用hash指令并指定变量(如$remote_addr、$request_uri等),配合consistent启用一致性哈希以减少节点变动影响。

要让 upstream 结合 hash 策略实现基于特定参数的负载均衡绑定,核心是使用 hash 指令,并明确指定参与哈希计算的变量(如 IP、URL、请求头等),从而保证相同参数的请求始终落到同一台后端服务器。
支持的 hash 变量与适用场景
Nginx 原生支持以下常用 hash 变量,选择取决于你的绑定需求:
-
$remote_addr:客户端真实 IP,对应
ip_hash(仅限 IPv4,IPv6 需配合hash+$binary_remote_addr) -
$request_uri:完整请求路径 + 查询参数(如
/api/user?id=123),适合缓存一致性或路由幂等性要求高的场景 - $host$uri:域名 + 路径(不含参数),适用于多租户按域名/路径隔离
- $http_x_user_id 或其他自定义请求头:需客户端主动携带(如网关注入),适合登录态透传后的用户级绑定
-
$binary_remote_addr:二进制格式 IP,对 IPv4/IPv6 兼容性更好,推荐替代
ip_hash
配置示例:按 URL 路径哈希绑定
适用于静态资源、API 缓存节点等需要“同 URL 总走同机器”的场景:
upstream backend_by_uri {
hash $request_uri consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
注意:consistent 启用一致性哈希,增减节点时仅少量 key 重映射;不加则为普通哈希(节点变动会导致大量请求迁移)。
配置示例:按自定义请求头哈希(如用户 ID)
适合有统一网关注入 X-User-ID 头的业务系统,实现用户会话粘滞:
upstream backend_by_user {
hash $http_x_user_id consistent;
server 10.0.1.5:9000;
server 10.0.1.6:9000;
}
关键点:
- 变量名必须小写且带
$http_前缀(Nginx 自动转换请求头为小写) - 若请求未携带该头,Nginx 将哈希空字符串,所有此类请求会落到同一台后端,建议配合默认值或过滤逻辑
- 不能与
weight、max_fails等参数混用在同一个server行中(hash 模式下这些参数会被忽略)
重要限制与注意事项
hash 类策略有几项硬性约束,配置前必须确认:
- upstream 块中不能同时出现
ip_hash、least_conn等其他负载策略指令 - 启用
hash后,server行中的weight、backup、down仍有效,但max_fails/fail_timeout对健康检查的影响需单独验证(部分版本下可能弱化) - 哈希结果依赖变量内容稳定性——例如
$request_uri包含时间戳或随机参数,会导致哈希失效,此时应改用$host$uri或提取固定字段 - 测试时可用
curl -H "X-User-ID: u123" http://your-domain/api验证是否命中预期后端


















