热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Apache2.2.X+Tomcat5.x使用mod_proxy方式配置负载均衡集群

使用Apache做集群及负载均衡的方式一般有两种:mod_jk和mod_proxy两种。本人尝试过用mod_jk的方式配置过,但都不是很成功,apache2.2.x后已经将mod_proxy集成进来,无需使用其他软件、插件,通过配置就可以完成与tomcat的集成。下面讲述以mod_proxy方式配置

使用Apache做集群及负载均衡的方式一般有两种:mod_jk和mod_proxy两种。

    本人尝试过用mod_jk的方式配置过,但都不是很成功,apache2.2.x后已经将mod_proxy集成进来,无需使用其他软件、插件,通过配置就可以完成与tomcat的集成。下面讲述以mod_proxy方式配置情况: 

    环境:windowsxp,apache2.2.x,tomcat5.5,jdk1.5.0,tomcat放在同一台机器上,3份。

    安装过程略。。。,以下讲述配置过程 

    1、Apache配置

    1.1 httpd.conf配置

     修改APACHE的配置文件D:\Apache \conf\httpd.conf
将以下Module的注释去掉,这里并没有使用mod_jk.so进行apache和tomcat的链接,从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   

    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

    再找到加上index.jsp修改成,我项目的默认欢迎页面是index.jsp,记得与前一个之前用空隔分隔。 
   

 dir_module>  

    DirectoryIndex index.html index.jsp main.html   

  


    DirectoryIndex index.html index.jsp main.html

 
   接着找到以下这两行,把下面一行的#号去掉,表示将 conf/extra/httpd-vhosts.conf配置文件加进来 

# Virtual hosts    

   Include conf/extra/httpd-vhosts.conf   

# Virtual hosts
   Include conf/extra/httpd-vhosts.conf

 
   最后,在文件最后加上以下内容,表示打开反向代理。 这个很重要,我的项目之前就是没有加上这几行,只能显示index.jsp页面的内容,登录成功后去不能正确跳转到相关页面,还是返回到index.jsp页面。反向代理可以基于一整个站点,也可以基于一个目录。 

ProxyRequests Off   

 *:80>    

    Order deny,allow    

    Allow from all    

   

ProxyRequests Off

        Order deny,allow
        Allow from all

 
    2.2 http-vhost.conf配置

   修改conf/extra/httpd-vhosts.conf

   在文件最后加上以下代码
  

 *:80>  

    ServerAdmin habibliu@gmail.com   

    ServerName localhost   

    ServerAlias localhost   

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

    ProxyPassReverse / balancer://cluster/   

     balancer://cluster>  

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

        BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2  

        BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3  

      

  


        ServerAdmin habibliu@gmail.com
        ServerName localhost
        ServerAlias localhost
        ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
        ProxyPassReverse / balancer://cluster/
        
                BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=s1
                BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2
                BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3
        

   说明:
均衡器粘连会话名称。该值常常会被设置为类似JSESSIONID或者PHPSESSIONID之类的值,他依赖于支持会话的后端应用服务器。如果后端服务器使用不同的COOKIE名称或者URL编码的ID(像servlet容器),使用|来分开他们。第一个部分针对COOKIE,第二个针对路径。
每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过jvmRoute 和route 做了绑定之后,信息更加准确。但是,仔细观察,每次请求的SessionID都是不一样! 对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。 stickySession 粘性会话,根据这一属性,浏览器将通过COOKIE绑定SeesionID。如果这个时候再次访问http://localhost/zlex ,你会发现,页面不会来回跳转了!

     引用:     

sticky模式
利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群 中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢 失;
同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !
   BalancerMember 是负载均衡参与的成员定义,与tomcat的ajp协议通讯。上面红色的端口号分别是三个tomcat的conf/server.xml中的配置的AJP/1.3协议连接器,由于在同一台机器上部署,所以三个tomcat中的这个端口都要改成不一样的,我这里分别改成8009,8109,8209。紧接着是route设置,值与每个tomcat的配置对应上,下面会说明。
   2、Tomcat的配置说明
   1、server.xml配置
修改%TOMCAT_HOME%\conf\server.xml
由于三个tomcat都部署在一台机器上,所以相关会引起冲突的端口都要改,分别是:
       shutdow,http connector,ajp connector,以下是三个tomcat server.xml文件中三个端口的配置清单:
       tomcat s1:

  

....   

 

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  

               enableLookups="false" redirectPort="8443" acceptCount="100"  

               debug="0" cOnnectionTimeout="20000"    

               disableUploadTimeout="true" />   

....   

 

               enableLookups="false" redirectPort="8443" debug="0"  

               protocol="AJP/1.3" />  


....
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" cOnnectionTimeout="20000"
               disableUploadTimeout="true" />
....
                 enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />

 
   Tomcat s2 
  

 port="8915" shutdown="SHUTDOWN" debug="0">  

....   

  port="9100"  

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  

               enableLookups="false" redirectPort="8443" acceptCount="100"  

               debug="0" cOnnectionTimeout="20000"    

               disableUploadTimeout="true" />  

....   

  port="8109"    

               enableLookups="false" redirectPort="8443" debug="0"  

               protocol="AJP/1.3" />  


....
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" cOnnectionTimeout="20000"
               disableUploadTimeout="true" />
....
                 enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />

 
    Tomcat s3

 port="8925" shutdown="SHUTDOWN" debug="0">  

....   

  port="9200"  

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  

               enableLookups="false" redirectPort="8443" acceptCount="100"  

               debug="0" cOnnectionTimeout="20000"    

               disableUploadTimeout="true" />  

....   

  port="8209"    

               enableLookups="false" redirectPort="8443" debug="0"  

               protocol="AJP/1.3" />  


....
                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" cOnnectionTimeout="20000"
               disableUploadTimeout="true" />
....
                 enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />


   以上的AJP端口与apache http-vhost.conf中的BalancerMember 的ajp端口对应。
    接着找到的,加上jvmRoute="xx"属性,xx要与apache http-vhost.conf中的BalancerMember 的ajp route定义一致。以下是三个tomcat的engine设置 


    Tomcat s1 
   

 name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s1">  

 

 
   Tomcat s2

 name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s2">  

 

 
     Tomcat s3    
   

 name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s3">  

 

 
    接着到到Cluster配置段,将这一段的注释符号去掉,如下: 
 

 className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"  

                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"  

                 expireSessiOnsOnShutdown="false"  

                 useDirtyFlag="true">  

                

                className="org.apache.catalina.cluster.mcast.McastService"  

                mcastAddr="228.0.0.4"  

                mcastPort="45564"  

                mcastFrequency="500"  

                mcastDropTime="3000"/>  

                

                className="org.apache.catalina.cluster.tcp.ReplicationListener"  

                tcpListenAddress="auto"  

                tcpListenPort="4001"  

                tcpSelectorTimeout="100"  

                tcpThreadCount="6"/>  

              

                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"  

                replicatiOnMode="pooled"/>  

             className="org.apache.catalina.cluster.tcp.ReplicationValve"  

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

             className="org.apache.catalina.cluster.deploy.FarmWarDeployer"  

                      tempDir="/tmp/war-temp/"  

                      deployDir="/tmp/war-deploy/"  

                      watchDir="/tmp/war-listen/"  

                      watchEnabled="false"/>  

          

                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
                 expireSessiOnsOnShutdown="false"
                 useDirtyFlag="true">
                             className="org.apache.catalina.cluster.mcast.McastService"
                mcastAddr="228.0.0.4"
                mcastPort="45564"
                mcastFrequency="500"
                mcastDropTime="3000"/>
                             className="org.apache.catalina.cluster.tcp.ReplicationListener"
                tcpListenAddress="auto"
                tcpListenPort="4001"
                tcpSelectorTimeout="100"
                tcpThreadCount="6"/>
                             className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
                replicatiOnMode="pooled"/>
                                filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
                                   tempDir="/tmp/war-temp/"
                      deployDir="/tmp/war-deploy/"
                      watchDir="/tmp/war-listen/"
                      watchEnabled="false"/>
        

     注意:如果同一台设备上有多个tomcat,这个tcpListenPort就中设置不同的端口号,以免冲突。
    所以三个tomcat的这个端口分别是4001、4002、4003。
3、其它配置
执行以上步骤基本已经可以成功了,当然还要设置你的webapp,这个不在此累赘了。当然最好还要设置JAVA_HOME,PATH,CLASSPATH这些环境变量,比如将%JAVA_HOME%\lib\tools.jar和%JAVA_HOME%\lib\rt.jar两个包加到类路径内。
还有元素,有些文章说还要将元素加到项目的web.xml文件中,我也加了,但没有验证它的存在对运行有没有影响,大家如果碰到问题,也不防加上。


推荐阅读
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
  • Centos7 Tomcat9 安装笔记
    centos7,tom ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • Java毕业设计项目:“传情旧物”网站(含源码与数据库)
    本项目介绍了如何配置和运行“传情旧物”网站,包括所需的技术栈、环境配置以及具体的操作步骤。 ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 直播带货系统中的推流技术详解
    本文介绍了RTMP(实时消息传输协议)及其在直播带货系统中的应用,并详细探讨了带货直播系统的连麦方案,包括服务端合流和客户端合流的优势与劣势。 ... [详细]
author-avatar
asdfu_814
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有