歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 使用nginx sticky模塊實現基於cookie的負載均衡

使用nginx sticky模塊實現基於cookie的負載均衡

日期:2017/2/27 15:57:59   编辑:Linux教程
多台後台服務器的環境下,我們為了確保一個客戶只和一台服務器通信,我們勢必使用長連接。使用什麼方式來實現這種連接呢,常見的有使用nginx 自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個局域網的客戶同時訪問服務器,導致出現服務器分配不均衡,以及不能 保證每次訪問都粘滯在同一台服務器。如果基於cookie會是一種什麼情形,想想看, 每台電腦都會有不同的cookie,在保持長連接的同時還保證了服務器的壓力均衡,nginx sticky值得推薦。

如果浏覽器不支持cookie,那麼sticky不生效,畢竟整個模塊是給予cookie實現的.

1、nginx sticky 模塊工作流程圖 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模塊
# wget http://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
# tar -xzvf nginx-sticky-module-1.1.tar.gz

# wget http://nginx.org/download/nginx-1.0.6.tar.gz
# tar -czvf nginx-1.0.6
# cd nginx-1.0.6
# ./configure --prefix=/usr/local/nginx-1.0.6 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-sticky-module-1.1
# make && # make install

3、配置nginx sticky
nginx的upstream使用sticky,如下
upstream cluster_test {
     sticky;
     server 192.168.100.209:80;
     server 192.168.100.225:80;
}
配置虛擬主機(以下有配置的可以忽略掉)
server {
        listen        80;
        server_name     test.ttlsa.com;
        index index.jsp;

        access_log /data/logs/nginx/test.ttlsa.com_access.log main;

        set $proxy_pass cluster_test;

        location /
        {
                proxy_pass http://$proxy_pass;
                include proxy.conf;
                add_header Cache-Control no-store;
        }
}
備注:
nginx和apache不同,nginx每次安裝一個新的模塊都需要重新編譯一次,編譯完成之後將nginx這一個文件拷貝到sbin下面即可.我這邊 全新安裝一次,因為公司在兩年前就選擇了這個nginx版本,也沒打算去換,所以大家可以把nginx換成自己最合適的一個版本,不用完全跟著文章來安 裝.

4、重啟nginx
/usr/local/nginx-1.0.6/sbin/nginx -t
/usr/local/nginx-1.0.6/sbin/nginx -s reload

5、測試nginx sticky
我後端是兩台tomcat服務器,每台服務器的JESSIONED值都有特殊的標志。比如209這台是s209,225這台是s225.打開頁面,不管怎麼 刷新JESSIONED值都是不變.但是如果開啟了sticky,可以看到JESSIONED值不會發生變化.死死的粘滯在其中一台服務器上.測試圖如 下:

使用sticky的情況下,不管怎麼刷新都是下面圖 nginx sticky 模塊
不使用nginx sticky模塊,多刷幾次就變了(有時候刷一次,有時候多刷幾次,看概率,不過肯定會變),如下圖 nginx sticky模塊
備注:每台後端真實服務器都會有一個唯一的route值,所以不管你真實服務器前端有幾個裝了sticky的nginx代理,他都是不會變化的. 這個cookie是會話方式的,所以你浏覽器關閉了,服務器會給你重新分配一台服務器。

6、nginx sticky其他語法
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),建議不啟用

7、nginx sticky expires用法
upstream cluster_test {
     sticky expires=1h;
     server 192.168.100.209:80;
     server 192.168.100.225:80;
}
啟用了過期,cookie如下截圖,cookie1個小時才過期 nginx sticky expire用法
如下是不啟用過期 nginx sticky 不啟用expire
8、nginx sticky使用注意事項
nginx sticky模塊不能與ip_hash同時使用

官方文檔:http://code.google.com/p/nginx-sticky-module/wiki/Documentation
淘寶sticky:http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html(謝謝shudu)
轉自:http://www.ttlsa.com/html/1895.html
Copyright © Linux教程網 All Rights Reserved