Tomcat的基础知识和一些应用,session cluster和session server

Tomcat简单来说就是JAVA 2 EE 加上ServletJSP类库的实现,tomcat=JWSSun+ JservASF

Tomcat的核心组件:

    catalina:servlet container

    Coyote:http connection

    Jasper:JSP Engine 执行引擎

 

    TomcatInstance: 运行中的tomcat进程(java进程)

        Server:即一个tomcat实例;

        Service:用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;

        EngineTomcat的核心组件,用于运行jspservlet代码;

        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.propertiesJava属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;

    logging.properties:日志相关的配置信息;


CentOS7上默认提供的JDKopenJDK7Tomcat7,这版本已经很新了,可以直接yum安装使用

要安装Tomcat首先要安装JDK,然后安装Tomcat,可以直接yum安装,也可以自己下载二进制格式的程序包进行安装,


下面我们自己下载二进制程序包进行安装,下载jdk-8u25-linux-x64.rpmapache-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装好了,环境变量也配置好了

然后安装tomcattar 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 �Ctnl 就可以发现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.jspwebapp的主页


  手动添加一个测试应用程序:

    创建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文件,这是JSPindex.jsp通过servlet转换成.java文件,然后通过complie编译成bytecodes自解码的.class文件,然后在JVM中运行

 

部署(deploymentwebapp相关的操作:

    deploy:部署,将webapp的源文件旋转于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp; 将其特有类通过class loader装载至tomcat

    有两种方式:

        自动部署:autodeploy

        手动部署:

        1、冷部署:把webapp复制到指定位置,而后才启动tomcat

        2、热部署:在不停止tomcat的前提下进行的部分:

           部署工具:managerant脚本、tcdtomcatclient deployer)等;

            undeploy:反部署,停止webapp,并从tomcat实例拆除其部分文件和部署名;

           stop:停止,不再向用户提供服务;但其文件和部署名会在tomcat实例中

           start:启动处于“停止”状态的webapp

           redeploy:重新部署;

    tomcat自带的应用程序:

        managerapp: webapp管理工具

        hostmanagerVirtual 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)proxyJK)连接器

自定义HostContext示例:

  <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,自己定义的HostdcoBace尽量使用绝对路径,要不然使用相对路径有时会访问不到,尽量使用绝对路径


下面演示一下:

    修改配置文件(/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的,多个Contextpath不能一样


然后下载一个软件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地址访问的,如果tomcatEngine中的默认虚拟主机不是我们需要的话,我们就要以主机名来访问了,或者修改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.159nginx停掉,然后打开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 �Ct检查语法,然后在启动httpd

wKiom1Y4kYKCrIFyAADJNURVfY0433.jpg

这有一个警告,需要修改httpd主配置文件,给一个主机名

找到ServerName,然后修改

wKiom1Y4kZKiSvpuAAErhcjnOBk197.jpg

然后启动httpd服务,

修改物理机的hosts文件 172.16.249.159  centos7

然后访问测试下

wKioL1Y4keGAwpZkAAAmEOEaFLg495.jpg

可以看到调度到后端的tomcatcentos7虚拟主机上了(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.159centos72)做负载均衡器,172.16.249.115centos71)和172.16.249.112centos73)做后端的tomcat

首先配置tomcat,使用java  -version,看到系统自带的有JDK1.7,所以这里不在自己编译安装,直接yum安装,然后安装tomcatyum  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-INFvimindex.jsp

wKioL1Y4k7LinmW6AACVXBcDmEg695.jpg

然后另一个tomcat节点,也做上面的这些配置,知识测试页为“Hello  Worderon 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  centos73wKiom1Y4k6eDtOrTAAFi57WRdqU486.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  �C 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_proxymod_proxy_httpmod_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_proxymod_proxy_ajpmod_proxy_balancer

首先把vhosts.conf 重命名为vhosts.httpd.conf.bak,然后复制vhosts.httpd.conf.bakvhosts.ajp.conf,然后修改vhosts.ajp.conf配置文件:

wKioL1Y4lnywHPLhAAG4ierXVrk180.jpg

然后保存退出,检查语法,重启httpd服务,进行测试

wKioL1Y4lqShY8o_AADEP34qo3M462.jpg

wKiom1Y4lmfhfFWHAACzOqQ4Qlc620.jpg

然后做会话绑定(sessionsticky

只需要在里面加入下面一行

wKioL1Y4lrLykUQXAADDXr8FX7w965.jpg

然后重载服务,进行测试

wKiom1Y4ln6wzI1ZAADC9mH45C4605.jpg

然后刷新页面就不会变了


(c) mod_jk

mod_jkASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是TomcatAJP连接器)。

要使用这个模块,需要编译这个模块,还要安装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 clusterwebapps开启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)的,修改代理的模式,使用ajpmod_jk模式,都可以实现,会话绑定,前端使用nginx做代理,也可以实现会话绑定,这里就不再演示了(注意:使用其他模式时,记得把刚做的会话绑定要去掉)

因为这是tomcatsession  cluster 跟前端的负载均衡器没有关系,

 

   示例:构建session  server


需要使用memcached,下面介绍下memcache的一些知识

    memcached的特点:

       协议简单

       基于libevent事件处理

       基于内存完成数据存储:LRU

       memcached互不通信的集群:分布式

首先要安装memcachedyum installmemcached

通过配置/etc/sysconfig/memcached这个文件,来对memcached传递一些参数,如果要编辑memcached的一些特性,就需要编辑这个文件(/etc/sysconfig/memcached

直接启动(systemctl startmemcached.service)就可以了,监听在tcpudp11211端口上

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_sizeChunk大小;

    Max_age:缓存对象的生存时间;

    Pages:分配给slab内存页数;

    Countslab内的记录数;

    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也没有变

这样使用memcachedsession  server 就做好了

 


你可能感兴趣的:(cluster,server,session,使用nginx和httpd,反代到tomcat的实现,以及会话绑定)