mod_jk
配置apache通过mod_jk模块与Tomcat连接
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
[root@nginx-proxy2 conf.d]# cd
[root@nginx-proxy2 ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz
[root@nginx-proxy2 ~]# cd tomcat-connectors-1.2.40-src/native/
[root@nginx-proxy2 native]# rpm -ql httpd-devel|grep apxs
确保apxs存在,确保httpd-devel安装
[root@nginx-proxy2 native]# yum -y install httpd-devel
[root@nginx-proxy2 native]# rpm -ql httpd-devel|grep apxs
/usr/sbin/apxs
/usr/share/man/man8/apxs.8.gz
[root@nginx-proxy2 native]#
[root@nginx-proxy2 native]# ./configure --with-apxs=/usr/sbin/apxs
[root@nginx-proxy2 native]# make && make install
确保mod_jk.so存在
[root@nginx-proxy2 modules]# ls /usr/lib64/httpd/modules/ |grep mod_jk
mod_jk.so
[root@nginx-proxy2 modules]#
编辑配置文件:
[root@nginx-proxy2 conf.d]# cat mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* TomcatA
JkMount /jkstatus/ stat-LinuxEA
编辑workers.properties!由于是mod_jk,使用ajp,so,端口为8009,
[root@nginx-proxy2 conf.d]# cat workers.properties
worker.list=TomcatA,stat-LinuxEA
worker.TomcatA.port=8009
worker.TomcatA.host=10.0.0.53
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat-LinuxEA.type = status
[root@nginx-proxy2 conf.d]# pwd
/etc/httpd/conf.d
[root@nginx-proxy2 conf.d]#
查看日志是否正常:
[root@nginx-proxy2 conf.d]# tail /var/log/httpd/mod_jk.log
[Thu Feb 18 06:13:02.200 2016] [7345:139943077504992] [debug] ajp_connection_tcp_get_message::jk_ajp_common.c (1403): 03d0 75 6E 64 3A 20 23 44 32 41 34 31 43 3B 0A 20 20 - und:.#D2A41C;...
[Thu Feb 18 06:13:02.200 2016] [7345:139943077504992] [debug] ajp_connection_tcp_get_message::jk_ajp_common.c (1403): 03e0 7D 0A 20 20 74 64 2E 68 65 61 64 65 72 2D 6C 65 - }...td.header-le
[Thu Feb 18 06:13:02.200 2016] [7345:139943077504992] [debug] ajp_connection_tcp_get_message::jk_ajp_common.c (1403): 03f0 66 74 20 7B 0A 20 20 20 20 74 65 78 74 2D 61 6C - ft.{.....text-al
[Thu Feb 18 06:13:02.201 2016] [7345:139943077504992] [debug] ws_write::mod_jk.c (552): written 8065 out of 8065
[root@nginx-proxy2 conf.d]#
jk_mod正常后修改日志级别:JkLogLevel notice
[root@nginx-proxy2 conf.d]# cat mod_jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel notice
JkMount /* TomcatA
JkMount /jkstatus/ stat-LinuxEA
[root@nginx-proxy2 conf.d]#
在查看则正常
[root@nginx-proxy2 conf.d]# tail /var/log/httpd/mod_jk.log
[Thu Feb 18 06:17:19.447 2016] [7346:139943077504992] [debug] jk_shm_close::jk_shm.c (700): Closed shared memory /etc/httpd/logs/jk-runtime-status.7337 childs=8
[Thu Feb 18 06:17:19.448 2016] [7345:139943077504992] [debug] jk_shm_close::jk_shm.c (700): Closed shared memory /etc/httpd/logs/jk-runtime-status.7337 childs=7
[Thu Feb 18 06:17:19.449 2016] [7344:139943077504992] [debug] jk_shm_close::jk_shm.c (700): Closed shared memory /etc/httpd/logs/jk-runtime-status.7337 childs=6
[Thu Feb 18 06:17:19.451 2016] [7343:139943077504992] [debug] jk_shm_close::jk_shm.c (700): Closed shared
[root@nginx-proxy2 conf.d]#
如果是编译安装,--with-apxs则指定相应的位置即可
[root@NFS-WEB1 native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@NFS-WEB1 native]# make && make install
说明如下:
apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/extra/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* TomcatA
JkMount /status/ stat1
除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属性。如JkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式: JkMount )指定则用于控制URL与Tomcat workers的对应关系。
为了让apache能使用/etc/httpd/extra/httpd-jk.conf配置文件中的配置信息,需要编辑/etc/httpd/httpd.conf,添加如下一行:
Include /etc/httpd/extra/httpd-jk.conf
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。
workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。
worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>
其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:
worker.TomcatA.host=172.16.100.1
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker..type。常见的类型如下:
◇ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
◇ lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
◇ status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。
worker其它常见的属性说明:
◇ host:Tomcat 7的worker实例所在的主机;
◇ port:Tomcat 7实例上AJP1.3连接器的端口;
◇ connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;
◇ connection_pool_timeout:连接池中连接的超时时长;
◇ mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;
◇ retries:错误发生时的重试次数;
◇ socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;
◇ socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;
◇ lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;
另外,在负载均衡模式中,专用的属性还有:
◇balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
◇ method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
◇sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。
根据前文中的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=172.16.100.1
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status
至此,一个基于mod_jk模块与后端名为TomcatA的worker通信的配置已经完成,重启httpd服务即可生效