Tomcat会话保持

Tomcat

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。

实验:Tomcat的会话保持

(1) nginx + tomcat cluster, httpd(proxy_http_module)+tomcat cluster,httpd(proxy_ajp_module)+tomcat cluster;
(2) tomcat cluster升级为session cluster, 使用deltaManager;
(3) tomcat cluster将会话保存至memcached中;
简单拓扑图:



实验环境:
三台centos7
代理服务器:ip:172.16.250.111
TomcatA ip:192.168.18.98
TomcatB ip:192.168.18.99
为实验环境顺利进行,关闭防火墙,与SELinux。

一、Tomcat实现负载均衡,客户端经过代理进入tomcat
1.Nginx作为代理服务器:

1):在TomcatA,B安装Tomcat的实验环境及Tomcat。

[root@cnetos7 ~]#yum -y install java-1.8.0-openjdk-devel tomcat  tomcat-admin-webapps  tomcat-docs-webapp tomcat-lib tomcat-webapps
//这里yum安装 java-1.8.0-openjdk-devel安装包,能把java-1.8.0-openjdk,java-1.8.0-openjdk-headless主要包,作为依赖装上。
[root@cnetos7 ~]#java -version  //显示openjdk的版本
openjdk version "1.8.0_102"
OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

2):在TomcatA.B上修改配置文件。

[root@cnetos7 ~]#mkdir /usr/share/tomcat/webapps/test/{classes,lib,WEB-INF}  -pv //创建相应目录
//JSP WebAPP的组织结构:
//ROOT(/): webapps的根目录
//index.jsp:主页;
//...
//WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
//META-INF/:类似于WEB-INF/;
//classes/:类文件,当前webapp所提供的类;
//lib/:类文件,当前webapp所提供的类,被打包为jar格式
[root@cnetos7 tomcat]#cd /usr/share/tomcat/webapps/test
[root@cnetos7 test]#cat  index.jsp //创建一个测试页
<%@ page language="java" %>
<html>  
    <head><title>TomcatB</title></head>
        <body>  
            <h1><font color="blue">TomcatB.linux.acom</font></h1>
            <table align="centre" border="1">
                <tr>    
                    <td>Session ID</td>
                <% session.setAttribute("linux.com","linux.com"); %>
                    <td><%= session.getId() %></td>
                </tr>   
                <tr>    
                    <td>Created on</td>
                    <td><%= session.getCreationTime() %></td>
                </tr>   
            </table>
        </body>
</html> 
同样的操作在TomcatA上操作一次
[root@cnetos7 ROOT]#systemctl start tomcat //TomcatA.B启动Tomcat
[root@cnetos7 ROOT]#ss -ntl 查看相应端口是否打开 tomcat 端口8080

测试是否正常运行Tomcat




3):设置Nginx代理
安装并测试

[root@centos7 ~]#yum -y install nginx //安装Nginx
[root@centos7 ~]#vim /etc/nginx/nginx.conf //编辑Nginx的配置文件
添加如下信息:
upstream appsrvs {                         //添加组
        server 192.168.18.98:8080;
        server 192.168.18.99:8080;
    }
[root@centos7 ~]#vim /etc/nginx/conf.d/tomcat.conf //添加一个主机  
server {
        server_name www.linux.com;    //主机名
        listen 80;   //监听端口 
        index index.jsp index.html;      //默认主页
         location / {
        proxy_pass http://appsrvs/;    //代理
        }
}

测试:在Windows上测试时把域名解析成自己的主机

现在简单的代理已经完成。

2.HAproxy作为代理

tomcat A,B不需另外设置,只在代理服务器上做修改。
1).停止Nginx服务。

[root@centos7 ~]#systemctl stop nginx
[root@centos7 ~]#ss -ntl

2)安装haproxy

[root@centos7 ~]#yum -y install haproxy
[root@centos7 ~]#vim /etc/haproxy/haproxy.cfg //设置haproxy配置文件
frontend http-in
        bind *:80
        default_backend appsrvs
backend appsrvs
    balance     roundrobin
    server  app1 192.168.18.98:8080 check
    server  app2 192.168.18.99:8080 check
listen stats
        bind *:8008
        stats enable

测试;




这里通过ip访问,如需通过域名,需在TomcatA,B的server.xml定义主机及相同的主机名,上面Nginx通过域名访问的是默认配置文件下新建的一个test目录。如下:

[root@centos7 ~]#vim /etc/tomcat/server.xml  添加如下信息   
<Host name="www.linux.com"  appBase="/data/webapps/"
            unpackWARs="true" autoDeploy="true">
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="linux_access_log." suffix=".log"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
[root@centos7 ~]#mkdir /data/webapps/ROOT -pv
[root@centos7 ~]#cp -r /usr/share/tomcat/webapps/test/*  /data/webapps/ROOT
在TomcatA.B相同的操作
3.httpd作为代理

tomcat A,B不需另外设置,只在代理服务器上做修改。
1).停止haproxy服务。

[root@centos7 ~]#systemctl stop haproxy
[root@centos7 ~]#ss -ntl

2)安装httpd

[root@centos7 ~]#yum -y install httpd
[root@centos7 ~]#httpd  -M  //查看相应模块是否已加载
1.tomcat cluster:http connector //对应相应模块
httpd: proxy_module, proxy_http_module, proxy_balancer_module
2.tomcat cluster:ajp connector /对应相应模块
httpd: proxy_module, proxy_ajp_module, proxy_balancer_module

3)配置httpd

[root@centos7 ~]#vim /etc/httpd/conf.d/tomcat.conf  //配置httpd代理服务
<proxy balancer://appsrvs>      //定义服务器组
        BalancerMember http://192.168.18.98:8080   //BalancerMember相当于Nginx的server
        BalancerMember http://192.168.18.99:8080
        ProxySet lbmethod=byrequests    //调度的方法轮循
</Proxy>
<VirtualHost *:80>
        ServerName www.linux.com
        ProxyVia On
        ProxyRequests Off  
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
                ProxyPass / balancer://appsrvs/
                ProxyPassReverse / balancer://appsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
[root@centos7 ~]#systemctl restart httpd

4)测试:




成功代理;
5)会话粘性的实现方法:

[root@centos7 ~]#vim /etc/httpd/conf.d/tomcat.conf  //配置httpd代理服务
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://appsrvs>
        BalancerMember http://192.168.18.98:8080 route=TomcatA loadfactor=1
        BalancerMember http://192.168.18.99:8080 route=TomcatB loadfactor=1
        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID   //定义cookie会话信息
</Proxy>
<VirtualHost *:80>
        ServerName www.linux.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
                ProxyPass / balancer://appsrvs/
                ProxyPassReverse / balancer://appsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
[root@centos7 ~]#systemctl restart httpd
[root@centos7 ~]#ss -ntl

6)测试



7)使用tomcat cluster:ajp connector
只需改动:

[root@centos7 ~]#vim /etc/httpd/conf.d/tomcat.conf  
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://appsrvs>
        BalancerMember ajp://192.168.18.98:8009 route=TomcatA loadfactor=1   //ajp
        BalancerMember ajp://192.168.18.99:8009 route=TomcatB loadfactor=1
        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID  
</Proxy>
<VirtualHost *:80>
        ServerName www.linux.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
                ProxyPass / balancer://appsrvs/
                ProxyPassReverse / balancer://appsrvs/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
[root@centos7 ~]#systemctl restart httpd
[root@centos7 ~]#ss -ntl
二、tomcat cluster升级为session cluster, 使用deltaManager;

1.配置TomcatA.B主配置文件:
查看官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

[root@cnetos7 ~]#vim /etc/tomcat/server.xml
 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB">  //添加名字区分
 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context path="/test" docBase="test" reloadable="true" />  //路径,没有写可能会报错
                <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.27.27.4"   //多播段可视情况修改
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.18.99"   //这里写自己的ip
                      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>
在Host下添加上面这段
cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/test/WEB-INF/  
 //复制web.xml文件 在里面添加<distributable/> 元素

相同的操作在TomcatA上操作一遍
注意:CentOS 7上的tomcat自带的文档中的配置示例有语法错误;

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

2)测试:


成功实现会话保持不变,即使后端不在同一服务器上。

三、 tomcat cluster将会话保存至memcached中;

memcached : 高性能、分布式的内存对象缓存系统. 无持久存储功能;仅支持存储流式化数据;
准备环境:


memcached与tomcat 存于同一台服务器。
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration下载相关的jar文件。
下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。
memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar
1.安装 memcached

[root@cnetos7 ~]#yum -y install memcached
分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:
[root@cnetos7 ~]#vim /etc/tomcat/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tcB">
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      <Context path="/test" docBase="test" reloadable="true">
              <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                memcachedNodes="n1:192.168.18.99:11211,n2:192.168.18.100:11211"
                failoverNodes="n1"
                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
              />
             </Context>
[root@cnetos7 ~]#systemctl restart tomcat
[root@cnetos7 ~]#systemctl start memcached
[root@cnetos7 ~]#ss -ntl //查看相应的11211端口

测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • tomcat的会话保持方式有三种:1、session sticky:会话粘滞,通过同一个客户端的相关请求分发到同一...
    姜饼人_9e7b阅读 1,909评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 目录: HAProxy是什么 HAProxy的核心能力和关键特性 HAProxy的安装和运行 使用HAProxy搭...
    kelgon阅读 79,755评论 9 159
  • tomcat是一个servlet和jsp容器,可以解析java程序,所以web网站后台需要解析java的一些动态网...
    fengkaipeng阅读 789评论 0 1
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,192评论 11 349