Apache + Tomcat on Fedora9

本文介绍在Fedora9上通过mod_jk完成Apache和Tomcat的整合,实现Apache + Tomcat负载均衡的设置。

所需主要软件:

  1. Fedora9
  2. Apache(httpd-2.2.8-3.i386.rpm)
  3. Tomcat6
  4. JDK6
  5. mod_jk

JDK的安装十分简单,这里就不再赘述了,在安装JDK后,我们需要这是JAVA_HOME环境变量。由于要实现Tomcat的负载均衡,我们设置2个Tomcat实例,为了启动方便我将TOMCAT_HOME这个环境变量直接放入Tomcat的bin/startup.sh脚本中,分别指向各自的TOMCAT所在位置。

接下来调整TOMCAT的监听端口:

TOMCAT1端口配置:

原端口 修改后端口 说明
8080 8080 HTTP监听端口
8009 8009 AJP13监听端口
8005 8005 Tomcat关闭端口
8443 8443 SSL端口

TOMCAT2端口配置:

源端口 修改后端口 说明
8080 8081 HTTP监听端口
8009 8010 AJP13监听端口
8005 8006 Tomcat关闭端口
8443 8444 SSL端口

按照上述列表对Tomcat的conf/server.xml进行端口修改,示例如下:

  1. <Server port="8005" shutdown="SHUTDOWN"> #TOMCAT关闭端口
  2. <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" /> #TOMCAT HTTP监听端口和SSL端口,若是应用没有使用SSL可以不用修改
  3. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #TOMCAT AJP13监听端口

完成修改后将Tomcat1和Tomcat2同时启动,通过浏览测试Tomcat是否成功启动,若是没有问题进入下一步配置Apache。(这里可以使用浏览器访问这两个Tomcat进行测试)

1

Apache的配置,在RedHat Linux中会将Apache Http Server编译出来的文件的放置到不同的目录中,Fedora也不例外,下表列出了Apache个文件所在目录的名称和作用。

目录名称 说明
/etc/httpd/conf Apache 主配置文件(httpd.conf)做在位置。
/etc/httpd/conf.d 由于Redhat在Apache主配置文件(httpd.conf)中定义Include conf.d/*.conf,因此Apache在启动时加载完httpd.conf后会自动加载这个目录中以conf为扩展名的的配置文件,这样做的可以使Apache的配置更简洁更结构话。
/var/log/httpd Apache 日志所在位置。
/usr/lib/httpd/modules Apache Modules目录,我们接下载使用编译的mod_jk会被安装到这个目录中。
/usr/sbin Apache的bin目录,这里值得说明的是在RedHat Linux中部使用apachectl这个命名起停Apache,而是启用service httpd start/restart/stop起停Apache。

我们使用service httpd start测试一下,Apache Http Server是否能正常运行,若是没有问题我们开始进行mod_jk的编译和安装。

在编译mod_jk前我们要确认一下我们的系统中是否安装了apr和apr-utils,这两个库的安装文件可以在Fedora9 DVD中的Packages目录找到,使用rpm –ivh filename安装,具体示例如下:

rpm -ivh apr-1.2.12-2.fc9.i386.rpm

rpm -ivh apr-util-1.2.12-5.fc9.i386.rpm

注意:以上两个安装文件可能在不同版本的Redhat Linux中版本出现不一致的情况,没关系我们只需找到apr和apr-utils对应的文件进行安装即可。

由于我们要编译mod_jk所以我们需要Apache Http Server的开发包,在以往的RedHat系统中Apache Http Server的开发包是一个名为httpd-devel*.rpm的文件,该文件存放在安装光盘的Packages或Server目录中,在Fedora9中Packages中没有找到httpd-devel*.rpm这样的文件,而且apr和apr-utils的开发也没有找到,所以我们需要在Google找一下这3个文件。

  1. httpd-devel-2.2.8-3.i386.rpm
  2. apr-util-devel-1.2.12-5.fc9.i386.rpm
  3. apr-devel-1.2.12-2.fc9.i386.rpm

这三个文件存在依赖关系,需要按照apr-devel、apr-util-devel、httpd-devel这样的顺序进行安装,安装完成后就可以编译mod_jk了。

编译mod_jk

下载mod_jk并解压,进入到native目录中进行编译configure,运行configure脚本时候需要指明apxs所在位置,apxs在/usr/sbin,configure命令如下:

#./configure –with-apxs=/usr/sbin/apxs

运行成功后,进行make和make install对mod_jk进行编译和安装

#make all && make install

编译和安装成功后,在Apache的Modules目录中可以找到mod_jk.so,接下来我们来对jk进行配置。

在Apache的conf.d目录中(/etc/httpd/conf.d)添加jk的配置文件jk.conf,jk.conf的内容如下:

# 加载mod_jk.so
LoadModule    jk_module  modules/mod_jk.so
# 指定JkWorker的配置文件的路径 workers.properties
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
JkShmFile     /var/log/httpd/mod_jk.shm
# Where to put jk logs
JkLogFile     /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

这里面比较重要的文件就是定义了JkWorker的配置文件,保存退出。接下来添加最重要的workers.properties,这个文件定义jk和Tomcat的映射关系,我们可以将Tomcat理解成一个worker。

首先我们配置Apache和Tomcat级联,然后再配置Apache同Tomcat的负载均衡。

Apache和Tomcat级联

我在/etc/httpd/conf/workers.properties加入如下内容:

worker.list=tomcat1
#定义worker tomcat1的类型为ajp13
worker.tomcat1.type=ajp13             

#定义worker tomcat1所在的主机,由于Tomcat和Apache处于同一台机器所以定义成localhost
worker.tomcat1.host=localhost

#定义worker tomcat1的AJP13监听端口
worker.tomcat1.port=8009

保存退出,这样我们就定义好了worker tomcat1,接下来我还要做一件事情就是告诉Apache什么样的请求需要通过mod_jk传递给tomcat,我们需要使用JkMount这个指令完成以上的工作,JkMount命令格式如下

JkMount URI workername

我们在在Apache的conf.d目录中添加jk_mount.conf文件,文件内容如下:

JkMount  /examples/* tomcat1

这条指令告诉Apache examples路径下的所有请求交由worker tomcat1处理。配置好后我们重新启动Apache。

#service httpd restart

在浏览器中输入http://localhost/examples/访问Tomcat的示例页面,若配置成功显示如下页面:

2

接下来我们来配置Apache和Tomcat的负载均衡,首先要修改workers.properties文件,定义一个停工负载均衡的worker。workers.properties内容如下:

worker.list=balancer

#定义worker balancer的类型为lb(lb,load balance)
worker.balancer.type=lb

#定义负载均衡是都是用那些已有的worker
worker.balancer.balance_workers=tomcat1 , tomcat2

#定义worker tomcat1的类型为ajp13
worker.tomcat1.type=ajp13
#定义worker tomcat1所在的主机,由于Tomcat和Apache处于同一台机器所以定义成localhost
worker.tomcat1.host=localhost
#定义worker tomcat1的AJP13监听端口
worker.tomcat1.port=8009
#定义worker tomcat1的负载均衡的权重,该数值越大请求的数量越多
worker.tomcat1.lbfactor=50

#定义worker tomcat2的类型为ajp13
worker.tomcat2.type=ajp13
#定义worker tomcat2所在的主机,由于Tomcat和Apache处于同一台机器所以定义成localhost
worker.tomcat2.host=localhost
#定义worker tomcat2的AJP13监听端口
worker.tomcat2.port=8010
#定义worker tomcat2的负载均衡的权重,该数值越大请求的数量越多
worker.tomcat2.lbfactor=50

保存退出,最后别忘了修改jk_mount.conf文件,将tomcat1修改成balancer,

JkMount /examples/* balancer

重新启动Apache。

为了演示负载均衡的效果,我在Tomcat1和Tomcat2放置两个文件名相同但是现实内容不同的测试页面hello.jsp

Tomcat1的$TOMCAT_HOME/webapps/examples/hello.jsp内容为

<%
        out.println("Hello Tomcat1");
%>

Tomcat2的$TOMCAT_HOME/webapps/examples/hello.jsp内容为

<%
        out.println("Hello Tomcat2");
%>

这样我们在用反复浏览器访问http://localhost/examples/hello.jsp,将会交替显示Hello Tomcat1和Hello Tomcat2,这说明Apache会将/examples/hello.jsp分配到Tomcat1和Tomcat2上,从而使之完成负载均衡。

现在Apache还可以通过Apache本身带有的Proxy模式同Tomcat整合,但是AJP13可以实现对Tomcat的检测上述提到配置方法,若是有一个Tomcat宕机了Apache会自动将请求发送给另一个Tomcat。

题外话,在设计一个Java Web应用的时候,最好考虑一下静态资源的问题,往往在高访问量的情况下Web的瓶颈出现于静态资源的IO上,可以通过Apache设置静态资源的expires,或者采用反向代理方式提高在高访问量下静态资源的处理能力。

回复

CAPTCHA
回答问题
Copy the characters (respecting upper/lower case) from the image.