使用Nginx sticky模塊實(shí)現(xiàn)基于cookie的負(fù)載均衡
在多臺(tái)后臺(tái)服務(wù)器的環(huán)境下,我們?yōu)榱舜_保一個(gè)客戶只和一臺(tái)服務(wù)器通信,我們勢(shì)必使用長(zhǎng)連接。使用什么方式來實(shí)現(xiàn)這種連接呢,常見的有使用Nginx 自帶的ip_hash來做,我想這絕對(duì)不是一個(gè)好的辦法,如果前端是CDN,或者說一個(gè)局域網(wǎng)的客戶同時(shí)訪問服務(wù)器,導(dǎo)致出現(xiàn)服務(wù)器分配不均衡,以及不能 保證每次訪問都粘滯在同一臺(tái)服務(wù)器。如果基于cookie會(huì)是一種什么情形,想想看, 每臺(tái)電腦都會(huì)有不同的cookie,在保持長(zhǎng)連接的同時(shí)還保證了服務(wù)器的壓力均衡,Nginx sticky值得推薦。
如果瀏覽器不支持cookie,那么sticky不生效,畢竟整個(gè)模塊是給予cookie實(shí)現(xiàn)的.
1、Nginx sticky 模塊工作流程圖
2、下載安裝nginx sticky
下載地址:http://code.google.com/p/nginx-sticky-module/downloads/list
目前共有2個(gè)版本,一個(gè)是1.0,一個(gè)是1.1,1.0已經(jīng)壽終正寢了.1.1增加了權(quán)重的參數(shù).
安裝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;
- }
配置虛擬主機(jī)(以下有配置的可以忽略掉)
- 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每次安裝一個(gè)新的模塊都需要重新編譯一次,編譯完成之后將Nginx這一個(gè)文件拷貝到sbin下面即可.我這邊 全新安裝一次,因?yàn)楣驹趦赡昵熬瓦x擇了這個(gè)Nginx版本,也沒打算去換,所以大家可以把Nginx換成自己最合適的一個(gè)版本,不用完全跟著文章來安 裝。
4、重啟Nginx
- /usr/local/nginx-1.0.6/sbin/nginx -t
- /usr/local/nginx-1.0.6/sbin/nginx -s reload
#p#
5、測(cè)試Nginx sticky
我 后端是兩臺(tái)tomcat服務(wù)器,每臺(tái)服務(wù)器的JESSIONED值都有特殊的標(biāo)志。比如209這臺(tái)是s209,225這臺(tái)是s225.打開頁面,不管怎么 刷新JESSIONED值都是不變.但是如果開啟了sticky,可以看到JESSIONED值不會(huì)發(fā)生變化.死死的粘滯在其中一臺(tái)服務(wù)器上.測(cè)試圖如 下:
使用sticky的情況下,不管怎么刷新都是下面圖
不使用Nginx sticky模塊,多刷幾次就變了(有時(shí)候刷一次,有時(shí)候多刷幾次,看概率,不過肯定會(huì)變),如下圖
備注:每臺(tái)后端真實(shí)服務(wù)器都會(huì)有一個(gè)唯一的route值,所以不管你真實(shí)服務(wù)器前端有幾個(gè)裝了sticky的nginx代理,他都是不會(huì)變化的. 這個(gè)cookie是會(huì)話方式的,所以你瀏覽器關(guān)閉了,服務(wù)器會(huì)給你重新分配一臺(tái)服務(wù)器。
6、Nginx sticky其他語法
- sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
- name: 可以為任何的string字符,默認(rèn)是route
- domain:哪些域名下可以使用這個(gè)cookie
- path:哪些路徑對(duì)啟用sticky,例如path/test,那么只有test這個(gè)目錄才會(huì)使用sticky做負(fù)載均衡
- expires:cookie過期時(shí)間,默認(rèn)瀏覽器關(guān)閉就過期,也就是會(huì)話方式。
- no_fallbackup:如果設(shè)置了這個(gè),cookie對(duì)應(yīng)的服務(wù)器宕機(jī)了,那么將會(huì)返回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個(gè)小時(shí)才過期
Nginx sticky expire用法
如下是不啟用過期
Nginx sticky 不啟用expire
8、Nginx sticky使用注意事項(xiàng)
Nginx sticky模塊不能與ip_hash同時(shí)使用
官方文檔:http://code.google.com/p/nginx-sticky-module/wiki/Documentation
淘寶sticky:http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html(謝謝shudu)