Apache Http Server部署負載均衡
一、Apache下載安裝:
-
Apache 下載:建議從官網下載http://httpd.apache.org/download.cgi
-
安裝方法參照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。 -
之前在網上找到的配置方法一般是需要安裝mod_jk,配置worker.properties的,這種方法是早期的apache的配置方式。現在的2.4.25已經集成了mod_jk,不需要安裝mod_jk配置worker.properties了,簡單了很多。
二、配置Apache:
-
找到Apache2.4安裝目錄下面的httpd.conf 我的路徑是:D:\Apache24\conf,第38行要修改成自己安裝的目錄 Define SRVROOT “D:\Apache24”,第60行修改端口,因為80的端口容易被占,Listen 8088,第222行也要對應修改,ServerName localhost:8088。
-
打開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支持模塊 -
第499行 Include conf/extra/httpd-vhosts.conf,把這行的注釋去掉,引入這個配置文件
-
修改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文件:
- 修改端口(端口和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" />
- 改端口(端口和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"/>
- 添加jvmRoute(jvmRoute要和端口對應的jvmRoute一致)
Tomcat 1:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
Tomcat 2:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
- 把注釋掉的改成:
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簡單很多。因為已經用不到這個插件,注釋掉也不會有影響。