利用
Solaris10
中的
Apache2
与
Tomcat
结合实现负载均衡
一、
说在前头
在为
ISV
提供
Solaris10
移植过程中发现有些
ISV
的应用是使用
Apache
和
Tomcat
结合实现负载均衡的
J2EE web
应用。那么在
Solaris10
中具体怎么实现这种负载均衡方式呢?本文将给出一个参考实现。本文中多数操作是在
Solaris10 B Shell
下进行的。
二、
本文中实现负载均衡的拓扑图
此拓扑图只是本文中的实现,如果没有这样的条件也可以简化这些。把
Apache
和两个
Tomcat
都安装在一台主机上。也可以利用一台主机利用
Solaris10
提供的
Zone
功能来划分多个
zone
模拟多个主机。
三、
实现负载的步骤
1.
验证
Apache2
是否能正常工作。
1.1
生成初始配置文件
httpd.conf
#cp /etc/apache2/httpd.conf-example /etc/apache2/httpd.conf
1.2
初次启动
Apache
#/usr/apache2/bin/apachectl start
1.3
查看
Apache
进程是否已经启动
#ps –ef|grep httpd
如果出现下面的情况则表示
Apache
没成功的启动。
1.4
查看没有启动成功的原因
#more /var/apache2/logs/error_log
发现如下
可以看出是因为
apache
在启动的时候要把
PID
的信息写入到一个文件
httpd.pid
时候发生了问题,原因是
/var/run/apache2
这个目录不存在。现在用下面的命令把这个目录建立起来。
#mkdir –p /var/run/apache2
1.5
第二次启动
Apache
为了查看本次启动中产生的错误欣,先删除原有的
error
_
log
文件
#rm /var/apache2/logs/error_log
接着启动
apache
#/usr/apache2/bin/apachectl start
1.6
第二次查看apache的启动情况
#ps –ef|grep httpd
如果出现了下面的情况则说明启动成功。
也可以通过浏览器验证
Apache
是否启动成功,如果浏览器出现如下信息则说明已经启动成功。
否则就是没有
Apache
没有成功启动,重复执行1.4-1.6直到成功为止。再去
error_log
中看一下有什么信息。
#more /var/apache2/logs/error_log
可以看出已经没有错误产生了。
2.
安装
mod_jk
Mod_jk
是连接
Apache
与
Tomcat
的接口。其工作方式如下:
Apache
在接收到用户请求的
JSP
和
servlet
的时候会通过
mod_jk
把他们转发给
tomcat
,tomcat
处理完成后在将结果通过
mod_jk
返回给
apache
。之后
apache
将结果呈现给用户。
2.1
获得
mod_jk
在
tomcat
的官方网站提供了两种下载,一种是编译好的二进制文件
“.dll”
或者“
.so
”。另外一种是源码下载,需要在本地编译。因为没有看到有SOLARIS10 版本的“
.so
”文件,在这里使用其源码进行编译。
源码下载地址:
二进制下载地址:
2.2
编译
mod_jk
因为要用到
Solaris
的编译工具,所以要先安装
Sun Studio11
。Sun Studio 11
安装程序和安装手册在
Sun
的网站可以免费下载而且安装方式是“下一步”型的,固在这里就不多说了。接着要把下载的文件进行解压:
#gunzip jakarta-tomcat-connectors-1.2.15-src.tar.gz
#tar xvf jakarta-tomcat-connectors-1.2.15-src.tar
#cd jakarta-tomcat-connectors-1.2.15-src
设置环境变量:
PATH,LD_LIBRARY_PATH
等
#export PATH=$PATH: /usr/ucb:/usr/ccs/bin
(含有编译工具和
make
)
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/etc/lib
(含有可能用到的库)
开始编译
mod_jk
#cd jk/native
相对于
jakarta-tomcat-connectors-1.2.15-src
#./configure –with-apxs=/usr/apache2/bin/apxs
#make
在
make
的过程中产生了下面的错误信息,这是由于在生成了
mod_jk.so
文件后要拷到apache的特定路径的过程中发生了错误。没有关系,最有用的
mod_jk.so
已经生成了。存放在相对于
jakarta-tomcat-connectors-1.2.15-src
目录的下的
jk/native/apache-2.0/.libs
目录中。
编译
mod_jk
比较繁琐而且也容易出问题,现在将编译好的文件放在网上。需要的朋友可以直接下载使用(但不保证任何机器都能使用)。
For Solaris10 sparc:http://www.cublog.cn/u/15296/upfile/060316125507.gz
For Solaris10 x86 :http://www.cublog.cn/u/15296/upfile/060316121254.gz
3.
配置
mod_jk
到
Apache
3.1
先把
mod_jk.so
(
在
jk/native/apache-2.0/.libs
目录)文件拷贝到
Apache
的
libexec
目录下面。
#cp mod_jk.so /usr/apache2/libexec/.
3.2
接着修改
Apache
的配置文件,使
Apache
能够将需要
tomcat
处理的文件通过
mod_jk
进行转发。有三处需要修改,见图。
#vi /etc/apache2/httpd.conf
并在
LoadModule
模块的最后加入一行
LoadModule jk_module libexec/mod_jk.so
找一个合适的位置(任何地方),将下面的信息添加上去
还要把需要转发的文件类型和路径配置好。具体的位置是在
DocumentRoot
指示器下。如下面已
JkMount
开头的两行。
3.3
编写
workers.properties
文件
这个文件用力定义与
Apache
进行交互的
Tomcat
的配置信息。具体如下:
可以看出
worker1
和
worker2
用来配置
tomcat
的信息,
loaderbalancer
用来配置负载均衡信息。下面的表格对涉及到的属性进行了说明。更多的属性说明可以参见worker文件的文档。
属性
|
说明
|
worker.list
|
定义
worker
列表
|
worker.<workername>.type
|
定义
worker
的类型,有
ajp13,ajp14,jni,lb,status
等
|
worker.<workername>.host
|
定义
worker
所在主机的
ip
|
worker.<workername>.port
|
定义
worker
服务监听端口
|
worker.<workername>.lbfactor
|
定义完成负载均衡的各个
worker
需要承担的负载份额
|
worker.<workername>.balanced_workers
|
指定加入到负载均衡的
worker
|
3.4
验证安装
mod_jk
之后
Apache
仍然可用。
按照
1.5,1.6
中的方式进行验证即可。
4.
配置
Tomcat
,实现负载均衡
4.
1Tomcat
的获取和安装
本文使用了从
tomcat
官方网站上提供的二进制文件打包
http://apache.roweboat.net/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.tar.gz
。将其拷贝的各个
worker
主机的安装目录并进行如下操作就算安装完成。
#gunzip apache-tomcat-5.5.16.tar.gz
#tar xvf apache-tomcat-5.5.16.tar
#mv apache-tomcat-5.5.16 tomcat551
4.2
创建一个空测试
web
应用并创建一个文件测试
JSP
页面放在其下:
#mkdir –p $TOMCAT_HOME/webapps/testload
其中
$TOMCAT_HOME
是
Tomcat
的安装目录。
#vi $TOMCAT_HOME/webapps/testload/index.jsp
分别填写如下
worker1
的
index.jsp
源代码
<html>
<body bgcolor="red">
Session ID:<%=request.getSession().getId()%>
</body>
</html>
Worker2
的
index.jsp
源代码
<html>
<body bgcolor="blue">
Session ID:<%=request.getSession().getId()%>
</body>
</html>
4.3
修改
Tomcat
的配置文件,以便与
Apache
进行请求转发
#vi $TOMCAT_HOME/conf/server.xml
修改其中的几处,如下图
将其中的
port
分别改为“
10008
”
和“
10010
”并将下面的这段注释掉(即将这段代码放在
<!-- -->
之间)。
配置
Tomcat
中
Ajp13
参数,将
port
分别改为“
10009
”
和“
10011
”
。
配置
Tomcat
中的
AJP
Engine
。
将上面图中的信息分别修改为
将测试
web
应用的加到
Context
中(在文件的尾部,
</Host>
前面)
4.4
验证负载均衡
按前面的方法先启动
Apache
,之后分别启动
Tocmat
(别忘了先设置
JAVA_HOME
)
#$TOMCAT_HOME/bin/startup.sh
用
#ps –ef|grep java
查看一下
Tomcat
是否已经启动
在不同的机器打开几个浏览器查看
http://IP:Port/index.jsp,Apache
将会把请求转发给这两个
Tocmat
进行处理。如下图,可以看出对用户的请求是由多个
Tomcat
分担完成的。其中红色表明用户的请求是由
worker1
进行处理和响应的,蓝色则表明用户的请求是由
worker2
负载响应的。页面中也打印出了请求的
SessionId
,可以用刷新来看看是否会变(在
Session
没有过期,
Tomcat
或
Tomcat
中的
Context
没有刷新的情况下这个值是不能变化的
)。这样就可以验证这种负载均衡方式是不是能保持
Session
(也可以打开新的浏览器来看一下是否有相同的
SessionId
产生)。
参考资料: