在编译时需要添加这几个参数来启用对应的模块:--enable-proxy --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer,最后的几个参数用于实现httpd与后端tomcat之间的信号传递实现对其健康状态的检测。
安装完成之后启动服务查看对应的模块是加载:
[root@www ~]# httpd -D DUMP_MODULES | grep proxy
proxy_module (shared)
.....
proxy_http_module (shared)
.....
proxy_ajp_module (shared)
proxy_balancer_module (shared)
httpd基于mod_jk模块实现负载均衡
httpd可以通过2种协议连接tomcat:http,ajp。tomcat启动之后默认会监听在2个端口:8080,8009。8080用于接收http请求,8009则用于接收ajp请求。mod_jk模块仅支持使用ajp协议连接后端的tomcat。
由于mod_jk模块出现的较早,httpd默认不包括该模块,需要通过apache的apxs函数编译该模块,安装至apache的模块目录下。若是直接使用yum安装的httpd,需要安装httpd-devel以提供apxs函数。
在代理服务器节点上安装mod_jk模块(192.168.1.116上),tomcat-connectors-1.2.40-src.tar.gz即为其源码包。
[root@www ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz
[root@www ~]# cd tomcat-connectors-1.2.40-src/native/
[root@www native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@www native]# make && make install
编辑配置文件,httpd-jk.conf默认在extra目录下没有,需要自己创建:
[root@www ~]# vim /etc/httpd/extra/httpd-jk.conf
LoadModule jk_module modules/mod_jk.so #加载mod_jk模块
JkWorkersFile /etc/httpd/extra/workers.properties #定义后端每个tomcat实例的特性
JkLogFile logs/mod_jk.log #指定mod_jk模块的日志文件
JkLogLevel error #记录日志的级别(info, error, debug)
JkMount /* lbcluster #将所有路径代理至lbcluster这个worker
JkMount /status/ stat #状态信息页
上述的配置参数中,jkWorkersFile用于指定保存了后端各个Tomcat工作属性定义的配置文件。该配置文件的文件名通常是workers.properties,该文件中每一个tomcat实例视为一个worker,在apache启动时mod_jk会读取该配置文件的信息获取每个worker的配置信息。
workers.properties文件的配置格式:
worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>
worker.list为worker列表,worker.<worker name>.<property>定义各个worker的名称和属性。
编辑workers.properties:
[root@www ~]# vim /etc/httpd/extra/workers.properties
worker.list = lbcluster,stat
worker.TomcatA.type = ajp13 #type指定worker的工作机制(定义一个tomcat实例)
worker.TomcatA.host = 192.168.1.106 #host指定tomcat实例所在主机
worker.TomcatA.port = 8009 #port指定连接tomcat实例上的端口
worker.TomcatA.lbfactor = 5 #lbfactor指定该worker的权重
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.1.127
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster.type = lb
worker.lbcluster1.method = B #指定调度的算法(根据负载情况进行调度)
worker.lbcluster.sticky_session = 0 #是否启用sticksession
worker.lbcluster.balance_workers = TomcatA, TomcatB
worker.stat.type = status #用于显示各worker的工作状态
其中type属性可定义3种工作机制:
ajp13 #定义一个tomcat实例
lb #用于负载均衡场景中,此worker包括多个tomcat实例
status #用于显示各个worker工作状态的特使worker