Ubuntu14.04下Apache2+mod_jk+tomcat 配置Tomcat服务器集群负载均衡

时间:2020-12-08 16:55:22

最近配置服务器的负载均衡,网上的文档多但比较早、并不详细,我参考了 apache网站上的文档,和博客在这里做一个记录。

首先说一下背景,以下来自于百度百科。

mod_jk 简称JK,是Apache服务器的一个可插入模块,用以为Apache或IIS服务器提供处理JSP/Servlet的能力。Apache作为一款强大的Web服务器,本身缺乏处理JSP/Servlet的功能,为了能够处理对JSP/Servlet的请求,必须使用JSP/Servlet容器,如Tomcat等。Tomcat本身也可以作为Web服务器使用,但是其功能远不及Apache强大,所以Tomcat往往作为JSP/Servlet容器使用。mod_jk实质上是Apache与Tomcat的连接器,并藉此附带提供集群负载均衡的功能。

这里给出两个apache文档的地址:
http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.htmlhttp://tomcat.apache.org/connectors-doc/

我的配置环境:三台ubuntu server14.04,tomcat8,apache2。

1. 运行以下两条命令,安装apache2和mod_jk.so;
sudo apt-get install apache2
sudo apt-get install libapache2-mod-jk
安装完之后,可在/usr/lib/apache2/modules文件夹下看到mod_jk.so文件。

2.配置apache.conf文件
在ubuntu 14.04系统中,配置有一些不一样的地方。在apache2的文件夹下,找不到httpd.conf文件。查看apache2.conf文件,发现文件中有这样的两行代码,在/etc/apache2/mod-enabled文件夹下,看到了jk.conf和jk.load文件,因此,配置mod_jk可在这两个文件里进行。
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
打开jk.conf文件,添加如下代码,增加服务器的安全性。
JkOptions +RejectUnsafeURI
然后再添加如下的代码,使Apache可以转发请求到我们设置的worker上。
JkMount /* loadbalancer

3.配置work.properties文件
关于work.properties文件的配置信息可参考:http://tomcat.apache.org/connectors-doc/reference/workers.html
在jk.conf文件中,我们可以看到如下一行代码,这说明workers.properties文件放在了/etc/libapache2-mod-jk/workers.properties文件下,当然你也可以更改这个路径,重新建立一个worker.properties。但是为了简便,可以直接到这个路径下修改workers.properties。
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
首先,将workers.tomcat_home和workers.java_home改为你自己的Tomcat的安装目录和Java_home目录。ps就不用改了。修改worker.list,把它改为你的Tomcat服务器的名字,如果有多个服务器,则用逗号将它们隔开。这个list定义了两个worker,它会用来和你的Tomcat服务器进行通信。
worker.list=namenode,cloud2,loadbalancer
下面针对每一tomcat worker做一下配置,如下所示。这里port是8009,它是tomcat默认的AJP13协议的监听端口,可在Tomcat的context.xml中修改这个端口。host是远程tomcat的地址可带上端口号,host可以是主机名也可以是IP地址。type是我们使用的apache和tomcat的通信协议,这里是ajp13。lbfactor是用于负载均衡的权值,值越大那么apache就认为这个服务器的性能越好,那么就会将更多的请求发送给这个Tomcat服务器。socket_timeout是如果tomcat在这个时间内没有回应JK时,JK就会生成一个错误,然后进行重试,如果不设置这个值,默认情况下,JK会一直等待。socket_keepalive设置为True是防止防火墙将JK和Tomcat之间闲置的连接切断。ping_mode指示在什么时候进行连接侦测,即检查JK和Tomcat的连接是否正常,它有很多检测的模式,这里我使用的是I,然后再给出一个探测的超时时间ping_timeout,那么当连接空闲时间超过connection_ping_interval时,JK就会去检测连接是否正常,connection_ping_interval的默认时间是(ping_timeout/1000)*10
worker.namenode.port=8009
worker.namenode.host=namenode
worker.namenode.type=ajp13
worker.namenode.lbfactor=1
worker.namenode.socket_timeout=10
worker.namenode.socket_keepalive=True
worker.namenode.ping_mode=I
worker.namenode.ping_timeout=10000

4.在work.properties文件中配置负载均衡worker
这个负责负载均衡的worker是一个虚拟的worker,它并不直接与Tomcat服务器进行交流,但它却管理着其它worker,负责负载均衡。在worker.properties文件中添加如下两行。这样声明创建一个loadbalance worker,它的类型是lb,负责负载均衡,它管理着namenode和cloud2这两个worker。其它的配置选项用默认的就好了。
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=namenode,cloud2

5.编辑/etc/apache2/sites-available/000-default.conf文件,在<VirtualHost *:80>中添加如下代码。
JkMount /* loadbalancer

至此apache就配置完成了。

6.在每个Tomcat节点上进行配置
首先,在<Engine/>标签中配置jvmRoute属性,如下所示,注意这个属性的值要和你的worker的名字一样。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="cloud2">
然后,在<Engine/>标签中添加以下这段代码。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

完成以上步骤后,直接用浏览器访问apache地址,就能进入Tomcat主页。关闭其中一个Tomcat服务器,其它Tomcat也能访问。
其它的内容还没测试。接下来还要研究一下SSL/TSL的访问问题。