1

nginx tomcat Session Replication

STEP 1. 配置 web.xml

在工程中的 web.xml 文件的 <web-app> 节点中新增节点 <distributable/>,如果使用本文章中的测试 war 包则可忽略此步骤,该 war 包已经配置了此项

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <distributable/>
</web-app>

STEP 2. Tomcat 中集群配置

2.在每个tomcat 中的server.xml文件中<Engine>节点中新增下面内容,并且修改新增内容中Receiver节点address属性为当前机器ip

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
      <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/>
      <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService"
            address="228.0.0.4"
            port="45564" frequency="500"
            dropTime="3000"/>            
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">              
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
        </Sender>         
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
            address="10.88.44.199" port="4000" autoBind="100"
            selectorTimeout="5000" maxThreads="6"/>                      
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>           
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>                        
      </Channel>
       
      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" />     
      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />     
</Cluster>

STEP 3. 部署安装包,启动tomcat

将提供的 war 包或者自己的程序部署到 tomcat 的 webapps 下,每个 tomcat 都要部署,依次启动tomcat,注意不要一起启动,要挨个启动,等待上一个tomcat启动完毕再启动下一个,看到图下 log 则证明 session replication部署成功
image.png
ps:
确保 session 中的属性都是都要实现 java.io.Serializable
tomcat 节点不超过 5 个

STEP 4. nginx中配置

配置 nginx 中 conf 文件,如下

upstream tomcat{
    ip_hash;
    server localhost:10010;#tomcat节点一
    server localhost:10000;#tomcat节点二
}
server {
  listen 88;
  server_name  10.88.44.199;
  location / {
    root html;
    index index.html index.htm;
    proxy_pass http://tomcat;
    proxy_redirect off;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-PORT $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    }
}

STEP 5. 测试

安装提供war 测试

如果使用提供 war 包,则进行如下测试:

  1. 前端访问访问网站http://10.88.44.199:88/session-replication-demo/setSession?id=1
  2. 看到 sessionid 为如下内容
    image.png
  3. 发现后端路由到10000节点上,关闭10000节点
    image.png
  4. 再次访问网站,发现已经路由到了10011节点上,而sessionid 没有改变,测试成功
    image.png
    image.png

自己项目测试

如果自己的项目则按如下原理进行测试:
1.访问 nginx 前端,查看sessionid ,记录下来
2.查看发送到哪个 tomcat 上,停止tomcat
3.再次访问网站,查看 sessionid 是否改变,如果没有改变则证明 session 复制成功


carol_gao
88 声望1 粉丝