这种方式应该是现在比较成熟的系统解决方案。主要优点是:
1.方便的实现集群session同步;
2.方便水平扩展,后面加的Tomcat只要改两个配置文件就可以了;
分别安装apache、tomcat和mod_jk三个东东。
apt-get install tomcat6
apt-get install apache2
apt-get install libapache2-mod-jk
安装完成后,在 /etc/apache2/mods-available 下面有个jk.load,于是我们在这里新建jk.conf文件,文件内容是:
# 加载mod,可以不写,apache会自动加载
# LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
# JkLogFile /var/log/apache2/mod_jk.log
# 指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
JkMount /* controller
JkMount /jkstatus status
# 指定日志级别,默认的日志级别会让你的log文件很快变大
JkLogLevel error
然后新增 /etc/apache2/workers.properties 配置文件,内容如下:
#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=8009
worker.tomcat1.host=192.168.1.1
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.1.2
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2
worker.controller.sticky_session=1
#======== Define a 'jkstatus' worker using status ========
worker.list = status
worker.status.type=status
这里可以配置任意多个Tomcat,此处配置了2个Tomat服务器,因为都是远程的,所以端口不用改。如果一台机器有多个Tomcat,那么端口要改成不一样的。
然后开始配置Tomcat,修改/etc/tomcat6/server.xml
<Connectorport="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost"jvmRoute="tomcat1">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
注意这三个地方就可以了。
另外一个Tomcat也一样修改,改完记得重启Tomcat。
然后重启Apache:
service apache2 restart
这个时候理论上已经配置完成了,然后我们搞个测试页面test.jsp放到Tomcat的webapp下面:
<%@ 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.println("<b>Session 列表</b><br>");
System.out.println("============================");
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="test2.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>
这个文件是网上找的,不解释了。
此时,在浏览器里面输入http://localhost/test.jsp 应该能看到多次刷新页面的sessionID看是同一个ID,说明session是复制成功了。
接来下是监控Apache和各台tomcat的运行情况:
命令行输入:a2enmod info
然后在浏览器中输入http://localhost/server-status 就可以看到系统处理信息
然后是监控多台tomcat的运行情况,可以用jkstatus来解决这个问题。
我们在之前的jk.conf和workers.properties已经配置过了,所以可以直接请求 http://localhost/jkstatus 查看集群内的tomcat是死是活。