欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx 集群session复制 博客分类: nginx  

程序员文章站 2024-02-26 08:56:28
...
原来写过一篇,为了加深理解,再写一篇
session分为
session replication 策略是复制会话,即一个用户访问了一次就把session复制到所有的服务器或这一部分服务器。
这样的好处是如果正访问的服务器down了用户可以自动被转到别的服务器session不丢失。缺点当然是效率低。
session sticky策略则是不复制,一个用户访问了一次后,同一个session周期内,所有的请求都定向到这个服务器,down了session就丢了。


问题解决
1)ip_hash
upstream backend { 
    server 172.16.3.10:8080 ; 
    server 172.16.3.11:9090 ; 
    ip_hash; 
    } 


不推荐使用:
1/ nginx不是最前端的服务器。
   ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
    2/ nginx的后端还有其它方式的负载均衡。
   假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。
   3/ 多个外网出口。
    很多公司上网有多个出口,多个ip地址,用户访问互联网时候自动切换ip。而且这种情况不在少数。使用 ip_hash 的话对这种情况的用户无效,无法将某个用户绑定在固定的tomcat上 。
使用:
2)nginx_upstream_jvm_route(nginx扩展,推荐使用)
nginx_upstream_jvm_route 是一个nginx的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。
简单来说,它是基于cookie中的JSESSIONID来决定将请求发送给后端的哪个server,nginx_upstream_jvm_route会在用户第一次请求后端server时,将响应的server标识绑定到cookie中的JSESSIONID中,从而当用户发起下一次请求时,nginx会根据JSESSIONID来决定由哪个后端server来处理。
1/ nginx_upstream_jvm_route安装
下载地址(svn):http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/
假设nginx_upstream_jvm_route下载后的路径为/usr/local/nginx_upstream_jvm_route,
(1)进入nginx源码路径
patch -p0 < /usr/local/nginx_upstream_jvm_route/jvm_route.patch
(2)./configure  --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/nginx --with-pcre=/usr/local/pcre-8.33 --add-module=/usr/local/nginx_upstream_jvm_route
(3)make & make install

upstream  tomcats_jvm_route
        {
             # ip_hash; 
              server   192.168.33.10:8090 srun_id=tomcat01; 
              server   192.168.33.11:8090 srun_id=tomcat02;
              jvm_route $cookie_JSESSIONID|sessionid reverse;
        }


修改tomcat配置server.xml

将
<Engine name="Catalina" defaultHost="localhost" >
修改为:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat01">


具体配置参考
[url]
http://hanqunfeng.iteye.com/blog/1920994
[/url]