使用nginx sticky實現基于cookie的負載均衡(轉)
轉自http://www.ttlsa.com/nginx/nginx-modules-nginx-sticky-module/
在多臺后臺服務器的環境下,我們為了確保一個客戶只和一臺服務器通信,我們勢必使用長連接。使用什么方式來實現這種連接呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個局域網的客戶同時訪問服務器,導致出現服務器分配不均衡,以及不能保證每次訪問都粘滯在同一臺服務器。如果基于cookie會是一種什么情形,想想看, 每臺電腦都會有不同的cookie,在保持長連接的同時還保證了服務器的壓力均衡,nginx sticky值得推薦。
如果瀏覽器不支持cookie,那么sticky不生效,畢竟整個模塊是給予cookie實現的.
1、nginx sticky 模塊工作流程圖
2、下載安裝nginx sticky
下載地址:http://code.google.com/p/nginx-sticky-module/downloads/list
目前共有2個版本,一個是1.0,一個是1.1,1.0已經壽終正寢了.1.1增加了權重的參數.
安裝nginx + sticky模塊
3、配置nginx sticky
nginx 的upstream使用sticky,如下
配置虛擬主機(以下有配置的可以忽略掉)
備注:
nginx和apache不同,nginx每次安裝一個新的模塊都需要重新編譯一次,編譯完成之后將nginx這一個文件拷貝到sbin下面即可.我這邊全新安裝一次,因為公司在兩年前就選擇了這個nginx版本,也沒打算去換,所以大家可以把nginx換成自己最合適的一個版本,不用完全跟著文章來安裝.
4、重啟nginx
5、測試nginx sticky
我后端是兩臺tomcat服務器,每臺服務器的JESSIONED值都有特殊的標志。比如209這臺是s209,225這臺是s225.打開頁面,不管怎么刷新JESSIONED值都是不變.但是如果開啟了sticky,可以看到JESSIONED值不會發生變化.死死的粘滯在其中一臺服務器上.測試圖如下:
使用sticky的情況下,不管怎么刷新都是下面圖
不使用nginx sticky模塊,多刷幾次就變了(有時候刷一次,有時候多刷幾次,看概率,不過肯定會變),如下圖
備注:每臺后端真實服務器都會有一個唯一的route值,所以不管你真實服務器前端有幾個裝了sticky的nginx代理,他都是不會變化的. 這個cookie是會話方式的,所以你瀏覽器關閉了,服務器會給你重新分配一臺服務器。
6、nginx sticky其他語法
7、nginx sticky expires用法
啟用了過期,cookie如下截圖,cookie1個小時才過期

nginx sticky expire用法
如下是不啟用過期

nginx sticky 不啟用expire
8、nginx sticky使用注意事項
nginx sticky模塊不能與ip_hash同時使用
轉摘請注明出處:http://www.ttlsa.com/html/1895.html
官方文檔:http://code.google.com/p/nginx-sticky-module/wiki/Documentation