Tomcat集群与Session共享 + Nginx负载

虽然曾经做过,却经常性忘记,特将其记录,以备后续查看。
相关资料:
Linux下Tomcat运行环境搭建详见另一片博文:http://blog.csdn.net/xiadi934/article/details/50911175
Tomcat7.0官方集群文档,具体细节参数请到该处查阅:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
Linux下搭建Nginx + Tomcat还有问题的请绕过。

思路

  1. 使用两台机器,本机(window,IP:192.168.1.108) + 虚拟机(Linux,IP:192.168.25.132)
  2. Linux上部署 nginx + tomcat7 + web,Window上部署 : tomcat7 + web
  3. 参考Tomcat官方集群例子, 采用Tomcat本身自带集群与Session共享

实现

  • Window上Tomcat下server.xml文件配置,其余配置均不变,只修改以下配置
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat127">
    <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="192.168.1.108" port="4000" autoBind="100" selectorTimeout="5000"
            maxThreads="6" /><!--本机局域网IP,端口默认-->

          <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>
 ...
 </Engine>
  • Linux上Tomcat下server.xml文件配置,其余配置均不变,加上同上配置
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat132">
    <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="192.168.25.132" port="4000" autoBind="100" selectorTimeout="5000"
            maxThreads="6" /><!-- 虚拟机的局域网IP -->
            ...
      </Cluster>
 ...
 </Engine>
  • 修改Nginx配置,加入负载均衡
upstream backendServer
{   
    ip_hash; #可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
    server 127.0.0.1:8080; #虚拟机本机Tomcat
    server 192.168.1.108:8080; #Window上Tomcat
}

server {
    #设置监听端口
    listen 80;
    charset utf-8;

    #设置服务器域名(IP访问和多域名访问可不设置)
    #server_name _*;
    #server_name  www.test.com;


    #开启shtml支持
    ssi on;
    ssi_silent_errors on;
    ssi_types text/shtml;


    #设置主访问日志
    #access_log logs/access.log main;
    access_log  /dev/null;

    error_page  404                  /404.html;
    error_page  500 502 503 504      /50x.html;

    location /
    {
        proxy_pass http://backendServer;
        include proxy.conf;
    }
}
  • 修改两个Tomcat下conf/web.xml,尾部加入以下代码
<distributable/> <!-- 允许Session分配 -->
  • 加入测试页面,在两个Tomcat/webapps下创建文件夹test,并创建index.jsp,代码如下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>首页</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    <p>sessionID:<%=session.getId() %></p>
    <p>session创建时间:<%=session.getCreationTime() %></p>
    <p>服务器IP:<%=request.getRemoteHost() %></p>
  </body>
</html>

测试

启动两个Tomcat,测试结果如下,则说明配置负载+集群+Session共享成功。
Nginx默认是就近IP访问本机Linux下tomcat,效果图如下
这里写图片描述
关闭Linux下的tomcat,刷新后,则是访问Window下tomcat
这里写图片描述
请注意查看Session的创建时间,是一致的说明成功了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值