在多台后台服务器的环境下,为了保证一个客户端只与一台服务器通信,我们必须使用长连接。这种连接是用什么方法实现的呢?通常使用Nginx自带的ip_hash。我认为这绝对不是一个好办法。如果前端是CDN,或者局域网中的客户端同时访问服务器,就会出现服务器。分布不均衡,不能保证每次访问都停留在同一台服务器上。如果是基于cookies,考虑一下。每台计算机都会有不同的cookie。在保持长连接的同时,也保证了服务器的压力平衡。Nginxsticky值得推荐。如果浏览器不支持cookies,那么sticky就不会生效。毕竟整个模块都是为cookies实现的。一、Nginxsticky模块工作流程图Nginxsticky二、下载安装nginxsticky下载地址:http://code.google.com/p/nginx-sticky-module/downloads/list目前有2个版本,一个是1.0,另一个是1.1,1.0已经走到尽头了。1.1增加了权重参数。安装Nginx+粘性模块#wgethttp://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz#tar-xzvfnginx-sticky-module-1.1.tar.gz#wgethttp://nginx.org/download/nginx-1.0.6。tar.gz#tar-czvfnginx-1.0.6#cdnginx-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#makeinstall3,配置Nginxstickynginxupstream使用sticky,如下upstreamcluster_test{sticky;服务器192.168.100.209:80;服务器192.168.100.225:80;}配置虚拟主机(下面的配置可以忽略)server{listen80;server_nametest.ttlsa.com;索引索引.jsp;access_log/data/logs/nginx/test.ttlsa.com_access.logmain;设置$proxy_passcluster_test;proxy_passhttp://$proxy_pass;includeproxy.c开;add_headerCache-Controlno-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-sreload#p#5,测试Nginxsticky我的后端是两台tomcat服务器,每台服务器的JESSIONEDValues有特殊的旗帜。比如209就是s209,225就是s225。打开页面,无论你怎么刷新JESSIONED的值,它都不会变。但是如果启用了粘性,你可以看到JESSIONED值不会改变。它卡在其中一个上。在服务器上。测试图如下:在使用sticky的情况下,不管怎么刷新都是下图。Nginxsticky模块不使用Nginxsticky模块。概率,但肯定会变),如下图Nginxstickymodule备注:每台后端realserver都会有一个唯一的route值,所以无论你的前端安装了多少个stickynginxproxy真正的服务器,他不会变。此cookie是基于会话的,因此当您的浏览器关闭时,服务器会将您重新分配给另一台服务器。6.Nginxsticky其他语法sticky[name=route][domain=.foo.bar][path=/][expires=1h][hash=index|md5|sha1][no_fallback];name:可以是任意字符串字符,默认为routedomain:哪些域名可以使用这个cookiepath:哪些路径对启用sticky,比如path/test,那么只有test的目录才会使用sticky做负载均衡expires:cookie过期时间,默认浏览器关闭Expiration,即session模式。no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,会返回502(badgateway或者proxyerror),建议不要启用7、Nginxstickyexpiresusageupstreamcluster_test{stickyexpires=1h;服务器192.168.100.209:80;服务器192.168.100.225:80;}启用过期,cookie如下图所示,cookie在1小时后过期。Nginxstickyexpire的使用方法如下:不启用expiredNginxsticky,不启用expire8,Nginxsticky使用注意事项Nginxsticky模块不能与ip_hash一起使用官方文档:http://code.google.com/p/nginx-sticky-module/wiki/Documentation淘宝贴:http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html(感谢shudu)原文链接:http://www.ttlsa.com/html/1895.html