Nginx

NGINX 負載均衡雜湊:如果存在則使用 cookie 值,如果不存在則使用 ip_hash

  • June 24, 2021

我試圖弄清楚如何在 NGINX 的upstream負載平衡指令中執行一些 if-else 邏輯。基本上,我想使用以下方法:

hash $cookie_my_cookie_name consistent;

如果cookie ( my_cookie_name) 存在。如果該cookie存在,那麼我希望上游選擇方法回退到內置:

ip_hash;

我無法在 NGINX 的文件中的任何地方找到有關如何“嘗試”一種上游選擇方法的範例,如果這種方法不起作用,請選擇另一種方法。

我擔心但擔心的情況是,如果 cookie 不存在,則$cookie_my_cookie_name變數(至少在日誌中)插入到-,這一個字元串,但總是會散列到同一個上游伺服器,這正是我不想要。(因此測試需要針對不存在 cookie,如果存在,將始終保持“好”值。)

有任何想法嗎?

您應該能夠使用一個或多個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 分配的上游解析為相同的值,最初。

引用自:https://serverfault.com/questions/1039128