在多臺後臺服務器的環境下,咱們爲了確保一個客戶只和一臺服務器通訊,咱們勢必使用長鏈接。使用什麼方式來實現這種鏈接呢,常見的有使用nginx 自帶的ip_hash來作,我想這絕對不是一個好的辦法,若是前端是CDN,或者說一個局域網的客戶同時訪問服務器,致使出現服務器分配不均衡,以及不能 保證每次訪問都粘滯在同一臺服務器。若是基於cookie會是一種什麼情形,想一想看, 每臺電腦都會有不一樣的cookie,在保持長鏈接的同時還保證了服務器的壓力均衡,nginx sticky值得推薦。 html
若是瀏覽器不支持cookie,那麼sticky不生效,畢竟整個模塊是給予cookie實現的. 前端
下載地址:http://code.google.com/p/nginx-sticky-module/downloads/list
目前共有2個版本,一個是1.0,一個是1.1,1.0已經壽終正寢了.1.1增長了權重的參數. nginx
安裝nginx + sticky模塊 apache
# 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
三、配置nginx sticky 後端
nginx 的upstream使用sticky,以下 瀏覽器
upstream cluster_test { sticky; server 192.168.100.209:80; server 192.168.100.225:80; }
配置虛擬主機(如下有配置的能夠忽略掉) tomcat
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換成本身最合適的一個版本,不用徹底跟着文章來安 裝. bash
/usr/local/nginx-1.0.6/sbin/nginx -t /usr/local/nginx-1.0.6/sbin/nginx -s reload
我 後端是兩臺tomcat服務器,每臺服務器的JESSIONED值都有特殊的標誌。好比209這臺是s209,225這臺是s225.打開頁面,無論怎麼 刷新JESSIONED值都是不變.可是若是開啓了sticky,能夠看到JESSIONED值不會發生變化.死死的粘滯在其中一臺服務器上.測試圖如 下: 服務器
使用sticky的狀況下,無論怎麼刷新都是下面圖 cookie
不使用nginx sticky模塊,多刷幾回就變了(有時候刷一次,有時候多刷幾回,看機率,不過確定會變),以下圖
備註:每臺後端真實服務器都會有一個惟一的route值,因此無論你真實服務器前端有幾個裝了sticky的nginx代理,他都是不會變化的. 這個cookie是會話方式的,因此你瀏覽器關閉了,服務器會給你從新分配一臺服務器。
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 cluster_test { sticky expires=1h; server 192.168.100.209:80; server 192.168.100.225:80; }
啓用了過時,cookie以下截圖,cookie1個小時才過時
以下是不啓用過時
nginx sticky模塊不能與ip_hash同時使用
哥們,這是我博客原文:使用nginx sticky模塊實現基於cookie的負載均衡 連接失效,點這個:http://www.ttlsa.com/html/1895.html 官方文檔:http://code.google.com/p/nginx-sticky-module/wiki/Documentation 淘寶sticky:http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html(謝謝shudu)