nginx負載均衡之基於客戶端cookie的會話保持


通過ip_hash做會話保持有一定的缺陷,這個是通過客戶端ip來實現。同一個網絡下眾多客戶端訪問服務器會被扔到同一台機器,再或者是CDN也 會導致負載不均衡。所以要實現通過客戶端cookie實現,包括F5、深信服設備其中的會話保持也是通過插入cookie值來實現會話保持。下次客戶端訪 問服務器,帶上本地cookie,nginx中的sticky模塊分析並扔到對應服務器中。

0 工作原理

Session Sticky 模塊在upstream 返回響應后,向客戶的瀏覽器寫入 Cookie ,默認名為route ,保存的內容是一個 md5 碼。
之后,模塊接收到客戶瀏覽器的請求時,就根據 route 來決定將請求轉發到 upstream中哪台服務器上。

軟件版本:

nginx-1.6.0
nginx-sticky-module-1.1

1 下載 Session Sticky

wget https://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz

2 安裝模塊

如果 Nginx 之前已經安裝了,可以通過 nginx -V 命令查看當時編譯的參數。在參數后面追加安裝 Session Sticky 模塊的參數,
避免影響之前 Nginx 已有模塊。
進入 nginx 源碼目錄,執行命令:
[root@localhost nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre-8.35 --with-zlib=/usr/local/zlib-1.2.8 --with-http_ssl_module --with-openssl=/usr/local/openssl-1.0.1c --add-module=/usr/local/src/nginx-sticky-module-1.1 
    [root@localhost nginx-1.6.0]# make 
    [root@localhost nginx-1.6.0]# make install 

 

make時報錯:

objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_misc.o] 錯誤 1

參考解決方法:

方法一:

nginx-1.5.x以上版本和nginx-sticky-module-1.1編譯會有點問題,應該是nginx新版本沒有相應的nginx- sticky-module,解決辦法是把nginx-sticky-module-1.1/ngx_http_sticky_misc.c的281行修 改為:


digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in), digest->data, len, 1);

方法二:

降低nginx版本為nginx-1.2.3編譯通過。

sticky模塊參數只用於upstream段中,並且不能和ip_hash同時存在。

 

支持的參數:

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以為任何的string字符,默認是route
domain:哪些域名下可以使用這個cookie
path:哪些路徑對啟用sticky,例如path/test,那么只有test這個目錄才會使用sticky做負載均衡
expires:cookie過期時間,默認瀏覽器關閉就過期,也就是會話方式。
no_fallbackup:如果設置了這個,cookie對應的服務器宕機了,那么將會返回502(bad gateway 或者 proxy error),建議不啟用。

配置參考(反向代理部分略過):

upstream apache {
 sticky name=srv_id expires=1h domain=.test.com path=/;
 
 server 192.168.5.4 max_fails=3 fail_timeout=20s;
 server 192.168.5.5 max_fails=3 fail_timeout=20s;
}

3 激活模塊

 upstream塊中添加 sticky; 即可激活Session Sticky模塊。

upstream {
sticky;
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}

 

4 參考資料

使用nginx sticky 模塊實現基於 cookie 的負載均衡
http://my.oschina.net/766/blog/156693

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM