tomcat 集群


Apache与Tomcat的区别:

Apache是一个web服务器环境程序,可以作为web服务器使用。不过只支持静态网页,如(asp,php,cgi,jsp)等动态网页的就显得无能为力。
如果想让服务器也能处理动态页面,那么就需要Tomcat。

当处理静态页面时,Tomcat不如Apache迅速。Tomcat不象Apache一样可配置

Tomcat不象Apache一样强壮。

基于以上原因,一个现实的网站使用一个Apache作为Web服务器,为网站的静态页面请求提供服务;并使用Tomcat服务器作为一个Servlet/JSP插件,显示网站的动态页面。

Apache,Tomcat负载均衡和集群:

对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群).
负载平衡:每台服务器都是独立的,只是对请求的负载进行平衡,而不对状态(SESSION)进行复制。
状态复制(集群):先进行负载平衡,再在各服务器间复制应用状态。

Apache+Tomcat构建企业级应用

1.Apache主要用来解析静态文本,如html,tomcat也有此功能,但apache能大大提高效率,对于并发数较大的企业级应用,能更好的显示Apache的高效率;
2.Tomcat 用来解析jsp,servlet等,所有的客户请求首先会发送到apache,如果请求是静态文本则由apache解析,并把结果返回给 客户端,如果是动态的请求,如jsp,apache会把解析工作交给tomcat,由tomcat进行解析(这首先要两者现实整合),tomcat解析完 成后,结果仍是通过apache返回给客户端,这样就可以达到分工合作,实现负载均衡,提高系统的性能!

这里写图片描述

为了实现这个原理我们就需要解决两个问题:

  • 如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持)
  • 如何分发请求到各个应用服务器实现压力分解:(这里的解决方案是用Apache做 web服务器)

Apache与Tomcat负载集群的3种方法

  • jk、jk_proxy、http_proxy

本次集成使用的软件版本:

安装步骤:

  • 安装jdk
  • 安装Apache2.4.23.
  • 解压tomcat、并命名:tomcat1、tomcat2
  • 拷贝mod_jk.so到Apache安装路径的modules文件夹下

配置步骤:

修改Apache配置:

关于修改涉及到的文件httpd.conf和workers.properties文件可以下载一份mod_jk的源码包参看

  • 修改Apache配置文件httpd.conf, 在最后一行末尾添加:
    include “D:\Apache_Group\Apache24\conf\mod_jk.conf”
  • 在httpd.conf 同目录下新建mod_jk.conf文件
  • 内容如下:
#加载mod_jk Module
LoadModule jk_module modules/mod_jk.so
#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount /*.jsp controller
  • 在httpd.conf同目录下新建 workers.properties文件
    这里可以配置任意多个Tomcat,此处配置了2个Tomat服务器.
    host和port根据自己实际配置.实例配置的是本机两个tomcat,分别使用不同的端口.避免冲突
    如果Tomcat不再同一机器上,没必要改端口的。
worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13 #定向包协议
worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
worker.tomcat1.redirect = tomcat2
#========tomcat2========
worker.tomcat2.port=18009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13 #定向包协议
worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多
worker.tomcat2.redirect = tomcat1
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=false 
#worker.controller.sticky_session=1

修改 Apache httpd.conf 和 httpd-ahssl.conf

  • 修改Apache配置文件httpd.conf, 在最后一行末尾添加:
    include “D:\Apache_Group\Apache24\conf\mod_jk.conf”

  • 修改httpd.conf SRVROOThttpdahssl.conf {SRVROOT}替换成Apache 根目录

修改Tomcat1 server.xml 配置

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">


  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />


  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost" jvmRoute = "tomcat2">


        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">

            <Channel className="org.apache.catalina.tribes.group.GroupChannel">

                <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="224.0.0.1"
                port="45564"
                frequency="500"
                dropTime="3000"/>

                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="auto"
                port="4001"
                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>

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>


      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">


      </Host>
    </Engine>
  </Service>
</Server>

修改Tomcat2 server.xml 配置

<?xml version='1.0' encoding='utf-8'?>


<Server port="18005" shutdown="SHUTDOWN">


  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />


  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <Service name="Catalina">


    <Connector port="18080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost" jvmRoute = "tomcat1">


        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">

            <Channel className="org.apache.catalina.tribes.group.GroupChannel">

                <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="224.0.0.1"
                port="45564"
                frequency="500"
                dropTime="3000"/>

                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                address="auto"
                port="4002"
                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>  


      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>


      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">



      </Host>
    </Engine>
  </Service>
</Server>

修改 xxxxxxx\tomcat\conf\web.xml

最后一行增加代码

<Context distributable="true" />

编写测试test.jsp代码

<html>
    <head>
          <title>tomcat集群测试</title>
    </head>

    <body>
    <%
        System.out.println("call test.jsp");
    %>   
        SessionID: <%=session.getId() %>  
    </body>
</html>

运行Apache 、Tomcat1、Tomcat2

Apache

这里写图片描述

Tomcat1

这里写图片描述

Tomcat2

这里写图片描述

Tomcat1 Tomcat2 doc 窗口显示
这里写图片描述

启动Apache (apache配置域名:localhost:80)

统一入口访问:http://localhost/test/test.jsp

这里写图片描述

这里写图片描述

这里写图片描述

搭建过程中遇到的一些问题:

  • 当Apache在非根目录下时可能出现如下错误:
1. httpd: Syntax error on line 35 of D:/Apache_Group/Apache22/conf/httpd.conf: ServerRoot must be a valid directory

解决方法:将httpd.conf 里的ServerRoot 替换成 Apache22解压的目录即可
  • Apache 与 mod_jk.so文件版本不匹配问题
Cannot load D:/Apache_Group/Apache22/modules/mod_jk.so into server: %1 \xb2\xbb\xca\xc7\xd3\xd0\xd0\xa7\xb5\xc4 Win32 \xd3\xa6\xd3\xc3\xb3\xcc\xd0\xf2\xa1\xa3

解决方法:保持版本一致,位数一致
  • 找不到SSLCertificateFile问题
AH00526: Syntax error on line 137 of D:/Apache_Group/Apache24/conf/extra/httpd-ahssl.conf:
SSLCertificateFile: file 'D:/Apache24/conf/ssl/server.crt' does not exist or is empty

解决办法:将httpd-ahssl.conf ${SRVROOT}全部替换成Apache根目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值