tomcat部署web服务(三)

五、配置apache基于mod_jk模块与Tomcat连接并实现负载均衡

1、拓扑图:

2、安装配置步骤:

  1)在Apache上编译安装Apache,安装编译步骤参考上篇第二步;

  2)Tomcat-1和Tomcat-2上安装Tomcat,安装步骤参考上篇第一步;

  3)Tomcat-1和Tomcat-2上配置;

  
  
  
  
  1. # vim /usr/local/tomcat/conf/server.xml   //定义tomcat-1的worker名称   
  2.   <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">  
  3. # vim /usr/local/tomcat/conf/server.xml   //定义tomcat-2的worker名称 
  4.   <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB"> 

  4)Apache配置

  
  
  
  
  1. # vim /etc/httpd/extra/httpd-jk.conf 
  2. 添加如下内容 
  3. LoadModule jk_module modules/mod_jk.so 
  4. JkWorkersFile  /etc/httpd/extra/workers.properties 
  5. JkLogFile   logs/mod_jk.log 
  6. JkLogLevel   debug 
  7. JkMount  /*   lbcluster1 
  8. JkMount  /status  stat1 
  9. # vim /etc/httpd/extra/workers.properties 
  10. 添加如下行 
  11. worker.list=lbcluster1,stat1 
  12. worker.TomcatA.port=8009 
  13. worker.TomcatA.host=172.16.11.11 
  14. worker.TomcatA.type=ajp13 
  15. worker.TomcatA.lbfactor=1 
  16. worker.TomcatB.port=8009 
  17. worker.TomcatB.host=172.16.11.12 
  18. worker.TomcatB.type=ajp13 
  19. worker.TomcatB.lbfactor=1 
  20. worker.lbcluster1.type=lb    //lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker// 
  21. worker.lbcluster1.sticky_session=0 //在将某请求调度至某worker后,源于此址 的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。 默认值为1,即启用此功能,如果后端的各worker之间支持session复制,则可以 将此属性值设为0//
  22. worker.lbcluster1.balance_workers=TomcatA,TomcatB   //用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker// 
  23. worker.stat1.type=status 
  24. # service httpd restart  //重启httpd服务

  5)访问验证worker工作状态:


# /usr/local/tomcat/bin/catalina.sh stop //停掉TomcatB服务访问验证对worker健康状况检查

  6)分别在TomcatA和TomcatB上各自定义一个应用来验证会话的变化
  
  
  
  
  1. TomcatA实例配置: 
  2. # cd /usr/local/tomcat/webapps/ 
  3. # mkdir -pv sess/WEB-INF/{classes,lib} 
  4. # cd sess/ 
  5. # vim index.jsp 
  6. 提供如下内容 
  7. <%@ page language="java" %> 
  8. <html> 
  9.    <head><title>TomcatA</title></head> 
  10.    <body> 
  11.      <h1><font color="red">TomcatA </font></h1> 
  12.      <table align="centre" border="1"> 
  13.        <tr> 
  14.          <td>Session ID</td> 
  15.          <td><%= session.getId() %></td> 
  16.        </tr> 
  17.       <tr> 
  18.          <td>Created on</td> 
  19.          <td><%= session.getCreationTime() %></td> 
  20.       </tr> 
  21.      </table> 
  22.   </body> 
  23. </html> 
  
  
  
  
  1. TomcatB实例上配置 
  2. # cd /usr/local/tomcat/webapps/ 
  3. # mkdir -pv sess/WEB-INF/{classes,lib} 
  4. # cd sess/ 
  5. # vim index.jsp 
  6. 提供如下内容 
  7. <%@ page language="java" %> 
  8. <html> 
  9.    <head><title>TomcatB</title></head> 
  10.    <body> 
  11.      <h1><font color="blue">TomcatB </font></h1> 
  12.      <table align="centre" border="1"> 
  13.        <tr> 
  14.          <td>Session ID</td> 
  15.          <td><%= session.getId() %></td> 
  16.        </tr> 
  17.        <tr> 
  18.          <td>Created on</td> 
  19.          <td><%= session.getCreationTime() %></td> 
  20.       </tr> 
  21.      </table> 
  22.    </body> 
  23. </html> 
  7)重启TomcatA和TomcatB并访问TomcatA和TomcatB


  8)去负载均衡器验证访问TomcatA和TomcatB的负载均衡效果


    通过上述方式访问TomcatA和TomcatB时发现二者会话一直在发生变化,如果用户在淘宝上买东西的话每次刷新一次原有页面就没有了,此时用户添加的商品岂不是也没有了,这一定会给用户带来很大烦恼,这就需要配置会话保持功能;

  9)配置Apache基于mod_jk模块实现会话保持功能

  
  
  
  
  1. # vim /etc/httpd/extra/workers.properties 
  2. 添加如下选项 
  3. worker.lbcluster1.sticky_session=1   //在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认值为1,即启用此功能,如果后端的各worker之间支持session复制,则可以将此属性值设为0// 
  4. # service httpd restart  //重启httpd服务
  10)小结
    通过上述方式访问验证发现,会话在有时候还是会变的,这就是mod_jk自身的缺点,mod_jk对会话保持效果不是很好,跟mod_proxy相比逊色了很多,所有这就让我们不得不来说下Apache基于mod_proxy连接tomcat实现负载均衡的方式了;

六、配置apache基于mod_proxy模块与Tomcat连接并实现负载均衡

  1、Apache主机配置

  
  
  
  
  1. # vim /etc/httpd/httpd.conf 
  2. Include /etc/httpd/extra/httpd-vhosts.conf  //打开虚拟主机选项
  3. #Include /etc/httpd/extra/httpd-jk.conf //禁止apache使用httpd-jk.conf配置文件  
  4. #DocumentRoot "/usr/local/apache/htdocs"  //禁用中心主机
  5. # vim /etc/httpd/extra/httpd-vhosts.conf  //编辑虚拟主机文件关闭虚拟主机样例并添加新的虚拟主机 
  6. #<VirtualHost *:80> 
  7. #    ServerAdmin [email protected] 
  8. .................................................................
  9. .................................................................
  10.  
  11. #    CustomLog "logs/dummy-host2.example.com-access_log" common 
  12. #</VirtualHost> 
  13. 在全局配置段添加如下两项内容: 
  14. ProxyRequests Off    //关闭正向代理// 
  15. <proxy balancer://lbcluster1>   //定义负载均衡器// 
  16.      BalancerMember ajp://172.16.11.11:8009 loadfactor=10 route=TomcatA 
  17.      BalancerMember ajp://172.16.11.12:8009 loadfactor=10 route=TomcatB 
  18. </proxy> 
  19.      ServerName tomcat.wjw.com 
  20.      ProxyPass / balancer://lbcluster1/ stickysession=jsessionid    // stickysession有两种取值,分别为jsessionid(代理java)和phpsessionid(代理php)// 
  21.      ProxyPassReverse / balancer://lbcluster1/  //用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器//  
  22. # service httpd restart  //重启httpd服务

  2、去负载均衡器验证负载均衡效果


   3、关掉TomcatA,验证故障转移效果


   开启TomcatA,再次刷新访问

   4、小结  

    如上所述,Apache基于mod_proxy模块成功实现了会话绑定,同理访问TomcatA也是如此,有了这种会话绑定机制就可以实现用户在淘宝等购物网站上买东西且不用发愁同时打开刷新页面会丢失的现象了。

七、配置apache基于mod_proxy模块实现Tomcat基于内存复制的集群

   1、Apache配置

  
  
  
  
  1. # vim /etc/httpd/httpd.conf  
  2.    #Include /etc/httpd/extra/httpd-vhosts.conf   //关闭虚拟主机选项 
  3. Include /etc/httpd/extra/httpd-proxy.conf  //添加该选项
  4. 在/etc/httpd/extra/目录下添加httpd-proxy.conf文件,内容如下: 
  5. ProxyRequests Off 
  6. <proxy balancer://lbcluster1> 
  7.      BalancerMember ajp://172.16.11.11:8009 loadfactor=10 route=TomcatA 
  8.      BalancerMember ajp://172.16.11.12:8009 loadfactor=10 route=TomcatB 
  9.      ProxySet lbmethod=bytraffic   // libmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度// 
  10. </proxy> 
  11.      ProxyPass /lbmanager !   //定义基于mod_proxy实现节点工作状态的管理,并不做代理// 
  12.      ProxyPass /status !      //定义基于mod_proxy实现节点工作状态的查看,并不做代理// 
  13.      ProxyPass / balancer://lbcluster1/ 
  14.      ProxyPassReverse / balancer://lbcluster1/ 
  15. ProxyStatus On        //打开proxy的状态信息查看功能,也可以改为full,表示显示完全信息// 
  16. <Location /lbmanager>     //定义本地访问路径// 
  17.      SetHandler balancer-manager  //使用balancer-manager处理器进行处理// 
  18.      Require all granted    //定义访问的权限,可以自己根据需要定义// 
  19. </Location> 
  20. <Location /status>   
  21.     SetHandler server-status 
  22.      Require all granted 
  23. </Location> 

   2、TomcatA和TomcatB配置

1)在TomcatA和TomcatB的配置文件中的Engine部分分别添加如下内容:

  
  
  
  
  1. # vim /usr/local/tomcat/conf/server.xml  
  2.   TomcatA的Engine中添加如下内容:  
  3.     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  4.                    channelSendOptions="8">  
  5.      <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  6.                     expireSessionsOnShutdown="false"  
  7.                     notifyListenersOnReplication="true"/>  
  8.        <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
  9.           <Membership className="org.apache.catalina.tribes.membership.McastService"  
  10.                    address="228.50.10.1"   bind="172.16.11.11"   port="45564"  
  11.                    frequency="500"  dropTime="3000"/>  
  12.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  13.                                 address="172.16.11.11"   port="4000"  autoBind="100"  
  14.                                 selectorTimeout="5000"   maxThreads="6"/>  
  15.              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
  16.                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
  17.              </Sender>  
  18.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
  19.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
  20.      </Channel>  
  21.      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  22.                         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>  
  23.      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
  24.      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
  25.                      tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"  
  26.                     watchDir="/tmp/war-listen/"  watchEnabled="false"/>  
  27.       <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
  28.       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  29.     </Cluster>  
  30. TomcatB配置文件中的Engine中添加如下内容  
  31.     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  32.                    channelSendOptions="8">  
  33.      <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  34.                     expireSessionsOnShutdown="false"  
  35.                     notifyListenersOnReplication="true"/>  
  36.        <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
  37.           <Membership className="org.apache.catalina.tribes.membership.McastService"  
  38.                    address="228.50.10.1"   bind="172.16.11.12"   port="45564"  
  39.                    frequency="500"  dropTime="3000"/>  
  40.              <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  41.                                 address="172.16.11.12"   port="4000"  autoBind="100"  
  42.                                 selectorTimeout="5000"   maxThreads="6"/>  
  43.              <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
  44.                 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
  45.              </Sender>  
  46.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
  47.        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
  48.      </Channel>  
  49.      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  50.                         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>  
  51.      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
  52.      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
  53.                      tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/"  
  54.                     watchDir="/tmp/war-listen/"  watchEnabled="false"/>  
  55.       <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
  56.       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  57.     </Cluster>  

    2配置TomcatA和TomcatB的所有应用程序为分布式

  
  
  
  
  1. # cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/sess/WEB-INF/ 
  2. # vim /usr/local/tomcat/webapps/sess/WEB-INF/web.xml 
  3. 添加如下内容 
  4. <distributable/> 
    3)重启Apache、TomcatA和TomcatB并验证会话的持久性


    4)查看各节点工作状态的管理界面

    5)验证Apache代理服务器和负载均衡器的状态

    6)关闭TomcatB验证Apache基于mod_proxy模块对各节点的健康状况检测效果

    也可以通过status进行查看

八、配置Apache基于mod_jk模块实现Tomcat基于内存复制的集群

    1、Apache配置

  
  
  
  
  1. #vim /etc/httpd/httpd.conf 
  2. Include /etc/httpd/extra/httpd-jk.conf  //开启httpd-jk
  3. #Include /etc/httpd/extra/httpd-proxy.conf  //禁用httpd-proxy

   2、解除会话绑定机制:

  
  
  
  
  1. # vim /etc/httpd/extra/workers.properties  
  2. worker.lbcluster1.sticky_session=0 //设置为0 

   3、重启Apache、TomcatA和TomcatB验证会话持久性


    4、查看manager中/sess下的会话信息类型

    4、小结

    如上验证结果,各Tomcat节点间成功实现了会话的复制,而这一机制正是当下最流行的实现集群复制的方式。

 

你可能感兴趣的:(tomcat,负载均衡,反向代理,集群复制)