6

翻译:疯狂的技术宅
原文标题:Load balancing tomcat with Apache
原文链接:http://programmergate.com/loa...
本文首发微信公众号:充实的脑洞

有时候我们需要把自己的应用部署在多个Tomcat实例上,这种场景通常是在使用大量内存进行存储,并且拥有大量的活跃用户时。使用多个实例的主要优点是可以把请求和负载分担到多个节点上,以提供高可用性并加快服务请求。

负载均衡是将客户端请求分发到多个可用节点的过程,通常是通过接收请求的Web服务器将应用程序暴露给客户端,并根据每个节点的可用性和压力将它们分发到配置好的应用程序服务器。 在本文中,我们将介绍如何通过Apache Web服务器配置简单的Tomcat负载均衡器。

clipboard.png

1. 安装Tomcat实例

本教程在2台不同的Windows机器上安装2个Tomcat实例。通常可以在同一台机器上配置多个Tomcat实例,但是建议将其分别安装在不同的机器上,以便将负载分配到2个物理内存而不是1个。

2. 下载并安装Apache

这里下载最新稳定的Apache版本,你可以在其中一台Tomcat机器上设置Apache,或者为其单独分配一台机器。

clipboard.png

将下载的文件解压缩到D:盘,并设置conf文件夹下httpd.conf文件中的SRVROOT变量:

Define SRVROOT "D:\Apache24"

要安装Apache,请以管理员身份运行cmd,把路径切换到为D:Apache24bin,执行以下命令:

httpd -k install

现在,Apache Web服务器已成功安装在你的计算机上。

要启动Apache,请以管理员身份在D:Apache24bin路径下运行以下命令:

sc start Apache2.4

默认情况下,Apache将在端口80上运行,如果要检查它是否意境成功的启动,可以在你的浏览器上访问localhost,将看到以下页面:

clipboard.png

3. 下载mod_jk模块

这里下载mod_jk模块,这个插件负责Apache和tomcat之间的通信。

clipboard.png

解压缩mod_jk.zip文件并将 mod_jk.so 复制到 D:Apache24modules 中。

4. 配置Apache负载均衡

编辑D:\Apahe24\conf\http.conf 文件

  • 在LoadModule指令末尾添加以下内容:
LoadModule jk_module modules/mod_jk.so
  • 在文件结尾处添加以下内容:
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
 
JkMount /* loadbalancer
JkMount / loadbalancer

workers.properties

在conf目录下创建workers.properties文件,此文件定义了要负载均衡的多个Tomcat实例以及负载均衡器。以下是worker.properties的内容:

# 定义负载均衡器,这里的名称是loadbalancer
worker.list=loadbalancer
 
# Define the properties of first tomcat worker named tomcat1
worker.tomcat1.port=8008
worker.tomcat1.host=<ip>
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
 
# 定义名为tomcat1的第一个tomcat worker的属性
worker.tomcat2.port=8009
worker.tomcat2.host=<ip>
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
 
# 定义负载均衡器及其管理的worker的属性
workers which manage.
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=tomcat1, tomcat2
  • worker.<workerName>.port: 定义tomcat实例运行的ajp端口。
  • worker.<workerName>.host: Tomcat机器的IP地址或主机名。
  • worker.<workerName>.type: worker的类型,在这个例子中我们使用2种类型的worker

    • ajp13: 该worker直接与tomcat实例通信。
    • lb: 一个负载均衡器worker,负责管理和负载均衡多个ajp13 worker。
  • worker.<workerName>.lbfactor: 定义Tomcat节点的强度,在将请求转发给Tomcat节点时,负载均衡器worker将参考这个值。
  • worker.loadbalancer.balance_workers: 定义要由负载均衡器管理的 ajp13 worker 的名称。

5. 配置Tomcat实例

修改每个Tomcat实例的启动配置,以匹配Apache中相应的工作属性。

将tomcat1的TOMCAT_HOME/conf/server.xml文件编辑为下面的内容:

<!-- Define the http port of tomcat -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" 
redirectPort="8443" URIEncoding = "utf-8"/>
 
<!-- Define the ajp port of tomcat, this port should match the one 
in workers.properties -->
<Connector port="8008" protocol="AJP/1.3" redirectPort="8443"   
URIEncoding = "utf-8"/>
 
<!-- Define the jvm routing of tomcat, this routes to tomcat1 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

将tomcat2的TOMCAT_HOME/conf/server.xml文件编辑为下面的内容:

<!-- Define the http port of tomcat -->
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" 
redirectPort="8143" URIEncoding = "utf-8"/>
 
<!-- Define the ajp port of tomcat, this port should match the one 
in workers.properties -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8143"   
URIEncoding = "utf-8"/>
 
<!-- Define the jvm routing of tomcat, this routes to tomcat2 -->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

重启tomcat节点和Apache服务器后,会成功建立负载均衡,Apache可以把请求转发到在Tomcat1和Tomcat2上

PS: 该应用程序通过Apache主机名和端口访问。

关注微信公众号:充实的脑洞, 一个技术宅的保留地

疯狂的技术宅
44.4k 声望39.2k 粉丝