我的运行环境:Windows2003 Server SP4 + J2SDK1.5.0 +Tomcat5.5.9
准备软件:Tomcat 5.5.9 JDK1.5.0
一.配置过程
1、安装JDK1.5.0。采用默认安装就可以。
2、安装tomcat到C: tomcat 50,采用完全安装,该程序用于实现负载均衡功能。
3、将tomcat50的内容进行完全复制,生成C: tomcat 51、C: tomcat 52、C: tomcat 53,分别用做集群中的节点。
4、修改负载均衡规则,使其遵循轮循算法(RoundRobin)。
4.1将testLB.jsp复制到c:tomcat50webappsbalancer文件夹中
4.2将文件夹classes复制到c:tomcat50webappsbalancerWEB-INF文件夹中
4.3修改c:webtomcat50webappsbalancerWEB-INFweb.xml文件如下:
BalancerFilter
/LoadBalancer
5、在集群中每个节点下,部署clusterapp应用。Clusterapp包含sessiondata.jsp,test.jsp,脚本。 test.jsp是用来验证节点状态的页面;sessiondata.jsp是用来响应用户所发送的请求,同时记录会话ID,会话的起始和最后时间,提供 用户增加、修改、删除会话的属性字段和属性值,可以通过此来判断会话的持续与否。
6、将log4j的log4j-1.2.9.jar复制到每个%tomcat%/common/ lib下,使其将会话日志统一存储到指定的文件中。
7、修改每个tomcat的server.xml配置文件,参数如下表所示。
配置 Instance 1 Instance 2 Instance 3 Instance 4
Instance Type Load Balancer Node 1 Node 2 Node 3
Code name TC-LB TC01 TC02 TC03
Home Directory c:/tomcat50 c:/tomcat51 c:/tomcat52 c:/tomcat53
Server Port 8005 9005 10005 11005
Connector 8080 9080 10080 11080
JK2 AJP Connector 8009 9009 10009 11009
Cluster mcastAddr 228.0.0.4 228.0.0.4 228.0.0.4 228.0.0.4
Cluster mcastPort 45564 45564 45564 45564
tcpListenAddress 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1
Cluster tcpListenPort 4000 4001 4002 4003
8、修改c:webtomcat50webappsbalancerWEB-INFconfigruler.xml文件如下:
serverInstance="1"
maxServerInstances="3"
tcpListenAddress="127.0.0.1"
tcpListenPort="4001"
testWebPage="http://localhost:9080/clusterapp/test.jsp"
redirectUrl="http://localhost:9080/clusterapp/sessiondata.jsp" />
serverInstance="2"
maxServerInstances="3"
tcpListenAddress="127.0.0.1"
tcpListenPort="4002"
testWebPage="http://localhost:10080/clusterapp/test.jsp"
redirectUrl="http://localhost:10080/clusterapp/sessiondata.jsp" />
serverInstance="3"
maxServerInstances="3"
tcpListenAddress="127.0.0.1"
tcpListenPort="4003"
testWebPage="http://localhost:11080/clusterapp/test.jsp"
redirectUrl="http://localhost:11080/clusterapp/sessiondata.jsp" />
redirectUrl="http://localhost:8080/balancer/testLB.jsp" />
9、启动tomcat的应用。手动双击每个tomcat/bin的startup.bat程序。
二.Web请求集群环境下流程
1、启动访问起始页(http://localhost:8080/balancer/testLB.jsp)
2、JSP重定向请求到负载均衡过滤文件(http://localhost:8080/balancer/LoadBalancer)
3、负载均衡的tomcat接受请求,根据制定的负载均衡算法,重定向到可用的集群节点(TC01、TC02、TC03)
4、对应集群中节点的sessiondata.jsp(位于clusterapp应用下)页面将启动。
5、sesiondata.jsp将在web上显示会话的详细信息(如会话ID,最后访问时间)
在测试的过程中采用RoundRobin算 法,通过对Instance 1发起多个http://localhost:8080/balancer/testLB.jsp测试请求,发现每个请求返回页面的端口号不完全一致,在 9080、10080、11080端口不规则的出现,即客户端的访问请求按照RoundRobin算法被重定向到不同的服务器上进行处理,说明该负载均衡 规则在这个测试中得到正确的体现。在关闭集群中一个节点后再启用它,能够自动发现该节点,并为该节点分配请求。
网络上有好多关于 Tomcat 集群配置的文章,但有些是以 Tomcat 4 为基础的,有的并不是讲的很清楚,自己摸索了半天,试验成功了,现把简要过程写出来,让你在几分钟内体验一下 Tomcat Cluster 。
一、配置环境
- 下载和安装 JRE 1.5 最新版 (1.5.06)
- 下载和安装 Tomcat 最新版 (5.5.12),假定安装目录为 C:Program FilesApache Software FoundationTomcat 5.5
二、使 Tomcat 集群配置生效
- 修改 Tomcat 安装目录confserver.xml ,把 Server/Service/Engine/Host 下的 Cluster 结点前后的注释符(<!-- 和 -->)删除,并保存
三、配置第二个 Tomcat 实例
- 在 C:Program FilesApache Software Foundation 下新建目录 Tomcat 5.5 Instance1
- 将 C:Program FilesApache Software FoundationTomcat 5.5 目录下的全部内容复制到 C:Program FilesApache Software FoundationTomcat 5.5 Instance1
- 修改新实例的服务器配置文件 (C:Program FilesApache Software FoundationTomcat 5.5 Instance1confserver.xml),把其中的 Server/Service/Connector 的端口更改,以避免和第一个冲突(8080 -> 9080,8009 -> 9009,8443 -> 9443)
- 修改 Cluster/Receiver 结点的 tcpListenPort 端口(此端口用于 Session 复制),以避免和第一个冲突(4001 -> 4002)
注:Tomcat Cluster 默认使用多播来建立成员关系,即两个实例的多播的地址和端口一样,就可以互相认为是同一个 Cluster 的成员。
四、启动验证两个 Tomcat 实例能否正常工作
- 直接用程序菜单里的 Monitor Tomcat 来启动第一个实例(或在服务器里启动)
- 第二个实例启动稍微麻烦一些,在 C:Program FilesApache Software FoundationTomcat 5.5 Instance1Bin 下建一个 startup.bat ,用如下 java 命令来启动:
"C:Program FilesJavaj实re1.5.0_06binjava.exe" -jar .bootstrap.jar -Dcatalina.home="C:Program FilesApache Software FoundationTomcat 5.5 Instance1" -Dcatalina.base="C:Program FilesApache Software FoundationTomcat 5.5 Instance1" -Djava.endorsed.dirs="C:Program FilesApache Software FoundationTomcat 5.5commonendorsed" -Djava.io.tmpdir="C:Program FilesApache Software FoundationTomcat 5.5 Instance1temp" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:Program FilesApache Software FoundationTomcat 5.5 Instance1conflogging.properties" start
看起来挺长,其实主要是第二个实例的安装目录太长的缘故,直接执行此批处理就可以启动第二个实例,如果配置正确,应该可以看到集群管理器启动,并和第一个实例 建立成员关系的信息。
五、写一个简单Web应用,能显示和设置 Session 属性值,以供测试
- 如果有开发工具,新建一个 Web App ,假设为 TomcatDemo
- 新增 index.jsp ,加入如下代码:
<%...@ page contentType="text/html; charset=UTF-8" import="java.util.*"%>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info: <%... out.print(request.getLocalAddr() + " : " + request.getLocalPort());%>
<%...
out.println("<br> ID " + session.getId());
// 如果有新的 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>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
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>
以上代码主要是显示服务器信息和 Session 值,并包含一个 Form ,可以随时新建一个 Session 属性值
- 修改此用应用的 Web.xml ,加入 distributable 属性,表示 Tomcat 要为此 Web 应用复制 Session
<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>TomcatDemo</display-name>
<distributable/>
</web-app>
- 将应用打包成 WAR 文件,分别上现两个实例的 Tomcat Manager 来部署
(如果没有 Java 开发工具,可以直接建立一个 TomcatDemo 的目录,用 Notepad 将如上的内容复制并保存成 index.jsp,然后在此目录下新建子目录 WEB-INF,再用 Notepad 新建一 Web.xml 文件,将上面的代码复制保存,然后将此目录压缩成 Zip 文件,再把后缀改成 .war ,或利用 jar 命令来创建 .war 文件)
六、测试 Tomcat 集群和 Session 复制的是否工作
- 在 IE 中打开第一个实例中的 TomcatDemo (http://localhost:8080/TomcatDemo),在 Form 里随便设置一个 Session 属性,如 MyName = foo
- 将 IE 地址栏中的地址修改为第二个实例中的 TomcatDemo(http://localhost:9080/TomcatDemo),刷新,就可以看到注意到 SessionID 不变, MyName 的属性值已有了
- 同样,如果在第二实例中设置的值,在第一个实例的页面中也能看到
注意:必须在同一个 IE 窗口中进行如上测试,以保证是同一个 Session ,如果是两个窗口,则 Session 可能不同,也互相看不到 Session 复制的结果。
七、其它工作
- 上述只实现了 Session 复制,而没有实现 Load Balance(负载均衡),这可以利用 Apache 等来实现,网上有很多相关文章,可能参考)
评论
to zhj
版主在这篇文章的目的就只是让你体验集群,至于还是需要通过2个入口进入集群,作者已有提到,就是最后的,需要用apache来做负载均衡
写的好,向你学习,我正在学习中
实践中整理出tomcat集群和负载均衡
(一)环境说明
(1)服务器有4台,一台安装apache,三台安装tomcat
(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2
(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4
(二)安装过程
(1)在三台要安装tomcat的服务器上先安装jdk
(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径
(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动
(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999
修改位置为tomcat的安装目录下的conf/server.xml
修改前的配置为
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
修改后的配置为
<Connector port="7080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
依次修改每个tomcat的监听端口(7080/8888/9999)
(5)分别测试每个tomcat的启动是否正常
http://192.168.0.1:7080
http://192.168.0.2:8888
http://192.168.0.4:9999
(三)负载均衡配置过程
(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:Program FilesApache GroupApache2
(2)安装后测试apache能否正常启动,调试到能够正常启动http://192.168.0.88
(3)下载jk2.0.4后解压缩文件
(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:Program FilesApache GroupApache2modules
(5)修改apache的安装目录中的conf目录的配置文件httpd.conf,在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so
(6)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下
修改前
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
-->
<!-- Define the top level container in our container hierarchy -->
<Engine name="Catalina" defaultHost="localhost">
修改后
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host). -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :-->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">
<!-- Define the top level container in our container hierarchy
<Engine name="Catalina" defaultHost="localhost">
-->
将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"
(7)然后重启三个tomcat,调试能够正常启动。
(8)在apache的安装目录中的conf目录下创建文件workers2.propertie,写入文件内容如下
# fine the communication channel
[channel.socket:192.168.0.1:8009]
info=Ajp13 forwarding over socket
#配置第一个服务器
tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致
debug=0
lb_factor=1 #负载平衡因子,数字越大请求被分配的几率越高
# Define the communication channel
[channel.socket:192.168.0.2:8009]
info=Ajp13 forwarding over socket
tomcatId=tomcat2
debug=0
lb_factor=1
# Define the communication channel
[channel.socket:192.168.0.4:8009]
info=Ajp13 forwarding over socket
tomcatId=tomcat3
debug=0
lb_factor=1
[status:]
info=Status worker, displays runtime information.
[uri:/jkstatus.jsp]
info=Display status information and checks the config file for changes.
group=status:
[uri:/*]
info=Map the whole webapp
debug=0
(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + 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>");
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>
(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp
能否正常访问,并查询其中的内容,有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,
能运行,则已建立负载均衡。
(四)tomcat集群配置
(1)负载均衡配置的条件下配置tomcat集群
(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下
修改前
<!--
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="5000"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
-->
修改后
<!-- modify by whh -->
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true"
notifyListenersOnReplication="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"
ackTimeout="5000"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
<!-- modify by whh -->
将集群配置选项的注释放开即可,如上。
(3)重启三个tomcat。到此tomcat的集群已配置完成。
(五)应用配置
对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置
<distributable/>
配置前
<?xml version="1.0" encoding="UTF-8"?>
<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>TomcatDemo</display-name>
</web-app>
配置后
<?xml version="1.0" encoding="UTF-8"?>
<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>TomcatDemo</display-name>
<distributable/>
</web-app>
问:tomcat集群是怎么处理session的阿
答:在tomcat做集群之后,每个tomcat之间自动根据tomcat的配置文件中的参数进行session复制,
对于一个客户端对说,只要是同一个IP,那它每次上传的sessionID就是一样的,
1.使用DNS轮询.2.使用Apache R-proxy方式。3.使用Apache mod_jk方式. DNS轮询的缺点是,当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必须等到dns解析更新,或者这台服 务器重新启动。还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并且占用大量公网IP地址,而且tomcat还 要负责处理静态网页资源,影响效率。优点是集群配置最简单,dns设置也非常简单。 R-proxy的缺点是,当其中一台tomcat停止运行的时候, apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存在这个问题。 mod_jk方式的优点是,Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。缺点就是,当停止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请 求过去。 R-proxy和mod_jk的共同优点是.可以只将Apache置于公网,节省公网IP地址资源。可以通过设置来实现Apache专门负责处 理静态网页,让Tomcat专门负责处理jsp和servlet等动态请求。共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对 外提供。R-proxy和mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。这三种方式对实现最佳负载均衡都有一定不足, mod_jk相对好些,可以通过设置lbfactor参数来分配请求任务。 所有这些在实际使用中都应该根据具体情况来选择。简略配置如下:前期准备: 1。下载Apache和Tomcat:Apache2.0.53:http: //www.eu.apache.org/dist/httpd/binaries/win32/apache_2.0.53-win32-x86-no_ssl.msi Tomcat5.5.9: http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat- 5.5.9.ziphttp://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta -tomcat-5.5.9-fulldocs.tar.gzhttp://www.eu.apache.org/dist/jakarta/tomcat -5/v5.5.9/bin/jakarta-tomcat-5.5.9-compat.ziphttp://www.eu.apache.org/dist/jakarta/tomcat -5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip mod_jk.sohttp://www.eu.apache.org/dist/jakarta/tomcat -connectors/jk/binaries/win32/jk-1.2.8/mod_jk-1.2.8-apache-2.0.52.so(可选, 因为Apache2.0.53已经自带). 2.配置Tomcat集群。同时发布有clusterapp这个web应用,,修改test.jsp,使得 打开:http://192.168.9.235:12080/clusterapp/test.jsp和http://192.168.9.226: 12080/clusterapp/test.jsp看到的是不同的页面效果。 3.安装Apache2.0.53。 此时Tomcat集群的服务器为: 192.168.9.226:12080和192.168.9.235:12080 编辑c: /windows/system32/drivers/etc/host文件,最后一行加上127.0.0.1 lizongbo.com先来R-proxy方式。接下来是mod_jk方式。重新启动apache,同样打开http: //lizongbo.com/clusterapp/test.jsp不停的刷新这个页面,也将会看到页面显示出不同的内容。参考资料:Tomcat cluster:http://www.onjava.com/onjava/2004/04/14/examples/tomcatclustering.ziphttp: //www.onjava.com/pub/a/onjava/2004/11/24/replication1.htmlhttp://www.onjava.com/pub/a/onjava/2004/11/24/replication1.html? page=2http://www.onjava.com/pub/a/onjava/2004/04/14/clustering.htmlhttp://www.onjava.com/pub/a/onjava/2004/04/14/clustering.html? page=2R-proxy:http://www.douzhe.com/docs/ApacheManual/mod/mod_proxy.html#proxypassreversehttp: //www.douzhe.com/docs/ApacheManual/mod/mod_rewrite.html#rewritemaphttp://www.douzhe.com/docs/ApacheManual/mod/mod_rewrite.html#rewriterule mod_jk: http://jakarta.apache.org/tomcat/connectors-doc/config/apache.htmlhttp://jakarta.apache.org/tomcat/connectors -doc/config/workers.htmlhttp://jakarta.apache.org/tomcat/connectors-doc/common/ajpv13a.htmlhttp: //www.mail-archive.com/tomcat-user@jakarta.apache.org/msg146787.html 相对 已经过时的资料(因为mod_jk2方式已经不被推荐,mod_jk2已经不再被更新了):http: //www.sentom.net/list.asp?id=14http://www.linuxforum.net/docnew/showthreaded.php? Cat=&Board=server&Number=507&page=1&view=collapsed&sb =5&o=all&fpart=http://www.ecoo.net/list.asp?articleid=2311http://www.linuxaid.com.cn/forum/showdoc.jsp? l=1&i=81013&m=0http://search.csdn.net/expert/topicview1.asp?id=1706745http: //www.chinaitlab.com/www/news/article_show.asp?id=11921 可能有用的资料:(因为我还没有 仔细看过) http://www.phpv.net/article.php/92 http: //raibledesigns.com/tomcat/ http://www.crazysquirrel.com/debian/tomcat55.php



out.println(
}