一、基于mod_jk模块实现apache代理tomcat
上篇博文已经学习了nginx代理和负载均衡tomcat及apache基于mod_proxy模块代理tomcat;
现在来学习下apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster
1、基于httpd代理tomcat时可以使用httpd的两个模块
1)mod_jk:第三方模块
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
后端tomcat使用的连接器:tomcat ajp
2)mod_proxy:标配模块
mod_proxy_http
mod_proxy_ajp
mod_proxy_balancer:负载均衡
后端tomcat使用的连接器:mod_porxy_http: tomcat http,mod_proxy_ajp: tomcat ajp
二、httpd基于jk_module模块代理tomcat
1、环境
客户端:Windows 192.168.200.88
node5: CentOS6.7-x86_64 eth0:192.168.100.175 eth1:192.168.200.175 httpd
node6:CentOS6.5-x86_64 eth0:192.168.200.179 tomcat1
node7:CentOS6.5-x86_64 eth0:192.168.200.180 tomcat2
2、先部署后端node6上的Tomcat
这里我使用上篇博文已经部署好的,修改下测试页面
注意:为了安全考虑不应该使用root用户运行tomcat,应该把tomcat的文件修改成普通用户tomcat,并切换至tomcat用户再启动tomcat,
[root@BAIYU_179 ~]# cd /usr/local/tomcat/ [root@BAIYU_179 tomcat]# ls bin lib logs RELEASE-NOTES temp work conf LICENSE NOTICE RUNNING.txt webapps [root@BAIYU_179 tomcat]# cd webapps/ [root@BAIYU_179 webapps]# ls docs examples host-manager index.jsp manager ROOT testapp [root@BAIYU_179 webapps]# cd testapp/ [root@BAIYU_179 testapp]# ls classes index.jsp index.jsp.orig lib META-INF WEB-INF [root@BAIYU_179 testapp]# vi index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA </h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
测试:
3、安装httpd并添加jk_module模块
1)安装httpd
[root@BAIYU_175 ~]# yum install httpd httpd-devel -y #直接Yum安装了 [root@BAIYU_175 ~]# service httpd start [root@BAIYU_175 ~]# httpd -M|grep jk #默认没有安装mod_jk模块 httpd: apr_sockaddr_info_get() failed for BAIYU_175 httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName Syntax OK
测试:
2)安装jk_module模块
[root@BAIYU_175 ~]# ls anaconda-ks.cfg install.log.syslog trash.sh install.log tomcat-connectors-1.2.40-src.tar.gz [root@BAIYU_175 ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz [root@BAIYU_175 ~]# cd tomcat-connectors-1.2.40-src [root@BAIYU_175 tomcat-connectors-1.2.40-src]# ls conf HOWTO-RELEASE.txt LICENSE NOTICE support xdocs docs jkstatus native README.txt tools [root@BAIYU_175 tomcat-connectors-1.2.40-src]# cd native/ #native目录是要使用的连接器 [root@BAIYU_175 native]# ls aclocal.m4 buildconf.sh configure iis netscape STATUS.txt apache-1.3 BUILDING.txt configure.ac Makefile.am README.txt TODO.txt apache-2.0 common docs Makefile.in scripts [root@BAIYU_175 native]# less README.txt #查看给的安装提示 #看到其中有这么2行 How do i build it? ------------------ Just take a look at BUILDING.txt [root@BAIYU_175 native]# ls aclocal.m4 buildconf.sh configure iis netscape STATUS.txt apache-1.3 BUILDING.txt configure.ac Makefile.am README.txt TODO.txt apache-2.0 common docs Makefile.in scripts [root@BAIYU_175 native]# less BUILDING.txt #看到如下行 General Build Instructions ========================== To build tomcat-connectors you need to run "configure" and "make": ./configure [autoconf arguments] [tomcat-connectors arguments] make It is possible to set CFLAGS and LDFLAGS to add some platform specifics: LDFLAGS=-lc ./configure --with-apxs=/home2/local/apache/bin/apxs [root@BAIYU_175 native]# which apxs #查看本机apxs命令的安装位置 /usr/sbin/apxs [root@BAIYU_175 native]# ./configure --with-apxs=/usr/sbin/apxs [root@BAIYU_175 native]# make && make install [root@BAIYU_175 native]# ls /usr/lib64/httpd/modules/mod_jk.so #确认一下 /usr/lib64/httpd/modules/mod_jk.so
3)修改httpd配置文件装载jk_module模块
[root@BAIYU_175 native]# cd /etc/httpd/conf.d/ [root@BAIYU_175 conf.d]# ls README welcome.conf [root@BAIYU_175 conf.d]# vi mod_jd.conf #这里使用一个专门的配置文件来保存相关指令及其设置。其内容如下: 1 LoadModule jk_module modules/mod_jk.so 2 JkWorkersFile /etc/httpd/conf.d/workers.properties #指定后端tomcat配置文件,随便 取名,不要以.cnf结尾即可 3 JkLogFile logs/mod_jk.log #jk_modules的日志 4 JkLogLevel info 5 JkMount /status ! #此路径不代理 6 JkMount /* TomcatA #/下内容全部代理至TomcatA 7 JkMount /status StatA #此路径由StatA响应,jk_modules自己提供 [root@BAIYU_175 conf.d]# vi /etc/httpd/conf.d/workers.properties 1 worker.list=TomcatA,StatA 2 worker.TomcatA.host=192.168.100.179 3 worker.TomcatA.port=8009 4 worker.TomcatA.type=ajp13 5 worker.StatA.type=status [root@BAIYU_175 conf.d]# service httpd configtest httpd: apr_sockaddr_info_get() failed for BAIYU_175 httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName Syntax OK [root@BAIYU_175 conf.d]# service httpd reload 重新载入 httpd: [root@BAIYU_175 conf.d]# httpd -M|grep jk httpd: apr_sockaddr_info_get() failed for BAIYU_175 httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName jk_module (shared) Syntax OK
测试:从浏览器访问,这里写错了用了100.175,应该用200.175,测试也是可以代理成功了,这里就不再截图了,
除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属。如JkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式: JkMount <URL to match> <Tomcat worker name>)指定则用于控制URL与Tomcat workers的对应关系。
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/conf.d/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=192.168.100.179
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性woker.<work name>.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定义此属性;
打开内核包转发功能
apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster
原文地址:http://xiexiaojun.blog.51cto.com/2305291/1717850