Tomcat开发技术之与HTTP服务器的集成 (3)
6、Apache与多个Tomcat服务器集成时的负载平衡
在实际应用中,如果网站的访问量非常大,为了提高访问速度,可以将多个Tomcat服务器与Apache集成,让它们共同分担运行Servlet/JSP 组件的任务。 JK插件的loadbalancer(负载平衡器)负责根据在workers.properties文件中预先配置的lbfactor(负载平衡因数)为 这些Tomcat服务器分配工作负荷,实现负载平衡。
假定Apache和两个Tomcat服务器集成,一个Tomcat服务器和Apache运行在同一台机器上,使用的JK端口为8009,还有一个 Tomcat服务器运行在另一台机器上,主机名为anotherhost,使用的JK端口为8009。以下是把Apache和这两个Tomcat服务器集 成的步骤。
(1)把mod_jk_2.0.46.dll拷贝到/lib目录下。
(2)在/conf目录下创建如下的workers.properties文件(注意粗体部分的内容):
ps=\ #指定文件路径分割符worker.list=worker1,worker2,loadbalancer worker.worker1.port=8009 #工作端口,若没占用则不用修改worker.worker1.host=localhost #Tomcat服务器的地址worker.worker1.type=ajp13 #类型worker.worker1.lbfactor=100 #负载平衡因数worker.worker2.port=8009 #工作端口,若没占用则不用修改worker.worker2.host=anotherhost #Tomcat服务器的地址worker.worker2.type=ajp13 #类型worker.worker2.lbfactor=100 #负载平衡因数worker.loadbalancer.type=lbworker.loadbalancer.balanced_workers=worker1, worker2
以上文件创建了两个worker:worker1和worker2分别代表两个Tomcat服务器,它们由worker.loadbalancer来分配工作负荷。
(3)修改/conf/httpd.conf文件,在文件末尾加入如下内容:
# Using mod_jk2.dll to redirect dynamic calls to TomcatLoadModule jk_modulemodules\mod_jk_2.0.46.dllJkWorkersFile "conf\workers.properties"JkLogFile "logs\mod_jk2.log" JkLogLevel debugJkMount /*.jsp loadbalancerJkMount /helloapp/* loadbalancer
当客户请求"/*.jsp"或"/helloapp/*"形式的URL,该请求都由loadbalancer来负责转发,它根据在workers.properties文件中为worker1和worker2分配的lbfactor属性,来决定如何调度它们。
只有在使用了loadbalancer的情况下,workers.properties文件中worker的lbfactor属性才有意义,lbfactor取值越大,表示分配给Tomcat服务器的工作负荷越大。
(4)修改两个Tomcat服务器的JK端口,确保它们和workers.properties文件中的配置对应。此外,在使用了loadbalancer后,要求worker的名字和Tomcat的server.xml文件中的元素的jvmRoute属性一致。
所以应该分别修改两个Tomcat的sever.xml文件,把它们的元素的jvmRoute属性分别设为worker1和worker2。以下是修改后的两个Tomcat服务器的元素:
Tomcat服务器1:
<Engine name="Catalina"defaultHost="localhost"debug="0" jmvRoute="worker1">
Tomcat服务器2:
<Engine name="Catalina"defaultHost="localhost" debug="0" jmvRoute="worker2">
(5)在完成以上步骤后,分别启动两个Tomcat服务器和Apache服务器,然后访问 http://localhost/index.jsp,会出现Tomcat服务器的默认主页。由于此时由loadbalancer来调度Tomcat服 务器,因此不能断定到底访问的是哪个Tomcat服务器的index.jsp,这对于Web客户来说是透明的。
如果在进行以上实验时,两个Tomcat服务器都在同一台机器上运行,应该确保它们没有使用相同的端口。在Tomcat的默认的server.xml中,一共配置了以下3个端口:
<Server port="8005" shutdown="SHUTDOWN" debug="0"><!-- Define a non-SSL CoyoteHTTP/1.1 Connector on port 8080 --><Connector port="8080" /><!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --><Connector port="8009" />
如果两个Tomcat服务器都在同一台机器上运行,则至少应该对其中一个Tomcat服务器的以上3个端口号都进行修改。
此外,如果把Tomcat和其他HTTP服务器集成,Tomcat主要负责处理HTTP 服务器转发过来的客户请求,通常不会直接接受HTTP请求。因此为了提高Tomcat的运行性能,可以关闭Tomcat的HTTP连接器,方法为在 server.xml中把Tomcat的HTTP Connector的配置注释掉。