Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588602
  • 博文数量: 70
  • 博客积分: 3219
  • 博客等级: 中校
  • 技术积分: 1197
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-13 12:20
个人简介

谢谢您的对我的博客的关心,同时希望这个站点真的能够对您有所帮助。 如果可以请告诉我你的联系方式(可能的话告诉我两个或更多,我不希望失去任何一个关注本主页人士的联系,不论你是我的老友,或是一位新朋友,对于我来说您十分重要)

文章分类
文章存档

2021年(1)

2020年(13)

2018年(1)

2013年(12)

2012年(2)

2009年(2)

2008年(6)

2007年(20)

2006年(13)

分类: 架构设计与优化

2013-02-04 21:48:05

在上一篇文章,我们讲了“Apache与Tomact的整合

这次我们需要实现的还是“Apache与Tomact的整合”,只不过其中Tomcat是一个Tomcat的集群。

1、为什么要整合Apache与Tomact?请看上一篇文章。

2、为什么要Tomcat集群?提高性能,即提高Tomcat的并发处理能力。

3、如何实现Tomcat的集群?

其实所谓集群无非是将原来发送到一台tomcat服务器的请求发送到2台或2台以上的tomcat服务器。因为用来实现“Apache与Tomact的整合”的原来本来就是转发tomcat的请求,因此只要这些用户整合模块能转发到多个服务器的功能,就能实现Tomcat集群。

本文就是用mod_jk将客户端对jsp文件的请求转发到多个tomcat服务器来实现集群的。


步骤:

1、在主机A上安装apache

2、在主机A上配置apache,让apache加载mod_jk模块

3、在主机A上编译安装mod_jk模块

4、在主机B和主机C上安装都安装jdk和Tomcat

以上步骤与《Apache与Tomact的整合》文中的步骤完全一样。

至此,apache已经加载了mod_jk模块,只是还没配置mod_jk模块。

只要配置mod_jk模块将jsp的请求发送到多台Tomcat服务器就完成了。


5、配置mod_jk的参数
echo '# Defining a router
worker.list=router
worker.router.type=lb
worker.router.balance_workers=worker1,worker2

# Defining a worker named worker1 and of type ajp13
worker.worker1.type=ajp13
worker.worker1.host=192.168.10.10
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
worker.worker1.redirect=worker2

# Defining a worker named worker2 and of type ajp13
worker.worker2.type=ajp13
worker.worker2.host=192.168.10.20
worker.worker2.port=8009
worker.worker2.lbfactor=50
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300
worker.worker2.activation=disabled
' > /etc/httpd/conf.d/workers.properties


6、启动tomcat和apache后,访问主机A,测试:
访问
显示正常(apache和php正常工作)
访问
显示执行结果,说明apache将代码转发到tomcat去执行。

可以停止2个tomcat中的任何一个,页面均正常显示。

7、监控tomcat的mod_jk模块的负载,在主机A上
echo '# Defining a jkstatus
worker.list=jkstatus
worker.jkstatus.type=status
' >> /etc/httpd/conf.d/workers.properties

echo '
    JkMount jkstatus
    Order deny,allow
    Allow from all

' >>/etc/httpd/conf.d/mod_jk.conf

mv /home/share/tomcat-connectors-1.2.37-src/jkstatus /var/www/ROOT/

访问即可



本文使用了3台主机来实现的,对于《Apache与Tomact的整合》文中要更改apache和tomcat的默认web目录来统一目录在本文中已经不重要了。


重要的是确保正确的数据被存放在apache和tomcat各自的web目录下,而且2台tomcat服务器的web目录是完全一样并实时同步的。

关于这个实现的方法很多,就不再赘述了。




下面内容是我根据《Apache与Tomact的整合》改编了一篇完整的《Apache与Tomact集群的整合》测试实例作为参考。

测试环境是在一台机器上实现的,apache工作在80端口,2个tomcat服务分别工作在8009端口和9009端口,apache会将jsp的请求发送到2个tomcat服务上。


一、安装apache服务器和php
mount /dev/hdc /mnt/iso/
yum -y install gcc gcc-c++ make libtool ctags
yum -y install php53 php53-gd php53-mysql php53-xml php53-devel
yum -y install httpd gd httpd-devel

sed -i '/^DocumentRoot/s/.*/DocumentRoot "\/var\/www\/ROOT"/' /etc/httpd/conf/httpd.conf
(注1)

二、安装jdk
cd /home/share/
sh jdk-6u37-linux-i586-rpm.bin

三、安装tomcat
tar -zxf apache-tomcat-7.0.33.tar.gz
mv apache-tomcat-7.0.33 /usr/local/apache-tomcat1
tar -zxf apache-tomcat-7.0.33.tar.gz
mv apache-tomcat-7.0.33 /usr/local/apache-tomcat2
安装完,暂时不要启动tomcat;

sed -e '/appBase/s/webapps/\/var\/www/' /usr/local/apache-tomcat1/conf/server.xml
sed -e '/appBase/s/webapps/\/var\/www/' /usr/local/apache-tomcat2/conf/server.xml
(注1)

sed -i 's/8005/8004/' /usr/local/apache-tomcat2/conf/server.xml
sed -i 's/8009/9009/' /usr/local/apache-tomcat2/conf/server.xml
sed -i 's/8080/8081/' /usr/local/apache-tomcat2/conf/server.xml
(注2)


建立测试环境1:
echo 'phpinfo();
?>' > /var/www/ROOT/index.php
cp -rf /usr/local/apache-tomcat/webapps/examples/jsp/jsp2/el /var/www/ROOT/

测试:
访问
显示正常(apache和php正常工作)
访问
显示的是basic-arithmetic.jsp的源码,但无法执行(tomcat没启动,无法执行)

四、编译安装mod_jk模块
tar -zxf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/native/
./configure --with-apxs=/usr/sbin/apxs
make

cp apache-2.0/mod_jk.so /usr/lib/httpd/modules/

五、配置apache,让apache加载mod_jk模块
echo 'LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf.d/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
JkMount /* router
JkUnMount /*.php router
JkUnMount /*.html router
HostnameLookups Off' > /etc/httpd/conf.d/mod_jk.conf
(注3)


六、配置mod_jk的参数
echo '# Defining a router
worker.list=router
worker.router.type=lb
worker.router.balance_workers=worker1,worker2

# Defining a worker named worker1 and of type ajp13
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
worker.worker1.redirect=worker2

# Defining a worker named worker2 and of type ajp13
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=9009
worker.worker2.lbfactor=50
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=300
worker.worker2.activation=disabled
' > /etc/httpd/conf.d/workers.properties


七、启动tomcat和apache
/usr/local/apache-tomcat1/bin/startup.sh
/usr/local/apache-tomcat2/bin/startup.sh
service httpd start

测试:
访问
显示正常(apache和php正常工作)
访问
显示执行结果,说明apache将代码转发到tomcat去执行。

可以停止2个tomcat中的任何一个,页面均正常显示。

八、监控tomcat的mod_jk模块的负载
echo '# Defining a jkstatus
worker.list=jkstatus
worker.jkstatus.type=status
' >> /etc/httpd/conf.d/workers.properties

echo '
    JkMount jkstatus
    Order deny,allow
    Allow from all

' >>/etc/httpd/conf.d/mod_jk.conf

mv /home/share/tomcat-connectors-1.2.37-src/jkstatus /var/www/ROOT/

访问即可


注1:
上文有2处(注1),是为了将apache和tomcat的根目录统一为一个目录,即/var/www/ROOT/。
为什么apache和tomcat都要改呢?为什么不只改apache或者只改tomcat呢?
因为只改tomcat,tomcat还是会去找指定目录下的ROOT作为自己的根目录。
虽然有办法将tomcat的根目录改为apache的默认根目录,但方法更复杂,所以本文将apache的根改为/var/www/ROOT/。

注2:
因为是测试环境,我们在一台机器上运行2个tomcat,为了避免端口冲突,只能在不同端口上运行tomcat。
再生产环境中自然有多台服务器进行负载均衡,可在/etc/httpd/conf.d/workers.properties文件中指定相应服务器即可。

注3:
/etc/httpd/conf.d/mod_jk.conf文件的说明:
JkMount /* router
JkUnMount /*.php router
JkUnMount /*.html router
上面三句中“router”是在mod_jk模块中定义的一个过程。
第一句就是将来自web的请求全交给“router”来处理;后面两句是排除.php和.html文件。
其实就是将来自web的除了.php和.html文件以外的请求交给“router”来处理,而.php和.html仍旧由apache自己处理。
这里当然还可以添加其他的文件让apache来处理。
然后router根据workers.properties文件的定义将任务交给tomcat。

最后,在实际使用中,我将上面的三句改为:
JkMount /*.jsp router
就是将所有来自web的对.jsp文件的请求转发给tomcat,其他的请求全部由apache自己处理。

阅读(1894) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~