zoukankan      html  css  js  c++  java
  • Apache Http Server部署负载均衡

    Apache Http Server部署负载均衡

    一、Apache下载安装:

    1. Apache 下载:建议从官网下载http://httpd.apache.org/download.cgi

    2. 安装方法参照http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html
      安装的时候若出现:(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager…。可查看此链接http://blog.csdn.net/u010544319/article/details/8938491

    3. 之前在网上找到的配置方法一般是需要安装mod_jk,配置worker.properties的,这种方法是早期的apache的配置方式。现在的2.4.25已经集成了mod_jk,不需要安装mod_jk配置worker.properties了,简单了很多。

    二、配置Apache:

    1. 找到Apache2.4安装目录下面的httpd.conf 我的路径是:D:Apache24conf,第38行要修改成自己安装的目录 Define SRVROOT “D:Apache24”,第60行修改端口,因为80的端口容易被占,Listen 8088,第222行也要对应修改,ServerName localhost:8088。

    2. 打开mod加载的注释,共6个:
      第141行 mod_proxy 提供HTTP/1.1的代理/网关功能支持
      142行 mod_proxy_ajp mod_proxy的扩展,提供Apache JServ Protocol支持
      143行 mod_proxy_balancer mod_proxy的扩展,提供负载均衡支持
      144行 mod_proxy_connect mod_proxy的扩展,提供对处理HTTP CONNECT方法的支持
      147行 mod_proxy_ftp mod_proxy的FTP支持模块
      149行 mod_proxy_http mod_proxy的HTTP支持模块

    3. 第499行 Include conf/extra/httpd-vhosts.conf,把这行的注释去掉,引入这个配置文件

    4. 修改httpd-vhosts.conf文件 路径:D:Apache24confextra
      添加如下代码,实现均衡分配

    ProxyRequests Off
    
    <Proxy balancer://proxy>
        BalancerMember http://10.87.61.2:8001/ loadfactor=1 route=tomcat1
        BalancerMember http://10.87.61.2:8002/ loadfactor=3 route=tomcat2
        ProxySet lbmethod=byrequests
    </Proxy>
    #在这里讲一讲热备份吧,热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指     #定为备份服务器,当其他服务器正常的时候,请求不会被分到这台机器,只有当其他机器当了,
    #才会把请求分配到这台机。配置如下:
    # BalancerMember http://10.0.0.2   status=+H
    
    <VirtualHost localhost:8088>
        #这个端口号要与httpd.conf的listen端口一致,网上的教程都是不一致的,我的试验是要一致才可以。
        #ServerAdmin webmaster@dummy-host2.a.com
        ServerName localhost
        ServerAlias localhost
        ProxyPass / balancer://proxy/ stickysession=JSESSIONID nofailover=off
        ProxyPassReverse / balancer://proxy
    </VirtualHost>
    

    三、配置Tomcat server.xml文件:

    1. 修改端口(端口和httpd-vhosts.conf里面设置的端口一致)
      Tomcat 1:
    <Server port="8005" shutdown="SHUTDOWN">
    <Connector port="8001" protocol="HTTP/1.1" URIEncoding="UTF-8"
    connectionTimeout="20000"
    redirectPort="8443" />
    

    Tomcat 2:

    <Server port="8006" shutdown="SHUTDOWN">
    <Connector port="8002" protocol="HTTP/1.1" URIEncoding="UTF-8"
    connectionTimeout="20000"
    redirectPort="8443" />
    
    1. 改端口(端口和httpd-vhosts.conf里面设置的端口一致,如果有设置的话)
      Tomcat 1:
    <Connector port="8018" protocol="AJP/1.3" redirectPort="8443"/>
    

    Tomcat 2:

    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443"/>
    
    1. 添加jvmRoute(jvmRoute要和端口对应的jvmRoute一致)
      Tomcat 1:
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    

    Tomcat 2:

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
    
    1. 把注释掉的改成:
      Tomcat 1:
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"         channelSendOptions="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="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 2的标签与Tomcat 1 的基本一样,除了

    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
    

    要把这个的端口port="4000"改成与Tomcat 1不一样的port=“4001”

    四、配置Tomcat web.xml文件:

    <web-app>标签下增加<distributable/>标签,添加在<display-name>下面。
    

    五、测试能否成功:

    接下来就可以测试了,直接访问标签里面的地址localhost:8088,在地址后面接上测试所用的 项目的名称就可以了。
    这些配置结束后负载均衡的工作就差不多要好了,下面来启动Apache,在安装目录的bin下面有个叫ApacheMonitor.exe的双击即可
    这样负载均衡的就完成了,此时大家可以写程序测试session是否可以共享,可以参照下面的这篇文章来测试
    http://suhuanzheng7784877.iteye.com/blog/987062
    我们可以发现即使一个tomcat关闭了session还在。

    六、其他问题:

    1.其中也有出现一个问题:就是在登录界面登录的时候发现登录不上去,通过log发现是有异常:java.lang.IllegalArgumentException: setAttribute: Non-serializable attribute。原因是该类没实现序列化,百度了一下发现是分布式部署的时候需要序列化。

    根据一些资料和跟进源代码,发现原因是从Tomcat 5.5.15开始,放入到session中的对象必须实现 java.io.Serializable接口,解决这个问题的方法从根本上来说当然是把需要放到session中的类实现java.io.Serializable接口。

    2.刚开始配置好了后,发现有时候登录了过一分钟左右会突然跳转到登录界面,查看log后发现是session丢失了,sessionId都已经改变了,原来的session里面的信息都没有了,所以就跳转到登录页面了。

    查了资料后发现是server.xml里面的标签里面的这个设置有问题:

    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    

    把这个注释掉后就完全没有问题了。原因是这个配置是为了防止jk_mod这个插件出现问题的进行处理的,但是mod_jk已经停止更新,并且配置相对复杂。Apache2.2以后,提供了一种原生的方式配置负载均衡和集群,比mod_jk简单很多。因为已经用不到这个插件,注释掉也不会有影响。

  • 相关阅读:
    day003|python基础回顾3
    14Linux之网络管理
    13Linux之磁盘管理
    12Linux之进程管理
    11Linux之软件包管理
    10Linux之用户权限管理
    09Linux之文件管理
    08Linux之目录结构
    07Linux之bash解释器交互式环境特性
    06Linux之shell介绍
  • 原文地址:https://www.cnblogs.com/jimloveq/p/10609476.html
Copyright © 2011-2022 走看看