`

apache 使用 proxy 实现tomcate负载均衡(session复制)

阅读更多
Apache+tomcat负载均衡的入门配置 
目录 
一、准备工作 
二、配置Apache 
1、打开相关的模块。 
2、配置tomcat集群。 

三、配置tomcat 2 
1、配置server的关闭。 
2、配置Connector 
3、配置Engine 
4、配置Session的复制 
四、配置web项目web.xml
五、负载分配算法设置
六、热备份(Hot Standby) 


一、准备工作 
安装JDK并配置环境变量。这里要求至少1.5以上版本。 
安装apache2.2。我的安装目录为:D:\Apache2.2 
安装tomcat6。为了端口不起冲突,建议直接解压。我这里只使用了两台tomcat作为集群服务器。其路径分别为D:\apache-tomcat-6.0.20_v1、D:\apache-tomcat-6.0.20_v2 

二、配置Apache 
这里说明一下,我在网上找到的一些资料都在介绍mod_JK的方式配置负载均衡。但是从apache2.X版本之后其自身已经集成了mod_jk可以直接使用mod_proxy的方式进行负载均衡的配置,所以下面介绍的也即是这种方式。 
在D:\Apache2.2\conf目录下找到httpd.conf文件,并进行修改。修改步骤: 

1、打开相关的模块。 
LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 
LoadModule proxy_balancer_module modules/mod_proxy_balancer.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 rewrite_module modules/mod_rewrite.so 
在配置文件里找到上述模块,将前边的“#”去掉. 

2、配置tomcat集群。 
在该配置文件的最后加上: 
ProxyRequests Off 
ProxyPass / balancer://cluster/ 
<proxy balancer://cluster> 
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 
BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2 
</proxy> 
# 警告:以下这段配置仅用于调试,绝不要添加到生产环境中!!!  
<Location /balancer-manager>  
    SetHandler balancer-manager  
    order Deny,Allow  
    Deny from all  
    Allow from localhost  
</Location>  
     注意红色部分,因为这里我只使用了一台物理机器作为集群的配置,所以就直接使用了localhost指向本地的集群服务器,你也可以使用127.0.0.1。如果这里你使用多台机器一起配合的话,只需要将localhost修改为其他机器的IP地址就行。 
      <Location /balancer-manager>是用来监视负载均衡的工作情况的,调试时可以加上(生产环境中禁止使用!),然后访问 http://localhost/balancer-manager/ 即可看到负载均衡的工作状况。

三、配置tomcat 

在D:\apache-tomcat-*\conf找到server.xml,然后着手修改。 
1、配置server的关闭。 
因为我是在同一台机器上配置两台tomcat,所以为了使tomcat关闭不出现端口被占用的情况,需要修改关闭端口。
<Server port="8005" shutdown="SHUTDOWN"> 
修改为: 
<Server port="XXXX" shutdown="SHUTDOWN"> 
注意,我这里用了两台tomcat,所以第一个tomcat我就选择了默认的端口8005,第二个tomcat我将此端口修改为了9005。总之,如果你有多台tomcat服务器群,都需要将它们的端口修改为互不冲突的端口号。 
2、配置Connector 
这里又两个地方需要修改,第一个就是tomcat监听的http端口,另一个就是tomcat监听的AJP端口: 
<Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" /> 
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
注意,蓝色部分是tomcat的http端口,因为我在同一台机器上配置了两个tomcat,为了使它们的http端口不冲突,我将第一个tomcat使用默认的端口即8080,第二个tomcat的http端口我修改为了8081。同样的道理,如果你还有其他的tomcat,记得将它们的http端口修改为互不冲突的端口号即可。 
另一个需要修改的端口,红色部分的端口,这里是apache和tomcat链接的关键,前台apache就是通过AJP协议与tomcat进行通信的,以完成负载均衡的作用。现在回过头去看看apache的httpd.conf配置, 
<proxy balancer://cluster> 
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 
BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2 
</proxy> 
那么,另一个tomcat的AJP端口你知道要配置成什么了吗?对了,就是9009。 
3、配置Engine 
<Engine name="Catalina" defaultHost="localhost">,这个是原来的配置,现在将这个配置修改为:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">,然后另一个tomcat修改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">。 

现在再回过头去看看apache的配置: 
<proxy balancer://cluster> 
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 
BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2 
</proxy> 
这里再说明一点,loadfactor相当于一种加权策略,loadfactor的值越大,对应的tomcat服务器分到的请求就越多。像上面的这种设置就说明两台tomcat将平均负载。 

4、配置Session的复制 
Tomcat里的service.xml中增加以下代码,注:下列官网配置代码中建议注释红色部分代码,否则启动报严重错误:FarmWarDeployer can only work as host cluster subelement!,但不影响正常使用。
 <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>
 
 
四、配置web项目web.xml
在web应用项目WEB-INF/web.xml文件<web-app>元素的最后加上: <distributable/>
 
完成上述步骤,进行session同步测试,顺利通过!
 
五、负载均衡算法
 默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使用 lbmethod 属性。如: 
Httpd.conf代码  收藏代码
ProxyRequests Off  
ProxyPass / balancer://cluster/ 
<proxy balancer://cluster> 
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1 
BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2 
</proxy> 
 
ProxySet lbmethod=bytraffic  
lbmethod可能的取值有: 
lbmethod=byrequests 按照请求次数均衡(默认) 
lbmethod=bytraffic 按照流量均衡 
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器) 
 六、热备份(Hot Standby) 
只要在后面加上status=+H即可(如下代码红色部分),正常情况下请求总是流向8009,一旦8009挂掉,Apache会检测到错误并把请求分流给9009。Apache会每隔几分钟检测一下8009的状况,如果8009恢复,就继续使用8009。 
ProxyRequests Off  
ProxyPass / balancer://cluster/ 
<proxy balancer://cluster> 
BalancerMember ajp://localhost:8009 loadfactor=1 route=jvm1  
BalancerMember ajp://localhost:9009 loadfactor=1 route=jvm2  status=+H
</proxy> 
 
本博客参考了:http://denghuan.iteye.com/blog/1968574 进行部分内容的补充,主要是实现session复制
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics