2014-11-04 28 views
2

是否可以在NGINX或其他負載平衡器中定義自定義路由? 也就是說我有一個cookie或一個標題,並根據它的值決定選擇哪個後端服務器? 我需要一些非常簡單的邏輯 - 值A1,A2,A3 - 服務器A,值B1,B2到服務器B,其他所有到服務器C負載均衡器中的自定義路由

回答

3

如果你需要一些粘性會話,有開源的第三方模塊可以用nginx做到這一點,而本地實現是商業訂閱的一部分。另外,由阿里巴巴開發的nginx的開源中文分支tengine可以做到這一點。

如果您想以自定義方式執行此操作,請使用地圖avoid processing a chain of if blocks來處理所有請求。這對於可讀性也更好。例如,使用cookie:

map $cookie_mycookie $node { 
    "~^a[1-3]$" "A"; 
    "~^b[1-2]$" "B"; 
    default  "C"; 
} 

server { 

    location/{ 
     proxy_pass http://$node; 
    } 

} 
+0

我不需要粘滯會話。客戶端將設置一個cookie(比如客戶ID),我想將任何客戶重定向到特定的服務器! – 2014-11-04 18:28:40

+1

@PavelBernshtam你真的看過我的回答嗎?!我在兩個第一句話中談到了粘性會話,我想你在那之後就不再讀書了。 – 2014-11-04 19:29:49

+2

哦,對不起。你是對的! – 2014-11-04 20:34:14

6

在nginx的你可以簡單地通過這樣做,如果:

location/{ 
    if ($http_cookie ~* "yourcookiename=a") { 
     proxy_pass http://upstream_a; 
     break; 
    } 
    if ($http_cookie ~* "yourcookiename=b") { 
     proxy_pass http://upstream_b; 
     break; 
    } 
    proxy_pass http://upstream_c; 
} 

這是簡單的正則表達式,所以這樣如果「yourcookiename」的值爲a1,a2等,它會去uprstream_a等等。 希望它有幫助...