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:\Apache24\conf,第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:\Apache24\conf\extra
    添加如下代碼,實現均衡分配

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簡單很多。因為已經用不到這個插件,注釋掉也不會有影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM