Total Pageviews

Friday, 21 September 2012

配置一个可扩展、高可用、有负载均衡和错误恢复的 Tomcat 集群

0. 综述
0.1 目标
配置一个可扩展、高可用、有负载均衡和错误恢复的 Tomcat 集群
0.2 许可协议
GNU Free Documentation License http://www.gnu.org/licenses/fdl.html
允许任意转载,但请保持本文档的完整性
如有修改,务请通知作者


1. 软件准备
apache2 http://httpd.apache.org/download.cgi
tomcat5.5 http://tomcat.apache.org/download-55.cgi
tomcat connnector http://tomcat.apache.org/download-connectors.cgi
2. 目录结构
+apache2 (Apache2的安装目录)
| +conf (apache的配置目录,重点是httpd.conf|jk.conf|workers.properties)
| +modules (apache的模块目录,重点是mod_jk.so)
+tomcat5.5 (Tomcat5.5的安装目录)
+tomcat-clustering (配置Tomcat Clustering的目录)
| +node1 (clustering中的第一个节点)
| | +bin (启动、停止脚本)
| | +conf (配置目录,重点是server.xml)
| | +logs (目录日志,自动产生)
| | +temp (临时目录)
| | +work (工作目录,自动产生)
| +node2 (clustering中的第二个节点,子目录同第一个节点)
| +bin
| +conf
| +logs
| +temp
| +work
+vhost (虚拟主机发布目录)
+test
+webapps
+ROOT
+WEB-INF
+classes
+lib
3. 安装
分别安装apache2和tomcat5.5,安装目录如前所述。(建议采用zip格式的tomcat安装包,解开即可使用。)
Windows平台上,直接下载编译好的mod_jk.so模块,复制到apache2安装目录下的modules目录中即可;Linux平台如果在官方网站找不到编译好的mod_jk.so模块,则需要自行编译,便以方法参见 http://tomcat.apache.org/connectors-doc/howto/apache.html 中 Building mod_jk on Unix 小节。
4. 配置tomcat-clustering
4.1 按先前所述目录结构在tomcat-clustering目录下面建立node1目录。
4.2 从tomcat5.5安装目录中的bin目录中复制startup.bat|shutdown.bat到node1的bin目录中。
4.3 从tomcat5.5安装目录中的conf目录中复制logging.properties|server.xml|tomcat-users.xml|web.xml到node1的conf目录中。
4.4 修改启动脚本startup.bat,在头部增加
set JAVA_HOME=E:\Java\jdk1.5.0_05 (此处修改为实际jdk安装路径)
set CATALINA_HOME=E:\workspace\apache-tomcat-5.5.12 (此处修改为实际tomcat5.5安装路径)
set CATALINA_BASE=E:\workspace\tomcat-clustering\node1 (此处修改为tomcat-clustering中第一个节点的实际路径)
4.5 修改停止脚本shutdown.bat,在头部增加
set JAVA_HOME=E:\Java\jdk1.5.0_05 (此处修改为实际jdk安装路径)
set CATALINA_HOME=E:\workspace\apache-tomcat-5.5.12 (此处修改为实际tomcat5.5安装路径)
set CATALINA_BASE=E:\workspace\tomcat-clustering\node1 (此处修改为tomcat-clustering中第一个节点的实际路径)
4.6 修改配置脚本server.xml,内容如下
4.7 复制第一个节点目录得到第二个节点的目录
4.8 修改第二个节点的启动、停止脚本以及配置文件 (按第一个节点修改时的注释修改)
5. 配置apache2
5.1 在apache安装目录的conf目录中增加jk的属性文件workers.properties
# Define 4 workers, 2 real workers using ajp13, 1 status worker, the last one being a loadbalancing worker
worker.list=worker1, worker2, worker3, worker4
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8109
worker.worker1.lbfactor=1
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=60
# Set properties for worker2 (ajp13)
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=8209
worker.worker2.lbfactor=1
worker.worker2.cachesize=10
worker.worker2.cache_timeout=600
worker.worker2.socket_keepalive=1
worker.worker2.socket_timeout=60
# Set properties for worker3 (status)
worker.worker3.type=status
# Set properties for worker4 (lb) which use worker1 and worker2
worker.worker4.type=lb
worker.worker4.balance_workers=worker1,worker2
5.2 在apache安装目录的conf目录中增加配置文件jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] “
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat “%w %V %T”
JkMount /*.jsp worker4
JkMount /jkmanager/* worker3
5.3 在apache配置文件httpd.conf最后增加
Include conf/jk.conf
6. 测试