APACHE + tomcat配置负载均衡

    技术2022-05-19  23

    APACHE + tomcat配置负载均衡

     

    使用 apache tomcat 配置一个可以应用的 WEB 网站,要达到以下要求:

    Apache 做为 HttpServer ,后面连接多个 tomcat 应用实例,并进行负载均衡。

    注:本例程以一台机器为例子,即同一台机器上装一个apache2Tomcat

    前期准备工作:

    jdk-6u24-windows-x64(1)

    apache-tomcat-6.0.32-windows-x64.zip

    httpd-2.2.17-win32-x86-no_ssl.msi.

    测试在win7  64位系统上进行。

    安装过程:

      安装JDKTOMCATAPACHE ()

    配置:apache

    配置httpd.conf

    修改APACHE的配置文件/conf/httpd.conf

    将以下Module的注释去掉,这里并没有使用mod_jk.so进行apachetomcat的链接,从2.X以后apache自身已集成了mod_jk.so的功能。只需简单的把下面几行去掉注释,就相当于以前用mod_jk.so比较繁琐的配置了。这里主要采用了代理的方法,就这么简单。

    LoadModule proxy_module modules/mod_proxy.so

    LoadModule proxy_connect_module modules/mod_proxy_connect.so

    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

    LoadModule proxy_http_module modules/mod_proxy_http.so

    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

     

    在最下面加入

    ProxyRequests Off

    <proxy balancer://cluster>

    BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1

    BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2

    #BalancerMember ajp://192.168.0.162:9007 loadfactor=1 route=jvm3

    </proxy>

    httpd-vhosts.conf设置

    接下来进行虚拟主机的设置。APACHE的虚拟主机设置如下:

    首先要修改 conf/httpd.conf找到(#Include conf/extra/httpd-vhosts.conf)

    把注释去掉。

    # Virtual hosts

    Include conf/extra/httpd-vhosts.conf

    在文件(extra/httpd-vhosts.conf)最下面加入

    <VirtualHost *:80>

             ServerAdmin hepeng1@163.com

             ServerName 192.168.0.165

             ServerAlias 192.168.0.165

             ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On

             ProxyPassReverse / balancer://cluster/

    </VirtualHost>

    其中的域名和路径根据你自己情况设置

    配置 tomcat

    配置 server 的关闭

    我们需要在一台机器上跑 2 个不同的 tomcat ,需要修改不同的 tomcat 的关闭口,避免出现端口被占用的情况。其中tomcat6.0用默认值,不修改。其它的修改。在tomcat6.2/conf 下的 server.xml 中找到 server, 将:

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

    改为

     

    Prot=”XXX” 在这里表示不同的端口:另外一个 tomcat 分别使用不同的端口

    配置 Engine

    把原来的配置注释掉,把下面一句去掉注释。并标明jvmRoute="jvm2".

    <Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm2">        

    以下是原来的配置。

    <!-- <Engine name="Catalina" defaultHost="localhost">  -->

    配置 Connector

    原来的默认配置。

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

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

    这里是apachetomcat链接的关键,前台apache就是通过AJP协议与tomcat进行通信的,以完成负载均衡的作用。也可以用HTTP协议。大家注意它们是如何连接通信的,上面的红色部分(port="8009")就是连接的接口了。

    把另外个tomcat<Connector port="XXX" />port分别按照上面修改

    配置Cluster(每个tomcat中都要修改)

    原来的配置。

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

    修改为以下的代码:<Receiver port=XX/>port也要保证唯一性。

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

           <!-- 

            <Manager className="org.apache.catalina.ha.session.BackupManager"

                     expireSessionsOnShutdown="false"

                     notifyListenersOnReplication="true"

                     mapSendOptions="6"/>

             -->

            <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="5001"

                          selectorTimeout="100"

                          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"/>

                <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>

            </Channel>

            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

                   filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>

           <!--

            <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>

    1:这个设置是主要用以tomcat的集群,包括tomcat session 同步

    Manager用来在节点间拷贝Session,默认使用DeltaManagerDeltaManager采用的一种all-to-all的工作方式,即集群中的节点会把Session数据向所有其他节点拷贝,而不管其他节点是否部署了当前应用。当集群中的节点数量很多并且部署着不同应用时,可以使用BackupManagerBackManager仅向部署了当前应用的节点拷贝Session

    但是到目前为止BackupManager并未经过大规模测试,可靠性不及DeltaManager

     

     加上以下的代码tomcat 启动的时候会出现警告信息,可以去掉此配置

     <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

                      tempDir="/tmp/war-temp/"

                      deployDir="/tmp/war-deploy/"

                      watchDir="/tmp/war-listen/"

                      watchEnabled="false"/>

    修改应用web.xml 

    增加属性:session 同步。

    <distributable/>

    如果session 同步出现

    放入session中的对象必须实现java.io.Serializable接口

    如果不Serializable会出现以下错误

    启动服务


    最新回复(0)