`
234390216
  • 浏览: 10238696 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462895
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775978
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398753
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395157
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680173
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531146
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185017
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468820
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151493
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68344
社区版块
存档分类
最新评论

Apache整合Tomcat、集群

阅读更多

Apache整合Tomcat、集群

 

目录

1.1     使用mod_proxy整合

1.2     使用mod_jk整合

1.3     集群

1.3.1    Tomcat集群配置

1.3.2    mod_proxy进行负载均衡

1.3.3    mod_jk进行负载均衡

 

       Apache整合Tomcat主要有两种方式,通过mod_proxy整合和通过mod_jk整合。

 

1.1     使用mod_proxy整合

       使用mod_proxy整合Tomcat需要我们开启Apache的代理功能,代理功能的开启可以通过在Apacheconf/httpd.conf文件中将如下内容前的“#”号去除,这样Apache就能在运行的时候加载mod_proxy模块了,从而开启了Apache的代理功能。

#LoadModule proxy_module modules/mod_proxy.so

 

       开启了mod_proxy之后我们还需要选择一个协议来作为Apache代理Tomcat的协议,可以是AJP协议、Http协议等。如果需要使用Http协议,那么请将Apacheconf/httpd.conf文件中如下内容前的“#”号去除(需要使用其它的协议时使用类似的方式)。Tomcat的官方文档说在进行Tomcat集群时使用AJP协议比使用Http协议的性能要更好It should be noted that the performance of HTTP proxying is usually lower than the performance of AJP, so AJP clustering is often preferable.)。

#LoadModule proxy_http_module modules/mod_proxy_http.so

 

       Apache的代理有两种方式,Reverse方式和Forward方式。Forward方式需要在客户端进行配置以利用代理服务器获取目标内容,Forward方式的一种常见场景就是我们的内网机器都无法连接外网,但是其中有一台可以连接,然后我们在可以连接外网的机器上搭建一个代理,让其它内网机器都通过该代理来访问外部网络。Reverse方式就无需在客户端进行配置了,客户端请求的目标地址是直接对应Reverse代理的,然后由Reverse代理在内部决定请求哪个真实的地址。本文将主要讲解Reverse代理方式。

 

       首先去掉httpd.conf文件中如下内容前的“#”号,以将Virtual Host的配置包含在Apache服务器的配置文件中,然后我们就可以在httpd-vhosts.conf文件中进行Virtual Host的配置了。

#Include conf/extra/httpd-vhosts.conf

 

       然后,我们在conf/extra/httpd-vhosts.conf文件中添加如下内容,其表示我们定义了一个虚拟主机,该虚拟主机将接收任何请求。

<VirtualHost *:80>

    ProxyPass "/" "http://localhost:8080/" max=300

       ProxyPassReverse "/" "http://localhost:8080/"

</VirtualHost>

 

       上述的指令ProxyPass是用来映射代理的路径的,其语法是:

       ProxyPass path !|url [key=value[key=value…]]

 

       其中path表示Apache请求的相对路径,而“!”则表示不对该路径进行代理,url则表示需要代理的路径,后面的key=value表示需要指定的参数。在我们的示例中就是使用根路径“/”代理本地8080端口的根路径“/”,然后参数max表示同时最多允许300个对后台代理服务的并发请求。关于ProxyPass的更多信息请参考http://httpd.apache.org/docs/2.4/zh-cn/mod/mod_proxy.html#proxypass

 

       指令ProxyPassReverse是用来对后台代理应用返回过来的Response Header中的URL进行转换的,使其能够以Apache的形式正确的展示。比如请求后台服务后需要重定向到http://localhost:8080/examples则通过ProxyPassReverse指令进行转换后将会把重定向地址改为http://localhost/examples

 

       这个时候我们在8080端口启动Tomcat,然后在80端口启动Apache,之后我们所有对80端口的请求都将由Apache代理请求到8080端口的Tomcat应用。

 

       如下这样的配置就表示不对“/examples”路径进行代理,此时访问“/examples”时将去Apache自己的路径下寻找对应的资源。

<VirtualHost *:80>

    ProxyPass "/examples" "!"

       ProxyPass "/" "http://localhost:8080/" max=300

       ProxyPassReverse "/" "http://localhost:8080/"

</VirtualHost>

 

       此时如果你在浏览器里面访问http://localhost/examples时会得到一个403页面,原因是Apache默认会禁止对根目录以外的路径的访问。此时,我们需要找到httpd.conf文件中的如下内容:

<Directory />

    AllowOverride none

    Require all denied

</Directory>

 

       并将其修改为如下内容:

<Directory />

    AllowOverride none

    Order Deny,ALlow

       Allow from All

</Directory>

 

       更多内容请参考http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

 

1.2     使用mod_jk整合

       首先我们需要下载mod_jk.so,其由Tomcat提供,可以从网址http://tomcat.apache.org/connectors-doc/寻找对应Apache版本的mod_jk.so进行下载。下载后将mod_jk.so放到Apache服务器的modules目录下。

 

       然后在httpd.conf文件的末尾加上如下内容以加载mod_jk

# 加载mod_jk模块

LoadModule    jk_module  modules/mod_jk.so

# 指定workers.properties文件的路径

JkWorkersFile conf/workers.properties

# 指定Jk的日志输出路径

JkLogFile     logs/mod_jk.log

# 指定Jk日志文件的输出级别,[debug/info/error]

JkLogLevel    info

# 指定日志输出时间的格式

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

 

       之后可以在extra/httpd-vhosts.conf文件中加上如下内容(注意需要在httpd.conf文件中include extra/httpd-vhosts.conf文件)。

<VirtualHost *:80>

       # 指定交给worker1进行处理的路径

       JkMount /* worker1

       # 指定不交给worker1进行处理的路径

       JkUnMount /examples/* worker1</VirtualHost>

 

       上述指令所代表的含义已经在注释中给出,关于针对Jk Module的更多配置信息官方文档http://tomcat.apache.org/connectors-doc/reference/apache.html的配置说明。

 

       接下来需要在我们指定的workers.properties文件中定义对应的worker。这里我们指定如下。

#指定需要定义的worker列表,多个worker之间使用逗号分隔

worker.list=worker1

#指定worker1type

worker.worker1.type=ajp13

#指定worker1连接的TomcatIP

worker.worker1.host=localhost

#指定worker1连接tomcat的端口,因为我们worker1使用的typeajp13,这里需要是ajp13协议的端口

worker.worker1.port=8009

#指定worker1对应的连接池的大小

worker.worker1.connection_pool_size=300

 

       使用ajp13协议时,对应的连接端口对应于我们的Tomcatserver.xml文件中配置的ajp13协议的端口,如:

    <!-- Define an AJP 1.3 Connector on port 8009 -->

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

 

       更多关于workers.properties文件可以配置的信息请参考Tomcat的官方文档。http://tomcat.apache.org/connectors-doc/reference/workers.html

 

       通过如上配置后除了/examples下的内容以外,我们就完全把Tomcat交给了Apache代理。

1.3    集群

       Apache整合Tomcat进行集群是将多个Tomcat进行集群,集群的各个节点之间可以进行Session的同步等,然后通过上述介绍的两种方式使用Apache代理以实现对各个节点之间的负载均衡。其实除了Apache服务器对Tomcat集群进行负载均衡外,常用的进行负载均衡代理的还有Nginx,本文的主题是Apache整合Tomcat,所以不会对Nginx代理Tomcat集群进行讲解,有兴趣的朋友可以自己查阅相关的文档进行了解。

 

1.3.1Tomcat集群配置

       Tomcat的集群配置最简单的方式是将Tomcatconf目录下的server.xml文件中的<cluster>标签的注释打开。

      <!--

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

      -->

 

       注意如果是在同一台电脑上同时启动多个Tomcat进行集群时需要保证各个Tomcat使用的Server端口、Http端口和Ajp端口都是各不相同的。

 

       只配置一个<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”/>Tomcat默认会为我们配置如下内容:

        <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.0.0.4"

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

                      address="auto"

                      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>

 

       关于Tomcat集群的详细配置信息请参考Tomcat的官方文档http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

       使用Tomcat进行集群时,如果我们Session能够在多个节点之间进行自动复制,我们需要保证存在在Session中的attribute都是可序列化的,即都是实现了java.io.Serializable接口的,此外我们需要部署在每个Tomcat节点上的应用的web.xml文件中定义了<distribuable/>

 

1.3.2mod_proxy进行负载均衡

       为使用mod_proxy能够支持负载均衡,我们需要加载mod_proxy_balancer模块,该模块提供的功能就是负载均衡,但是使用的负载均衡算法并不由它提供,而是由对应的算法模块提供。Apache自带的算法模块有如下四种。

LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so

LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

 

       mod_proxy_balancer默认使用的负载均衡算法是byrequests,所以默认情况下我们还需要加载mod_lbmethod_byrequests模块。此外,还需要加载提供共享内存的模块mod_slotmem_shm.so。所以,总的来说我们需要加载如下三个模块。

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

 

       接下来,我们可以在VirtualHost下配置如下内容:

<VirtualHost *:80>

       <Proxy "balancer://elim">

              #定义负载均衡的成员,loadfactor用于指定负载权重的

              BalancerMember "http://localhost:8080" loadfactor=1

              BalancerMember "http://localhost:9090" loadfactor=2

              #ProxySet指令用于设定balancer的参数

              ProxySet lbmethod=byrequests

       </Proxy>

       #代理什么路径就在balancer://elim后加什么路径

       ProxyPass "/" "balancer://elim/"

       ProxyPassReverse "/" "balancer://elim/"

</VirtualHost>

 

       在上述配置中我们通过<Proxy>标签来定义了一个负载均衡代理,名叫“balancer://elim”,在使用<Proxy>标签进行代理的定义时,如果我们的前缀是以“balancer://”开始的,则定义的是一个负载均衡代理。在其中可以通过BalancerMember来指定对应的成员,loadfactor用来指定对应的负载权重。通过ProxySet指令我们指定了负载均衡代理balancer://elim的负载均衡算法为byrequests,这也是负载均衡代理的默认算法。然后通过ProxyPass指定对应路径的代理时,我们就可以指定为我们定义的负载均衡代理balancer://elim。需要注意的是如果我们需要代理的是根路径,需要在balancer://elim后也加上根路径“/”。通过如上配置以后我们的负载均衡代理就建立起来了。

       关于mod_proxy_balancer负载均衡的更多介绍请参考文档http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html。更多负载均衡配置信息请参考http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

 

       Apache为我们提供了一个mod_status模块,通过该模块我们可以监测我们的负载均衡代理的运行情况,或在运行时修改我们的负载均衡的成员的配置信息。首先我们需要加载mod_status模块。

LoadModule status_module modules/mod_status.so

 

       然后我们需要在httpd.conf文件中通过Location指定我们监测负载均衡的路径和对应的处理器。如下配置则表示我们将监测路径定义为/balancer-status,对应的处理器为balancer-manager,然后允许所有的用户请求该地址。

<Location /balancer-status>

       SetHandler balancer-manager

    Order deny,allow

    Allow from all

</Location>

 

     如果我们需要监测的是我们的Apache服务器的运行情况,则可以将上述的SetHandler设置为server-status。需要注意的是当和代理一起使用的时候,需要避免指定的访问路径和代理的代理路径相冲突,此时需要我们将监测Apache服务器运行情况的访问路径从代理中移除。

 

1.3.3mod_jk进行负载均衡

       当使用mod_jk进行负载均衡的时候,我们需要修改我们的workers.properties文件的定义。此时,我们将workers.properties的内容修改为如下形式。

worker.list=cluster

#指定名为clusterworker的类型是lb,即负载均衡

worker.cluster.type=lb

#指定负载均衡worker的参与者为worker1worker2

worker.cluster.balance_workers=worker1,worker2

#当为true时同一个Session发送的请求只会代理到相同的Tomcat节点上

worker.cluster.sticky_session=false

#表示是否强制绑定session,该参数只针对sticky_sessiontrue时才有效。当sticky_sessionsticky_session_force都为true

#时,如果对应SessionTomcat不可用了,对应的请求将会返回对应的错误页面给客户端,否则将由其它节点来进行接管处理。

worker.cluster.sticky_session_force=false

#指定worker1连接Tomcat的协议类型

worker.worker1.type=ajp13

#指定worker1的对应的TomcatIP

worker.worker1.host=localhost

#指定worker1连接Tomcat时使用的端口号

worker.worker1.port=8009

#指定worker1在集群中负载的权重为1,数字越大负载越高

worker.worker1.lbfactor=1

#指定worker2连接Tomcat的协议类型

worker.worker2.type=ajp13

#指定worker2的对应的TomcatIP

worker.worker2.host=localhost

#指定worker2连接Tomcat时使用的端口号

worker.worker2.port=18009

#指定worker2在集群中负载的权重为2,由于worker11,所以worker2将占总负载的2/3

worker.worker2.lbfactor=2

       该配置表示我们的Tomcat集群中拥有两台Tomcat服务器,然后这两台Tomcat都是部署在同一台服务器上的。接下来,我们需要告诉Apache哪些请求将交给我们的负载均衡worker——cluster处理。

<VirtualHost *:80>

 

       # 指定将所有的请求都交给我们的负载均衡worker——cluster进行处理。

       JkMount /* cluster

</VirtualHost>

 

       使用mod_jk进行负载均衡的时候需要注意的是我们需要在我们的Tomcatserver.xml文件中为我们的Engine指定jvmRoute,且对应的值还必须和我们在workers.properties文件中指定的负载均衡worker的名称一致。

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

 

       经过上述配置以后我们的mod_jkTomcat集群的负载均衡就搭建好了。其默认的负载均衡策略是通过Request来进行负载均衡的,我们可以通过在worker.properties文件中对类型为lbworker指定其method属性来显示的指定负载均衡策略。除了Request外,还有SessionNextTrafficBusiness,关于这几种负载均衡策略的详细介绍请参考文档http://tomcat.apache.org/connectors-doc/reference/workers.html

 

       mod_jk中有一类特殊的worker类型,status类型,它可以用来监测worker的运行情况和在运行时动态更改worker的配置信息等。定义status类型的worker非常简单,只需要指定一个workertypestatus,同时在worker.list中进行声明。

#指定名为clusterworker的类型是lb,即负载均衡

worker.cluster.type=lb

#指定负载均衡worker的参与者为worker1worker2

worker.cluster.balance_workers=worker1,worker2

#当为true时同一个Session发送的请求只会代理到相同的Tomcat节点上

worker.cluster.sticky_session=false

#表示是否强制绑定session,该参数只针对sticky_sessiontrue时才有效。当sticky_sessionsticky_session_force都为true

#时,如果对应SessionTomcat不可用了,对应的请求将会返回对应的错误页面给客户端,否则将由其它节点来进行接管处理。

worker.cluster.sticky_session_force=false

#指定worker的类型为status

worker.status.type=status

 

       之后我们需要为类型为statusworker指定一个对应的访问路径。

<VirtualHost *:80>

       # 指定将请求路径/status交给名叫statusworker处理。

       JkMount /status status

       # 指定将所有的请求都交给我们的负载均衡worker——cluster进行处理。

       JkMount /* cluster

</VirtualHost>

 

       这样我们在请求路径为/status的时候就可以监测worker的运行状态等信息了。更多关于类型为statusworker的介绍请参考官方文档http://tomcat.apache.org/connectors-doc/reference/status.html

 

参考文档

       http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

       http://tomcat.apache.org/connectors-doc/reference/apache.html

       http://tomcat.apache.org/connectors-doc/reference/workers.html

       http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

       http://tomcat.apache.org/connectors-doc/generic_howto/loadbalancers.html

       http://tomcat.apache.org/connectors-doc/reference/status.html

       http://httpd.apache.org/docs/2.4/mod/mod_proxy_balancer.html

       http://httpd.apache.org/docs/2.4/mod/mod_status.html

 

(注:本文是基于Apache Tomcat7.0.50版本和Apache Httpd2.4版本所写)

(注:原创文章,转载请注明出处。原文地址:http://haohaoxuexi.iteye.com/blog/2247244

 

 

0
2
分享到:
评论

相关推荐

    Apache,Tomcat集群和负载均衡

    Apache,Tomcat集群和负载均衡包括了apache-tomcat-5.5.29.zip,apache_2.2.4-win32-x86-no_ssl.msi,mod_jk-1.2.28-httpd-2.2.3.so,ApacheTomcat整合文档.doc,Apache,Tomcat集群和负载均衡教程.doc,Tomcat负载...

    Apache+Tomcat整合

    综上所述,Apache 和 Tomcat 的整合涉及了 Apache 的模块加载、反向代理配置,以及 Tomcat 的集群和连接器设置。通过这种方式,我们可以实现一台主机上的单站点集群和负载均衡,从而提升网站的可用性和性能。

    Apache整合tomcat模块

    在实际应用中,为了充分利用两者的优势,通常会将Apache与Tomcat进行整合,以实现更高效的Web服务。在这个过程中,Apache的mod_jk模块起到了关键作用。 mod_jk是Apache的一个模块,其主要任务是连接Apache和Tomcat...

    apache与tomcat负载集群的3种方法.docx

    关于apache整合tomcat后的一些参数设置,实现一个tomcat的集群,我自己实现过了

    Apache与Tomcat集群,伪静态,负载均衡

    在ApacheTomcat整合教程.doc文件中,详细步骤和配置示例应会涵盖以上内容,包括Apache和Tomcat的安装指南、模块的启用方法、配置文件的编辑技巧以及负载均衡策略的设置。通过这份文档,你可以逐步实践并掌握这些技术...

    ApacheTomcat集群整合教程

    Apache Tomcat 集群整合教程旨在教你如何配置和部署多台Tomcat服务器,以实现高可用性和负载均衡。在大型应用系统中,单一的Tomcat服务器可能无法满足高并发和高可靠性的需求,这时就需要通过集群来分散服务压力。本...

    apache+tomcat整合配置

    将Apache与Tomcat整合,可以实现动态和静态内容的高效分发,提高Web服务的性能。下面我们将详细介绍如何进行Apache与Tomcat的整合配置。 1. **安装与准备** - 首先,你需要在服务器上分别安装Apache HTTP服务器和...

    apache+多tomcat集群配置过程记录

    在高并发或大型项目中,通常会采用Apache与多台Tomcat集群的方式提高系统性能和可用性。下面将详细介绍这个配置过程。 1. **Apache HTTP Server配置** Apache HTTP Server(简称Apache)作为反向代理服务器,可以...

    APACHE+TOMCAT整合示例

    根据网上的apache+tomcat集群整合,自己配出来的作为示例,备忘用

    window+apache+tomcat的集群整合

    window+apache+tomcat的集群整合 Apache是http服务器,我们可以利用它对tomcat进行负载均衡.

    Apache与Tomcat整合手册-无集群版(原创)

    Apache与Tomcat整合手册-无集群版(原创)

    window+apache+tomcat的集群

    window apache tomcat的集群 window+apache+tomcat的集群

    apache2与tomcat整合

    在实际应用中,Apache2与Tomcat的整合还有其他高级功能,比如集群配置(clustering)和session复制,以实现更复杂的应用场景,如故障转移和高可用性。此外,通过Apache可以实现IP过滤、URL重写等高级功能,这些都是...

    Apache与tomcat整合、性能、集群、测试.pdf

    1. **压力测试**:使用压力测试工具如JMeter模拟高并发请求,测试Apache与Tomcat集群的最大承载能力,评估系统在高负载下的响应时间和资源消耗。 2. **功能测试**:确保整合后的集群系统能够按照预期工作,包括静态...

Global site tag (gtag.js) - Google Analytics