我正在尝试弄清楚如何在 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 分配的上游最初解析为相同的值。