nginx负载均衡到tomcat-session同步

节点分布:
    sniper5:nginx服务器、tomcat服务器
    sniper6:tomcat服务器

1、安装nginx
2、配置nginx.conf,关键配置

    #webapp    负载均衡配置,默认轮询
    upstream web_app {          
    server sniper5:8080 weight=1 max_fails=2 fail_timeout=30s;        
    server sniper6:8080 weight=1 max_fails=2 fail_timeout=30s;       
    }  

        #所有的带有.jsp的请求都跳转到负载均衡的tomcat列表

        location ~ \.jsp {
            proxy_set_header X-real-ip $remote_addr;
            proxy_pass http://web_app;
        }

tomcat配置session同步:

每个节点在Engine下面添加如下信息:
<Engine name="Catalina" defaultHost="localhost">
      
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

          <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"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>

                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
       </Cluster>

在应用的web.xml加入如下配置:
<distributable/>

测试:
在ROOT下新建test.jsp文件
节点sniper5内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Page</title>
</head>
<body>
<%
                Object obj = "";
                String del = request.getParameter("del");
                if(null != del && !del.trim().equals("")) {
                        session.removeAttribute("aa");
                } else {
                        obj = session.getAttribute("aa");
                    if(obj == null) {
                        session.setAttribute("aa", "haha");
                    }
                }

                out.println(obj+"=================");
        %>
sniper5 Page!!!<br/>
remote ip :  <%-- <%=request.getHeader("X-real-ip") %> --%> <br/>
nginx server ip : <%=request.getRemoteAddr()%>
</body>
</html>

节点sniper6内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Page</title>
</head>
<body>
<%
Object obj = "";
                String del = request.getParameter("del");
                if(null != del && !del.trim().equals("")) {
                        session.removeAttribute("aa");
                } else {
                    obj = session.getAttribute("aa");
                }

                out.println(obj+"=================");
%>
sniper6 Page!!!<br/>
remote ip :  <%-- <%=request.getHeader("X-real-ip") %> --%> <br/>
nginx server ip : <%=request.getRemoteAddr()%>
</body>
</html>

测试步骤:
    访问nginx节点,http://sniper5/test.jsp
    首次如果跳转到节点sniper5,就会在session中创建aa属性值
    在第二次跳转到节点sniper6的时候,如果从session能够取出aa属性值就说明session同步成功





你可能感兴趣的:(nginx负载均衡到tomcat-session同步)