Nginx
NGINX 負載均衡雜湊:如果存在則使用 cookie 值,如果不存在則使用 ip_hash
我試圖弄清楚如何在 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 分配的上游解析為相同的值,最初。