四、Tomcat配置
如果僅僅為了配置一個可用的集群,Tomcat的配置將會非常簡單。分別打開t1和t2的server.xml配置文件,對于t1,盡量采用默認的設置,而對t2作較大改動以避免與t1沖突。如果t2和t1不在同一臺服務器上運行,對于端口就不需做改動。
首先是配置關(guān)閉端口,找到<Server port="8005" shutdown="SHUTDOWN">,t1不變,把t2改為9005。
下面配置Connector的端口,找到non-SSL HTTP/1.1 Connector,即tomcat單獨工作時的默認Connector,保留t1默認配置,在8080端口偵聽,而把t2設置為在9080端口偵聽。
往下找到AJP 1.3 Connector,<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"/>,這是tomcat接收從Apache過來的ajp連接請求時使用的端口,保留t1默認設置,把t2端口改為9009。注意,這里的端口對應Apache httpd.conf中BalancerMember中配置的ajp連接端口。
繼續(xù)向下配置引擎,找到<Engine name="Catalina"defaultHost="localhost">,去掉這段或改為注釋,把上方緊挨的<Engine name="Catalina"defaultHost="localhost"jvmRoute="jvm1">注釋符去掉,對于t2,去掉注釋符并把jvm1改為jvm2。這里的jvmRoute對應Apachehttpd.conf中BalancerMember中配置的route參數(shù)。
向下找到<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,打開注釋,這里的配置是為了可以在集群中的所有tomcat節(jié)點間共享會話(Session)。如果僅僅為了獲得一個可用的tomcat集群,Cluster只需要這么配置就可以了,對于更多的Cluster配置筆者將另文解釋。
server.xml的配置修改完畢,下一步需要對具體的應用進行配置。在webapps目錄下新建test目錄,在test目錄下新建test.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>");
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="test.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>
在test目錄下繼續(xù)新建WEB-INF目錄和web.xml,在<web-app>節(jié)點下加入<distributable/>,這一步非常重要,是為了通知tomcat服務器,當前應用需要在集群中的所有節(jié)點間實現(xiàn)Session共享。如果tomcat中的所有應用都需要Session共享,也可以把conf/context.xml中的<Context>改為<Contextdistributable="true">,這樣就不需對所有應用的web.xml再進行單獨配置。
啟動t1,待t1啟動完成后再啟動t2。再次訪問http://localhost,可以看到小貓頁面。訪問http://localhost/test/test.jsp??梢钥吹桨ǚ掌鞯刂?,端口,sessionid等信息在內(nèi)的頁面。
注意這里的sessionid,與平常的sessionid相比多了小數(shù)點和后面的部分,這里的jvm1即處理當前請求tomcat服務器的jvmRoute,通過這里可以知道是集群中的哪一個服務器處理了當前請求。在文本框中輸入名稱和值,點擊按鈕,信息就保存到了Session中,并且顯示到頁面上。不斷點擊按鈕,可以發(fā)現(xiàn)輸入的信息并未丟失,而且sessionid小數(shù)點之前的部分保持不變,而小數(shù)點后面的字符不停的變化,表明是由不同的tomcat服務器處理了這些請求。這樣就實現(xiàn)了負載均衡,并且集群中的不同節(jié)點間可以實現(xiàn)會話的共享。此時如果停止一個tomcat服務器t2,Apache將會自動把后續(xù)請求轉(zhuǎn)發(fā)到集群中的其他服務器即t1。重啟t2后,Apache會自動偵測到t2的狀態(tài)為可用,然后會繼續(xù)在t1和t2間進行負載均衡。
如果需要向集群中增加節(jié)點,首先需要對tomcat作類似配置,然后修改Apache httpd.conf,增加BalancerMember,指向新增的tomcat即可。