Tomcat下应用负载均衡集群部署参考
Windows操作系统
jdk1.5以上版本
apache_2.0.63
下载地址:http://httpd.apache.org/
Tomcat5.5
下载地址:http://tomcat.apache.org/download-55.cgi
下载Zip版
mod_jk
下载地址:http://apache.justdn.org/tomcat/tomcat-connectors/jk/
下载与apache2.0.63相对应的版本,此处选择下载mod_jk-1.2.26-httpd-2.0.59.so
特别提醒:设置系统环境变量:JAVA_HOME与PATH
双击安装文件进行安装,一般按照默认设置即可,如果需要指定安装路径,可在相应的步骤中进行更改设置。下文中以“$apache_home”来替代说明apache的安装路径的根。
安装完毕,在任务栏应该可以看到一个Apache的快捷启动图标,试启动一下,如果正常启动,任务栏中小图标会变成绿色,可以通过http://localhost/进行访问,正常会出现欢迎页面。
(1)、将下载的mod_jk-1.2.26-httpd-2.0.59.so拷贝到$apache_home/modules文件夹下
(2)、在$apache_home/conf目录下新建文件:mod_jk.conf,文件中设置如下内容,这些内容一般不用变化。
LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.0.59.so
<IfModule mod_jk.c>
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
</IfModule>
(3)、在$apache_home/conf目录下新建文件:workers.properties,文件中设置如下内容:
#server 列表
worker.list = controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=10.20.0.193 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=10.20.0.193 #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分担请求的tomcat
worker.controller.sticky_session=1
具体需要配置的Tomcat的数目,根据实际的部署情况进行设置,此处配置了两个,为tomcat1和tomcat2,注意controller的名称对应以及各个Tomcat中的参数设置。有些参数的设置是要和后面各个Tomcat的设置对应的。
特别注意其中的端口和Ip设置,是需要按照实际情况配置的。
(4)、打开$apache_home/conf目录下文件:httpd.conf,这个文件我们设置比较多,
其中包括一些与具体项目相关的优化设置。
找到“KeepAliveTimeout 15”所在行,在其下放添加内容:
<IfModule prefork.c>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>
<IfModule worker.c>
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "acces plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
</IfModule>
在“<IfModule mpm_winnt.c>”节点中,添加一行:
Win32DisableAcceptEx
设置Listen端口,默认情况下,是“Listen 80”,可以配置多个,比如:
Listen 80
Listen 8888
由“LoadModule access_module modules/mod_access.so”起始行开始替换所有LoadModule节点配置:
LoadModule access_module modules/mod_access.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_module modules/mod_auth.so
#LoadModule auth_anon_module modules/mod_auth_anon.so
#LoadModule auth_dbm_module modules/mod_auth_dbm.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule cgi_module modules/mod_cgi.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule file_cache_module modules/mod_file_cache.so
LoadModule headers_module modules/mod_headers.so
LoadModule imap_module modules/mod_imap.so
LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule negotiation_module modules/mod_negotiation.so
#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule status_module modules/mod_status.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule ssl_module modules/mod_ssl.so
LoadModule deflate_module modules/mod_deflate.so
include conf/mod_jk.conf
在“DirectoryIndex index.html index.html.var”后面添加“index.jsp”,如果应用的起始页面为”index.jsp”的话,其他情况可以根据类似配置。
在最后,需要添加的VirtualHost设置,以127.0.0.1下配置两个端口为例:
NameVirtualHost 127.0.0.1:80
<VirtualHost 127.0.0.1:80>
DocumentRoot "D:/application/hbu_application"
ServerName 127.0.0.1
ServerAdmin [email protected]
JkMount /sepa/maxReportServices controller
JkMount /sepa/viewer/* controller
JkMount /sepa/admin/* controller
JkMount /*.action controller
JkMount /*.jsp controller
</VirtualHost>
NameVirtualHost 127.0.0.1:8888
<VirtualHost 127.0.0.1:8888>
DocumentRoot "D:/application/hbu_application"
ServerName 127.0.0.1
ServerAdmin [email protected]
JkMount /sepa/maxReportServices controller
JkMount /sepa/viewer/* controller
JkMount /sepa/admin/* controller
JkMount /*.action controller
JkMount /*.jsp controller
</VirtualHost>
DocumentRoot节点指定应用所在的目录,是apache需要处理一些不交给Tomcat处理的文件的放置,此处可以放置与Tomcat下部署的完全一样的应用。
JkMount配置指定交给Tomcat处理的文件,可以配置多个。
(1)、将apache-tomcat-5.5.27.zip解压缩,复制两份,分别命名为:apache-tomcat-5.5.27_node1和apache-tomcat-5.5.27_node2,下文中将这两个Tomcat的实例的根目录分别称为:$Tomcat_node1和$Tomcat_node2。
(2)、由于是在同一台机器上安装两个Tomcat实例来模拟实现多台机器部署,所以以下保持apache-tomcat-5.5.27_node1不变,来改变一些apache-tomcat-5.5.27_node2的配置参数。
打开$Tomcat_node2/conf目录下的server.xml文件:
l 改变<Server port="8005" shutdown="SHUTDOWN">中的port设置,我们设定成9005.
l 改变<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="300" minSpareThreads="25" maxSpareThreads="150"
enableLookups="false" redirectPort="8443" acceptCount="150"
connectionTimeout="30000" disableUploadTimeout="true" />中的port和redirectPort设置,我们分别设定为:9080和9443.
l 改变<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />中的port和redirectPort设置,我们分别设定为:9009和9443.
(3)、打开$Tomcat_node1/conf目录下的server.xml文件,更改
<Engine name="Catalina" defaultHost="localhost">
添加属性jvmRoute="tomcat1",其他参数不做变动。打开$Tomcat_node2/conf目录下的server.xml文件,更改
<Engine name="Catalina" defaultHost="localhost">
添加属性jvmRoute="tomcat2",其他参数不做变动。
(4)、编写一个简单web测试,比如一个命名为“TestDemo”的web应用,放置到$Tomcat_node1/webapps目录。
l 设定其WEB_INF/web.xml的内容为:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>TestDemo</display-name>
<description>TestDemo</description>
<distributable/>
</web-app>
特别注意<distributable/>标签
l 在TestDemo目录下创建index.jsp,其内容设置如下:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
System.out.println("<><><><><><><>Tomcat_Node_1");
out.println(request.getServerName() + " : " + request.getLocalPort()+"<br>");
%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 属性设置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session 列表</b><br/>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="index.jsp" method="POST">
名称:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
l 将TestDemo应用拷贝至$Tomcat_node2/webapps目录,更改index.jsp文件中的System.out.println("<><><><><><><>Tomcat_Node_1")为System.out.println("<><><><><><><>Tomcat_Node_2")。
(4)、启动apache,tomcat_node1和tomcat_node2,打开网页访问http://localhost/TestDemo/Index.jsp,多次请求可以看到请求被均匀的分发到两个Tomcat节点上去处理。
比如有个应用,为:TestDemo,打包解压目录为:D:/TestDemo,现在有两个Tomcat节点:Tomcat_node1和Tomcat_node2,在两个节点下部署指向同一文件源的应用很简单。
在Tomcat_node1节点目录的conf/Catalina/localhost文件夹下,创建一个文件:TestDemo.xml,
其内容如下:
<Context path="/TestDemo" docBase="D:/TestDemo "
debug="0" privileged="true">
</Context>
把这份文件拷贝放置到Tomcat_node1节点目录的conf/Catalina/localhost文件夹下,分别启动两个Tomcat,这样,TestDemo应用在两个节点下已经成功部署。