Tomcat會話保持

Tomcat

Tomcat 服務(wù)器是一個免費的開放源代碼的Web 應用服務(wù)器,屬于輕量級應用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP 程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 服務(wù)器,可利用它響HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務(wù)器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。
訣竅是,當配置正確時,Apache 為HTML頁面服務(wù),而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務(wù)器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態(tài)HTML的能力不如Apache服務(wù)器。目前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中;
簡單拓撲圖:



實驗環(huán)境:
三臺centos7
代理服務(wù)器:ip:172.16.250.111
TomcatA ip:192.168.18.98
TomcatB ip:192.168.18.99
為實驗環(huán)境順利進行,關(guān)閉防火墻,與SELinux。

一、Tomcat實現(xiàn)負載均衡,客戶端經(jīng)過代理進入tomcat
1.Nginx作為代理服務(wù)器:

1):在TomcatA,B安裝Tomcat的實驗環(huán)境及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 //創(chuàng)建相應目錄
//JSP WebAPP的組織結(jié)構(gòu):
//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 //創(chuàng)建一個測試頁
<%@ 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):設(shè)置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;   //監(jiān)聽端口 
        index index.jsp index.html;      //默認主頁
         location / {
        proxy_pass http://appsrvs/;    //代理
        }
}

測試:在Windows上測試時把域名解析成自己的主機

現(xiàn)在簡單的代理已經(jīng)完成。

2.HAproxy作為代理

tomcat A,B不需另外設(shè)置,只在代理服務(wù)器上做修改。
1).停止Nginx服務(wù)。

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

2)安裝haproxy

[root@centos7 ~]#yum -y install haproxy
[root@centos7 ~]#vim /etc/haproxy/haproxy.cfg //設(shè)置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不需另外設(shè)置,只在代理服務(wù)器上做修改。
1).停止haproxy服務(wù)。

[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代理服務(wù)
<proxy balancer://appsrvs>      //定義服務(wù)器組
        BalancerMember http://192.168.18.98:8080   //BalancerMember相當于Nginx的server
        BalancerMember http://192.168.18.99:8080
        ProxySet lbmethod=byrequests    //調(diào)度的方法輪循
</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)會話粘性的實現(xiàn)方法:

[root@centos7 ~]#vim /etc/httpd/conf.d/tomcat.conf  //配置httpd代理服務(wù)
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">  //添加名字區(qū)分
 <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)測試:


成功實現(xiàn)會話保持不變,即使后端不在同一服務(wù)器上。

三、 tomcat cluster將會話保存至memcached中;

memcached : 高性能、分布式的內(nèi)存對象緩存系統(tǒng). 無持久存儲功能;僅支持存儲流式化數(shù)據(jù);
準備環(huán)境:


memcached與tomcat 存于同一臺服務(wù)器。
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration下載相關(guān)的jar文件。
下載如下jar文件至各tomcat節(jié)點的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容器,并在其中創(chuàng)建一個會話管理器,如下所示:
[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端口

測試

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • tomcat的會話保持方式有三種:1、session sticky:會話粘滯,通過同一個客戶端的相關(guān)請求分發(fā)到同一...
    姜餅人_9e7b閱讀 2,121評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 目錄: HAProxy是什么 HAProxy的核心能力和關(guān)鍵特性 HAProxy的安裝和運行 使用HAProxy搭...
    kelgon閱讀 80,516評論 9 159
  • tomcat是一個servlet和jsp容器,可以解析java程序,所以web網(wǎng)站后臺需要解析java的一些動態(tài)網(wǎng)...
    fengkaipeng閱讀 862評論 0 1
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,787評論 11 349

友情鏈接更多精彩內(nèi)容