谢谢您的对我的博客的关心,同时希望这个站点真的能够对您有所帮助。 如果可以请告诉我你的联系方式(可能的话告诉我两个或更多,我不希望失去任何一个关注本主页人士的联系,不论你是我的老友,或是一位新朋友,对于我来说您十分重要)
分类: 架构设计与优化
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/
访问即可
重要的是确保正确的数据被存放在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自己处理。