講解tomcat負(fù)載均衡的主設(shè)置
通過對(duì)Apache的安裝和一些負(fù)載因子,以及服務(wù)器的一些設(shè)置問題做了介紹之后,我們對(duì)整個(gè)操作系統(tǒng)概念有了一個(gè)全面的認(rèn)識(shí)。那么現(xiàn)在是時(shí)候進(jìn)行Tomcat負(fù)載均衡的配置介紹了。這個(gè)才是我們的核心問題。通過不同的服務(wù)器集群,它的負(fù)載配置難度也不盡相同。
如果僅僅為了配置一個(gè)可用的集群,Tomcat的負(fù)載均衡配置將會(huì)非常簡(jiǎn)單。分別打開兩個(gè)tomcat的server.xml配置文件,其中一臺(tái)可以采用默認(rèn)的設(shè)置,只需要修改兩個(gè)地方,而另一個(gè)要有較大改動(dòng)以避免與前一臺(tái)沖突。如果兩臺(tái)不在同一臺(tái)服務(wù)器上運(yùn)行,對(duì)于端口就不需做改動(dòng)。首先是配置關(guān)閉端口,找到<Server port="8005" shutdown="SHUTDOWN">,第一臺(tái)不變,把第二臺(tái)改為9005。
下面配置Connector的端口,找到non-SSL HTTP/1.1 Connector,即tomcat單獨(dú)工作時(shí)的默認(rèn)Connector,保留第一臺(tái)默認(rèn)配置,在8080端口偵聽,而把第二臺(tái)設(shè)置為在9080端口偵聽。往下找到AJP 1.3 Connector,<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,這是tomcat接收從Apache過來的ajp連接請(qǐng)求時(shí)使用的端口,保留第一臺(tái)默認(rèn)設(shè)置,把第二臺(tái)端口改為9009。第一臺(tái)tomcat的server.xml中找到<Engine name="Catalina" defaultHost="localhost">,去掉這段或改為注釋,把上方緊挨的<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">注釋符去掉,對(duì)于第二臺(tái),去掉注釋符并把jvm1改為jvm2。
向下找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,去掉注釋,這里的配置是為了可以在集群中的所有tomcat負(fù)載均衡節(jié)點(diǎn)間共享會(huì)話(Session)。如果僅僅為了獲得一個(gè)可用的tomcat集群,Cluster只需要這么配置就可以了。
只需要簡(jiǎn)單的幾步就配置完成,然后可以測(cè)試一下tomcat負(fù)載均衡是否配置成功。引用網(wǎng)上的一個(gè)測(cè)試方法,就是在webapps目錄下新建test目錄,在test目錄下新建test.jsp文件,代碼我稍作改動(dòng)如下:
- <%@ page contentType="text/html; charset=GBK" %>
- <%@ page import="java.util.*" %>
- <html><head><title>shiyang</title></head>
- <body>
- 服務(wù)信息:
- <%
- 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><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="test.jsp" method="POST">
- 名稱:<input type=text size=20 name="dataName">
- <br/>
- 值:<input type=text size=20 name="dataValue">
- <br/>
- <input type=submit value="提交">
- </form>
- </body>
- </html>
在test目錄下繼續(xù)新建WEB-INF目錄和web.xml,在<web-app>節(jié)點(diǎn)下加入<distributable />,這一步非常重要,是為了通知tomcat服務(wù)器,當(dāng)前應(yīng)用需要在集群中的所有節(jié)點(diǎn)間實(shí)現(xiàn)Session共享。如果tomcat中的所有應(yīng)用都需要Session共享,也可以把conf/context.xml中的<Context>改為<Context distributable="true">,這樣就不需對(duì)所有應(yīng)用的web.xml再進(jìn)行單獨(dú)配置。測(cè)試代碼完成!
先啟動(dòng)Apache服務(wù),在先后啟動(dòng)兩臺(tái)tomcat,分別點(diǎn)startup.bat批處理。如果一切順利的話,就會(huì)啟動(dòng)成功。再次訪問http://localhost,可以看到小貓頁(yè)面。訪問http://localhost/test/test.jsp。可以看到包括服務(wù)器地址,端口,session等信息在內(nèi)的頁(yè)面。
然后你可以測(cè)試一下容錯(cuò)功能,關(guān)閉一個(gè)tomcat,看看服務(wù)是否正常,然后重啟tomcat,關(guān)掉另一臺(tái)tomcat,看看是否也可以繼續(xù)提供服務(wù)。當(dāng)然你也可以配置多臺(tái)tomcat負(fù)載均衡,但是原理都一樣。