设为首页 收藏本站
查看: 3435|回复: 0

[经验分享] Tomcat的基础知识和一些应用,session cluster和session server

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-4 08:25:20 | 显示全部楼层 |阅读模式
Tomcat简单来说就是JAVA 2 EE 加上Servlet和JSP类库的实现,tomcat=JWS(Sun)+ Jserv(ASF)
Tomcat的核心组件:
    catalina:servlet container
    Coyote:http connection
    Jasper:JSP Engine 执行引擎

    TomcatInstance: 运行中的tomcat进程(java进程)
        Server:即一个tomcat实例;
        Service:用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;
        Engine:Tomcat的核心组件,用于运行jsp或servlet代码;
        Connector:接入并解析用户请求,将请求映射为Engine中运行的代码;之后,将运行结果构建成响应报文;
        Host:类似httpd中的虚拟主机;
        Context:类似于httpd中的alias;

    注意:每个组件都由“类”来实现,有些组件的实现还不止一种;
        顶级类组件:server
        服务类组件:service
        容器类组件:即可以部署webapp的组件,engine,host, context
        连接器组件:connector
        被嵌套类组件:valve,logger, realm
  tomcat的主配置文件结构:
    <server>
     <service>
        <connector/>
        <connector/>
        ...
         <engine>
             <host>
               <context/>
              ...
            </host>
            ...
         </engine>
     </service>
    </server>
  Tomcat的目录结构:
    bin:脚本及启动时用到的类
    lib:类库
    conf:配置文件
    logs:日志文件
    webapps:应用程序默认部署目录
    work:工作目录
    temp:临时文件目录
  配置文件:
    server.xml:主配置文件
    context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置;
    web.xml:每个webapp“部署”之后才能被访问;此文件则用于为所有的webapp提供默认部署相关的配置;
    tomcat-users.xml:用户认证的账号和密码配置文件;
    catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
    catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;
    logging.properties:日志相关的配置信息;

CentOS7上默认提供的JDK是openJDK7,Tomcat7,这版本已经很新了,可以直接yum安装使用
要安装Tomcat首先要安装JDK,然后安装Tomcat,可以直接yum安装,也可以自己下载二进制格式的程序包进行安装,

下面我们自己下载二进制程序包进行安装,下载jdk-8u25-linux-x64.rpm,apache-tomcat-8.0.23.tar.gz(以下的演示都是在CentOS7下做的,如果你使用的不是CentOS7可能会有些不同)
然后直接rpm -ivh jdk-8u25-linux-x64.rpm 安装JDK,然后配置环境变量,编辑/etc/profile.d/java.sh文件加入exportJAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH 把JDK的路径加入到PATH变量中,使用java回车测试下,看JDK是否安装成功
wKiom1Y4h5iAFRxPAAA3ExXcFNM687.jpg
wKiom1Y4h7ODPkSnAAFf7VPS8BI448.jpg
如果出现这些信息等,就证明JDK装好了,环境变量也配置好了
然后安装tomcat,tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local
然后切入到/usr/local目录下,创建一个符号连接文件ln -sv apache-tomcat-8.0.23 tomcat
然后切入到tomcat目录下,不用修改什么就可以运行tomcat(/usr/local/tomcat/bin/catalina.sh start),但为了可以直接使用catalina.shstart运行,需要配置环境变量,编辑/etc/profile.d/tomcat.sh 加入exportCATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
wKiom1Y4h9iw8hZeAABH4Ohye3I183.jpg
然后使用catalina.sh start 就可以启动了,使用ss –tnl 就可以发现8080端口启用了
wKioL1Y4iBaTMIh-AAHugaJNMbs227.jpg
然后访问测试下
wKiom1Y4h_rREkoWAAPOtvaq1go472.jpg
可以看到web页面的管理界面了,里面的3个按钮是服务器资源和两个管理的应用程序
点下Manager这个按钮需要认证,现在你点击取消,会提示你在哪修改,然后才能访问
wKioL1Y4iHmQFEXLAAIMA5J_Pas004.jpg
wKiom1Y4iDzzvwJzAASsMSJrFFY836.jpg 编辑配置文件/usr/local/tomcat/conf/tomcat-users.xml,然后加入下面三行就可以使用这三个按钮的功能了
wKiom1Y4iGTSxG4LAABpkt1FwGs388.jpg
wKioL1Y4iKGzfm1QAAKyOKO3nBo469.jpg

Java WebAPP 组织结构:

    有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;
    例:/usr/local/tomcat/webapps/app1/
        /:webapp的根目录;
        WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml;
        META-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的context.xml;
        classes/:此webapp的私有类;
        lib/:此webapp的私有类,被打包为jar格式类;
        index.jsp:webapp的主页

  手动添加一个测试应用程序:
    创建webapp特有的目录结构;
     mkdir-pv myapp/{lib,classes,WEB-INF,META-INF}
wKioL1Y4iQHSZXP8AAAo5H_1QBQ939.jpg
    提供webapp各文件,WEB-INF中应有web.xml文件,META-INF中有context.xml文件,如果没有的话就会使用conf目录下默认的这两个文件;然后直接在myapp目录下创建一个index.jsp文件,编辑内容如下:
    <%@page language="java" %>
    <%@page import="java.util.*" %>
    <html>
      <head>
        <title>JSPTest Page</title>
      </head>
        <body>
           <%out.println("Hello world!"); %>
        </body>
    </html>
wKiom1Y4iiGjNYO5AACFPCaLdY8398.jpg
然后canalina.sh stop 等一会儿,然后在canalina.sh start;访问测试下
wKiom1Y4ii7gUMF5AABHSkMP3bg533.jpg
可以看到没有问题了
然后这个时候,查看tree /usr/local/tomcat/work
wKioL1Y4in-yU5cTAAA7hDooQkU707.jpg
可以看到这里面有.java文件和.class文件,这是JSP把index.jsp通过servlet转换成.java文件,然后通过complie编译成bytecodes自解码的.class文件,然后在JVM中运行

部署(deployment)webapp相关的操作:
    deploy:部署,将webapp的源文件旋转于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp; 将其特有类通过class loader装载至tomcat;
    有两种方式:
        自动部署:autodeploy
        手动部署:
        1、冷部署:把webapp复制到指定位置,而后才启动tomcat;
        2、热部署:在不停止tomcat的前提下进行的部分:
           部署工具:manager、ant脚本、tcd(tomcatclient deployer)等;
            undeploy:反部署,停止webapp,并从tomcat实例拆除其部分文件和部署名;
           stop:停止,不再向用户提供服务;但其文件和部署名会在tomcat实例中
           start:启动处于“停止”状态的webapp;
           redeploy:重新部署;
    tomcat自带的应用程序:
        managerapp: webapp管理工具
        hostmanager:Virtual Hosts管理工具
可以通过这两个工具来管理webapp应用程序和虚拟主机,实现应用程序的热部署等



tomcat启动是开启了3个端口一个是8080提供http连接器服务的,一个8005是一个管理端口,可以telnet进入然后关闭服务;还有一个8009端口是提供ajp连接器服务的
wKiom1Y4iu3xInlzAAIYUXbINYk272.jpg

Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。

定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
    1) HTTP连接器
    2) SSL连接器
    3) AJP 1.3连接器
    4)proxy(JK)连接器
自定义Host及Context示例:
  <Host name="web1.magedu.com"appBase="/data/webapps/"unpackWARs="true"autoDeploy="true">
    <Contextpath="" docBase="ROOT" reloadable="true">
        <ValveclassName="org.apache.catalina.valves.RemoteAddrValve"
                              allow="172\.16\.0\.0"/>
    </Context>
    <Contextpath="/shop" docBase="shopxx" reloadable="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve"directory="/data/logs" prefix="web1_access_log"suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />         
</Host>
      注意:path给定的路径不能以“/”结尾;
不是默认的Host,自己定义的Host的dcoBace尽量使用绝对路径,要不然使用相对路径有时会访问不到,尽量使用绝对路径

下面演示一下:
    修改配置文件(/usr/local/tomcat/conf/server.xml),如果是rpm包安装的tomcat其配置文件是/etc/tomcat/server.xml
    在Engine段中,加入下面内容
<Host name="centos7"appBase="/data/webapps" autoDeploy="false">
    <Context path="" docBase="/data/webapps"reloadable="true"/>
    <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/data/logs"
              prefix="web1_access_log" suffix=".txt"
               pattern="%h %l %u %t&quot;%r&quot; %s %b" />
  </Host>
wKioL1Y4i-_TfFB8AADiMlEGJCg926.jpg
创建目录/data/{webapps,logs}
然后复制我们以前创建的mydata程序的所有文件复制到/data/webapps
cp  -r/usr/local/tomcat/webapps/myapp/* /data/webapps/
然后修改物理机的hosts文件,让本机能解析到centos7
然后访问测试下

这就没有问题了,自己添加的虚拟主机就生效了
修改配置文件:
wKiom1Y4i9eRhThIAAECksVujVk351.jpg
在里面定义两个Centext,一个为默认的;然后在/data/webapps目录下的所有文件移动到这个目录下新创建的ROOT目录下,然后在新建一个shopxx目录,然后在shopxx中创建这几个目录和一个测试页classes index.jsp lib META-INF WEB-INF
index.jsp中的内容
wKioL1Y4jGvBVzezAACs9HM92-8692.jpg
首先停止tomcat (catalina.sh stop),然后在打开(catalina.sh start)

wKioL1Y4jJuwV1IoAABJGr-FZbQ430.jpg
wKiom1Y4jF2BoRiAAAAtVFWFPoo909.jpg
可以看到两个Context都生效了。path是用来定义访问时的url的,多个Context中path不能一样

然后下载一个软件shopxx然后解压到/data/webapps目录下,把shopxx目录删掉,
做一个符号连接ln -sv shopxx-v3.0-Beta/shopxx-3.0Beta/ shopxx
配置文件要修改下
wKiom1Y4jJnhyho2AAEGwvaGtVg294.jpg
然后在访问下
wKioL1Y4jOaiHY_nAAIxQX2d9Ck317.jpg
还需要数据库,需要安装mariadb然后开启,并授权
grant all on shoppxx.* toshopuser@'localhost' identified by 'shoppasswd';
grant all on shoppxx.* toshopuser@'127.0.0.1' identified by 'shoppasswd';
wKioL1Y4jP-TZo_hAADx8H2vA4w102.jpg
然后根据提示,做软件的安装
wKiom1Y4jMKhus-aAAHP4EdrVGM533.jpg
wKiom1Y4jOaizw09AADSJoOOCgw956.jpg
这样就行了

做访问控制的示例:
    <Context path=""docBase="/data/webapps ">
       <ValveclassName="org.apache.catalina.valves.RemoteAddrValve"
       allow="172\.16\.0\.0"/>
     </Context>
这样做就行了
然后在我们做的默认访问目录下,创建一个image目录,然后里面放两张图片,然后关闭tomcat再开启,然后访问下,看能正常访问不
wKioL1Y4jWawTxW9AACM-maSn88440.jpg

下面实现LNMT:(Nginx+tomcat)

请求的过程 client-->http --> nginx --> reverse_proxy --> http --> tomcat (httpconnector)      
首先找一台主机,安装nginx,然后配置nginx
wKiom1Y4jw-Q_wgnAAA11zScZHo205.jpg
然后启动服务就行了,访问测试下
wKiom1Y4j73zZVwpAAEU6mALsYM964.jpg
这就代理过去了,能够访问了,但访问的不是我们想要的虚拟主机,
这是基于IP地址访问的,如果tomcat的Engine中的默认虚拟主机不是我们需要的话,我们就要以主机名来访问了,或者修改Tomcat的配置文件,把默认虚拟主机改为我们需要的
修改/etc/nginx/nginx.conf
wKioL1Y4kJvAbhcNAAAn_-BgMZ0244.jpg
然后修改/etc/hosts文件增加一条172.16.249.195  centos7
然后重载nginx
这样就可以通过反代来访问我们需要访问放到的虚拟主机
wKioL1Y4joHDlKfuAABg7PTxUBQ853.jpg

如果需要把静态的让nginx响应,让动态的转交给后端的tomcat
修改nginx的配置文件
wKioL1Y4jcShUxpwAAA5EK643X0879.jpg
然后重载nginx,访问测试
这个时候默认请求的是index.html,所以没有转交给tomcat,而是nginx自己响应了
wKiom1Y4kIOivbhtAAJPns7kC1I534.jpg
后面带上指定的url访问
wKiom1Y4kIuCoIDSAAA-5nJlZ-Y905.jpg
可以看到实现动静分离了

实现LAMT(apache+tomcat)
  访问请求 client--> http --> httpd --> reverse_proxy --> {http|ajp} --> tomcat{http connector|ajp connector}
把刚在主机(172.16.249.159)nginx停掉,然后打开httpd服务
然后用httpd来进行反向代理
反代模块:
    主:proxy_module
    子:proxy_module_http,proxy_module_ajp
      还可以使用第三方的模块jk来进行反代

首先打开/etc/httpd/conf/httpd.conf注释掉主节点即DocumentRoot这一行
在这个/etc/httpd/conf.d目录下,创建一个虚拟主机的配置文件vhosts.conf文件
然后添加内容:
wKiom1Y4kWGiRBCjAADPOIxL2rA659.jpg
<Location />定义的是访问的所有url都代理允许通过
ProxyRequests Off 这一项是关闭正向代理的,因为httpd中的代理是正反向都可以代理,但只能代开一种,所以要明确使用哪一种代理

然后使用httpd –t检查语法,然后在启动httpd
wKiom1Y4kYKCrIFyAADJNURVfY0433.jpg
这有一个警告,需要修改httpd主配置文件,给一个主机名
找到ServerName,然后修改
wKiom1Y4kZKiSvpuAAErhcjnOBk197.jpg
然后启动httpd服务,
修改物理机的hosts文件 172.16.249.159  centos7
然后访问测试下
wKioL1Y4keGAwpZkAAAmEOEaFLg495.jpg
可以看到调度到后端的tomcat的centos7虚拟主机上了(ProxyPreserveHost On因为这一项是,保留自己请求的虚拟主机到后端去)
如果使用的是ip地址访问是不会把主机名加上的所以请求的是
wKiom1Y4kb6g5SiXAAJxQQhIAoc596.jpg
下面做几个实例,实现负载均衡和会话绑定,以及session cluster和session server
示例:nginx, apache(mod_proxy_http,mod_proxy_ajp, mod_jk)负载均衡用户请求至tomcat;额外实现session sticky;

下面的示例使用的是CentOS7下yum安装的JDK和Tomcat

172.16.249.159(centos72)做负载均衡器,172.16.249.115(centos71)和172.16.249.112(centos73)做后端的tomcat
首先配置tomcat,使用java  -version,看到系统自带的有JDK1.7,所以这里不在自己编译安装,直接yum安装,然后安装tomcat,yum  install  tomcat
然后使用rpm  -qpl  tomcat
可以看到,tomcat的配置文件在/etc/tomcat/server.xml
启动tomcat直接使用systemctl  start  tomcat.service
然后访问测试下,看能访问到主页不
wKioL1Y4k2iAUSQzAAIU4XQ1Qms449.jpg
wKiom1Y4kzzAbOCuAALThV3igLE273.jpg

为了以后配置方便,然后再给tomcat配置一个Host,首先创建目录mkdir -pv /data/webapps/ROOT(/data/webapps这个目录的属组改为tomcat),mkdir/data/logs,然后编辑tomcat的配置文件(/etc/tomcat/server.xml)
wKioL1Y4k5OSsq4SAACHf1OpNQQ506.jpg
修改配置文件,添加下面这些
wKiom1Y4k2Sgx9AoAADWNRcp06s711.jpg
然后在/data/webapps/ROOT/目录下,创建几个目录和一个index.jsp文件,提供测试页
mkdir lib classes META-INF WEB-INF,vimindex.jsp
wKioL1Y4k7LinmW6AACVXBcDmEg695.jpg
然后另一个tomcat节点,也做上面的这些配置,知识测试页为“Hello  Worder!on web2”
可以直接复制过去scp server.xml centos73:/etc/tomcat/,然后修改
wKiom1Y4k43Rs00IAADTOwYHK_w076.jpg
scp -rp /data/ centos73:/data,然后修改index.jsp

然后重启tomcat; systemctl  restart  tomcat.service
在其他虚拟机中测试下,首先查看这个虚拟机中能否解析主机名centos71,要是用物理机测试,需要在hosts文件中加入 172.16.249.115  centos71  172.16.249.112  centos73 wKiom1Y4k6eDtOrTAAFi57WRdqU486.jpg
wKioL1Y4lDyQzG6VAAA0OMECcG4041.jpg
wKiom1Y4k__gC03ZAACO6oQBYro590.jpg
wKioL1Y4lDyiXqY7AAAvA7qoTvw991.jpg
这样tomcat就做好了,测试也没问题了,

因为tomcat中的默认主机不是我们刚配置的,只能使用主机名才能访问,那么负载均衡器中就要能解析到后端的tomcat主机的主机名,为了方便,我们可以把tomcat的默认主机改为我们配置的虚拟主机(Host)
wKiom1Y4lECxuJxYAABdFUV8AOU461.jpg
wKioL1Y4lH3yWY-HAAAzA4gFlc4746.jpg
在重启一下,使用ip地址访问测试下
wKioL1Y4lKLhjbalAAA36TrpDLI570.jpg
wKiom1Y4lGWQ6nDyAAA-4R9V_d4217.jpg

下面做负载均衡:
1、  使用nginx做负载均衡器,反向代理
在172.16.249.159上安装nginx
然后修改nginx的配置文件(/etc/nginx/nginx.conf)
wKioL1Y4lMCRJhPXAAEyrqPySck099.jpg
然后使用nginx  – t 检查语法,然后启动nginx
wKiom1Y4lKSTP15eAACmw4ugaEE992.jpg
然后访问测试下
wKioL1Y4lOHhr0Q7AABEH6wFy6E275.jpg
刷新下,
wKiom1Y4lKSQMT2dAABBljSXjN8863.jpg
可以看到能负载均衡了,这样nginx负载均衡tomcat就做好了
如果要做会话绑定(session  sticky),只需要在nginx配置文件中修改
wKiom1Y4lKSjLcbFAABI8ZSno3M499.jpg
然后systemctl  reload  nginx.service,然后访问测试
wKioL1Y4lRSyAZxMAABDmJ4tQPE802.jpg
无论怎么刷新都是这一个页面不变了


2、  使用apache来做负载均衡器和反向代理,可以使用3种模块来负载均衡tomcat
首先停掉nginx服务systemctl  stop  nginx.service,然后安装httpd
  (a)   mod_proxy;mod_proxy_http;mod_proxy_balancer
编辑httpd配置文件,首先进入httpd的主配置文件(/etc/httpd/conf/httpd.conf)把中心主机禁掉(这一行注释掉DocumentRoot "/var/www/html"),然后在/etc/httpd/conf.d/目录下,创建一个vhosts.conf文件,内容如下:
<proxy balancer://lbcluster1>
  BalancerMemberhttp://172.16.249.115:8080 loadfactor=1 route=TomcatA
  BalancerMemberhttp://172.16.249.112:8080 loadfactor=1 route=TomcatB
</proxy>
<VirtualHost *:80>
    ServerName centos7
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass /balancer://lbcluster1/
    ProxyPassReverse /balancer://lbcluster1/
    <Location />
        Require all granted
    </Location>
</VirtualHost>
wKiom1Y4lSKwOTauAAFOoc7l8ys937.jpg
然后使用httpd  -t 检查语法,然后打开httpd服务
wKioL1Y4lXjQnJp6AABV4cWi37M106.jpg

需要修改后端tomcat的配置文件(/etc/tomcat/server.xml)
172.16.249.115上的改为:
wKiom1Y4lYnxu9WmAABCyewGLDY011.jpg
172.16.249.112上的改为:
wKiom1Y4laODQsyIAABSFrXhFXM210.jpg
为了演示效果修改测试页面:
在TomcatA上(/data/webapps/ROOT/index.jsp)提供如下页面
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
  <body>
    <h1><fontcolor="red">TomcatA.magedu.com</font></h1>
    <tablealign="centre" border="1">
      <tr>
        <td>SessionID</td>
    <%session.setAttribute("magedu.com","magedu.com"); %>
        <td><%=session.getId() %></td>
      </tr>
      <tr>
        <td>Createdon</td>
        <td><%=session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>


在TomcatB上(/data/webapps/ROOT/index.jsp)提供如下页面
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
  <body>
    <h1><fontcolor="blue">TomcatB.magedu.com</font></h1>
    <tablealign="centre" border="1">
      <tr>
        <td>SessionID</td>
    <%session.setAttribute("magedu.com","magedu.com"); %>
        <td><%=session.getId() %></td>
      </tr>
      <tr>
        <td>Createdon</td>
        <td><%=session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
然后后端tomcat重启(systemctlrestart tomcat.service)

然后访问测试:
wKioL1Y4ljmyI8blAAC0Er4cS9Q572.jpg
wKiom1Y4lfvT7ks5AADG_9ukZF8454.jpg
可以看到能负载均衡了,但每一次刷新后session  ID都不一样

下面做会话绑定(sessionsticky),
修改vhosts.conf文件:
wKioL1Y4llOBLuGIAAEX31YxJM8634.jpg
然后检查语法,重载httpd服务,然后测试下
wKiom1Y4liXyhmJoAADNWM4rrE8427.jpg
然后无论怎样刷新,都不会变了,这样会话绑定(session sticky)就做好了
  (b) mod_proxy;mod_proxy_ajp;mod_proxy_balancer
首先把vhosts.conf 重命名为vhosts.httpd.conf.bak,然后复制vhosts.httpd.conf.bak到vhosts.ajp.conf,然后修改vhosts.ajp.conf配置文件:
wKioL1Y4lnywHPLhAAG4ierXVrk180.jpg
然后保存退出,检查语法,重启httpd服务,进行测试
wKioL1Y4lqShY8o_AADEP34qo3M462.jpg
wKiom1Y4lmfhfFWHAACzOqQ4Qlc620.jpg
然后做会话绑定(sessionsticky)
只需要在里面加入下面一行
wKioL1Y4lrLykUQXAADDXr8FX7w965.jpg
然后重载服务,进行测试
wKiom1Y4ln6wzI1ZAADC9mH45C4605.jpg
然后刷新页面就不会变了

(c) mod_jk;
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
要使用这个模块,需要编译这个模块,还要安装httpd的开发包,httpd-devel  gcc glibc-devel (yum -y installhttpd-devel gcc glibc-devel),安装开发包组,首先yum grouplist,然后在可用组里找到“开发工具”,然后安装(yum groupinstall "开发工具"),如果已经安装过就不用安装了
下载tomcat-connectors-1.2.40-src.tar.gz
然后解压,编译安装,使用whichapxs,因为编译安装时必须指apxs的安装路径
wKiom1Y4lvyQhdpjAAGDhyl60pQ535.jpg
回车,编译,然后make  && make  install
wKiom1Y4lxzy7uvjAAFvXX3qUCY187.jpg
wKioL1Y4l1nxoHSiAAHGSwClNio565.jpg
看到这个模块生成就可以了
然后在/etc/httpd/conf.d/目录下,创建一个mod_jk.conf的文件,编辑内容如下:
wKiom1Y4lzehwPZXAACV26tzNMk202.jpg
然后在/etc/httpd/conf.d/目录下,创建一个workers.properties文件,编辑内容如下:
wKioL1Y4l3XCVfDsAAEfdILWX_8028.jpg
然后保存,检查语法,重启httpd服务,然后测试
wKiom1Y4l2Lir4BcAADIeK0GUw4867.jpg
wKioL1Y4l5_QDqSqAADLOfjzN_I031.jpg
这样负载均衡就做好了,
然后做做会话绑定(sessionsticky),需要修改workers.properties文件
wKiom1Y4l3DACIPjAAB1G5NuzGo781.jpg
然后重启服务,进行测试
wKioL1Y4l7vQai2TAADAJOxfgV4456.jpg
然后怎样刷新都不会改变了,这样会话绑定就做好了

示例:构建session  cluster,实现不论基于什么调度算法,会话的信息不再变化,即sessionID不再变化,
tomcat中自带会话管理器(session  manager)
    StandardManager:标准会话管理器
    PersistentManager:持久会话管理器
        FileStore
        JDBC
           DeltaManager
         BackupManager
前端(172.16.249.159)使用的为http协议做反代的(2、(a)这个示例),

构建步骤:
(1)    各tomcat节点配置使用deltamaanager:在<Engine>或<Host>字段中,加入下面内容
我们在自己定义的Host中复制下面这些内容到tomcat配置文件中,(这些内容在http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html中)
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
    channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
    expireSessionsOnShutdown="false"
    notifyListenersOnReplication="true"/>
<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">           <MembershipclassName="org.apache.catalina.tribes.membership.McastService"
    address="228.0.1.7"
    port="45564"
    frequency="500"
    dropTime="3000"/>           <ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
    address="auto"
    port="4000"
    autoBind="100"
    selectorTimeout="5000"
    maxThreads="6"/>         <SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">             <TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>            <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>          <InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>
        <ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>       <ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
    tempDir="/tmp/war-temp/"
    deployDir="/tmp/war-deploy/"
    watchDir="/tmp/war-listen/"
    watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>
停掉tomcat服务,然后复制上面内容,修改如下,
wKiom1Y4mH_hzX_UAAOhyDW2tFA719.jpg
另一个节点同样停掉tomcat服务,复制上面内容,并修改下
wKioL1Y4mMWTb-bSAAOUGmQ-UDc307.jpg
   (2) 为需要使用session cluster的webapps开启sessiondistribution的功能:
       WEB-INF/web.xml中添加
            <distributable/>
     复制/etc/tomcat/目录下的web.xml到/data/webapps/ROOT/WEB-INF/目录下,然后修改web.xml,在最后这个</web-app>前加入<distributable/>,另一个节点做同样的操作
wKiom1Y4mLTSczKpAACN_DG4kCY994.jpg
复制这个文件到另一个节点上
scp  /data/webapps/ROOT/WEB-INF/web.xml172.16.249.112:/data/webapps/ROOT/WEB-INF/
然后启动tomcat
访问测试
wKioL1Y4mQ2TyuLYAADRUjuDZHk185.jpg
wKiom1Y4mNDT6iUSAACw9i8Bf4g505.jpg
可以看到Session  ID没有变,可以看到做成功了
这样session  cluster就做好了

然后修改前端(172.16.249.159)的,修改代理的模式,使用ajp和mod_jk模式,都可以实现,会话绑定,前端使用nginx做代理,也可以实现会话绑定,这里就不再演示了(注意:使用其他模式时,记得把刚做的会话绑定要去掉)
因为这是tomcat的session  cluster 跟前端的负载均衡器没有关系,

   示例:构建session  server

需要使用memcached,下面介绍下memcache的一些知识
    memcached的特点:
       协议简单
       基于libevent事件处理
       基于内存完成数据存储:LRU
       memcached互不通信的集群:分布式
首先要安装memcached(yum installmemcached)
通过配置/etc/sysconfig/memcached这个文件,来对memcached传递一些参数,如果要编辑memcached的一些特性,就需要编辑这个文件(/etc/sysconfig/memcached)
直接启动(systemctl startmemcached.service)就可以了,监听在tcp和udp的11211端口上
wKiom1Y4mWHiQMm-AALnDSvkFqI075.jpg
memcached是旁挂式缓存:
    一半在客户端;一半在服务端
wKioL1Y4mbWhn6-jAAET4Ptr_00898.jpg
memcached在内存中的存储方式:
slab allocation机制:整理内存以进行复用
     Page: 分配给slab用于再次分割为chunk的内存空间;
     chunk:用于缓存缓存对象的空间;
slab class:特定大小的chunk组合而成的组;
  memcached还自带一个状态查看与管理工具: /usr/bin/memcached-tool,可以查看现在memcache中的状态信息
wKioL1Y4mduTuYVIAACAe6sJIpE722.jpg
这些字段的含义:
#:slab class的编号;
    Item_size:Chunk大小;
    Max_age:缓存对象的生存时间;
    Pages:分配给slab内存页数;
    Count:slab内的记录数;
    Full?:slab内是否仍有空闲chunk;

下面用实例实现让tomcat的会话信息保存在memcache中,实现session  server

memcached-session-manager项目地址:
http://code.google.com/p/memcached-session-manager/
下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。(看自己使用的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
后端tomcat节点上,做如下操作:
把这些文件下载到这个目录下/usr/share/tomcat/lib/
wKiom1Y4mh2B7a0wAAIWnHmw38s213.jpg
把刚才我们在tomcat配置文件中加入的<Cluster></Cluster>这一段里面的内容删掉,然后分别在两个tomcat上的我们自己定义的Host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:
                        <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"              memcachedNodes="n1:172.16.249.159:11211,n2:172.16.249.112:11211"         failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
    />

两个节点都做这样的操作
wKioL1Y4mtvTAtCPAAHPya6oMEw736.jpg
然后还要把tomcat配置文件中的,Engine字段里的jvmRoute去掉
wKiom1Y4mrzQjaGjAAA6RwMsSds841.jpg
另一个节点的tomcat配置文件中的,Engine字段里的jvmRoute去掉
memcachedNodes写入的是开启memcached服务的主机的地址,一个是172.16.249.159  172.16.249.112 ,memcached不需要做修改,直接安装然后启动就行了
然后把我们在/data/webapps/ROOT/WEB-INF/目录中的web.xml文件删掉,两个节点
然后重新启动tomcat服务,
访问测试
wKioL1Y4mzqxQqKMAACyqbUF1Uk920.jpg
wKiom1Y4mv2CDq5_AACfIhKpsoc262.jpg
可以看到,负载均衡了,session  ID也没有变
这样使用memcached做session  server 就做好了



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-134721-1-1.html 上篇帖子: tomcat实现session集群及tomcat+memcached共享session存储(四) 下篇帖子: Tomcat 调优 server 基础知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表