NGINX 负载平衡哈希:如果存在则使用 cookie 值,如果不存在则使用 ip_hash

NGINX 负载平衡哈希:如果存在则使用 cookie 值,如果不存在则使用 ip_hash

我正在尝试弄清楚如何在 NGINX 的upstream负载平衡指令中执行一些 if-else 逻辑。基本上,我想使用以下方法:

hash $cookie_my_cookie_name consistent;

...如果my_cookie_name存在cookie ( )。如果该 cookie不是现在,那么我希望上游选择方法能够回退到内置方法:

ip_hash;

我在 NGINX 的文档中找不到任何关于如何“尝试”一种上游选择方法的示例,如果该方法不起作用则选择替代方法。

我担心的情况是,如果 cookie 不存在,变量$cookie_my_cookie_name会插入(至少在日志中)-,这一个字符串,但总是会散列到同一个上游服务器,这正是我不想要的。(因此,测试需要针对 cookie 的缺失,如果存在,它将始终保持“好”的值。)

有任何想法吗?

答案1

您应该能够使用一个或多个map块来转换您的哈希键。

未测试:

map $cookie_my_cookie_name $my_hash_key
{
    ""      $remote_addr;
    default  $cookie_my_cookie_name;
}
upstream {
    hash $my_hash_key consistent;
}

不过,我认为你在问题中描述的内容并不能很好地满足大多数目的。一旦设置了 cookie,上游就可能会发生变化 - 这可能意味着用户在设置 cookie 后就会被转移到没有缓存其历史记录的上游。

相反,考虑将哈希键映射到类似于 IPv4/IPv6 地址的合理大小前缀,并默认使用相同的 cookie 机制,因此默认情况下和基于 cookie 分配的上游最初解析为相同的值。

相关内容