Apache Http Server部署负载均衡
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简单很多。因为已经用不到这个插件,注释掉也不会有影响。