標籤:style http java color 使用 os 檔案 io
Windows下Apache+Tomcat實現應用叢集
1 環境依賴:windows、jdk1.6、Apache2.2、tomcat6.0
2 Jdk1.6安裝
2.1 略
3 安裝Apache(2.2.27)
3.1 下載:從Apache官網http://httpd.apache.org/download.cgi下載httpd-2.2.25-win32-x86-openssl-0.9.8y.msi;
3.2 安裝:雙擊上一步下載的安裝程式,持續下一步直到完成;安裝嚮導成功完成,左面右下角托盤中會出現Apache表徵圖。
3.3 測試:開啟瀏覽器,在其地址欄中輸入http://localhost或者http://127.0.0.1,開啟後可以看到“It works”字樣,表示安裝成功。
4 配置Apache
Apache2.2整合了mod_jk功能,相對於1.3版本,不再需要對worker.perproties進行進行配置,使其配置過程大幅度簡化。
4.1 配置啟動自動載入代理(proxy)模組(httpd.conf)
用文字編輯器開啟${APACHE_HOME}/conf/http.conf檔案,去掉一下文本前的注釋符(#)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
4.2 配置首頁
在上一步的基礎上繼續向下找到“DirectoryIndex index.html”字樣,在其後追加index.jsp
4.3 開啟虛擬節點
在上一步的基礎上繼續向下找到“Include conf/extra/httpd-vhosts.conf”字樣,去掉前面的注釋符
4.4 配置虛擬節點
用文字編輯器開啟${APACHE_HOME}/conf/extra/httpd-vhosts.conf檔案,在最後面追加如下內容
<VirtualHost *:80>
ServerAdmin [email protected] # 管理員郵箱
ServerName www.domain.com # 預設網域名稱,沒有可以用IP代替
ServerAlias localhost # 別名,多個空格隔開
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
ErrorLog "logs/cluster_test-error.log"
CustomLog "logs/cluster_test-access.log" common
</VirtualHost>
上面的balancer://是告訴Apache需要進行負載平衡代理,後面的cluster是叢集名,名字可自行定義,再後面*Log為日誌引擎,負責日誌記錄。
4.5 配置代理
回到${APACHE_HOME}/conf/http.conf檔案上,在其末尾追加如下格式內容
ProxyRequests Off # 使用反向 Proxy
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:18009 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:28009 loadfactor=1 route=jvm2
</proxy>
上面的cluster需要與4.4中的叢集名保持一致,Apache通過ajp協議與tomcat進行通訊,ip地址與連接埠號碼確定了tomcat,loadfactor為負載因子,Apache按因子比例向tomcat轉寄請求,route為tomcat配置中的jvmRoute,見章節。
4.6 測試
重啟Apache服務,此時訪問http://localhost,將出現503錯誤,表示正常,因為此時tomcat尚未配置和啟動。
5 安裝Tomcat
5.1 下載
略
5.2 安裝
略
6 配置Tomcat
因為是做tomcat叢集,本篇以兩個tomcat為例介紹,其分別命名為tomcat1、tomcat2。
6.1 配置Server port
用文字編輯器開啟${TOMCAT_HOME_1}/conf/server.xml,
找到:<Server port="8005" shutdown="SHUTDOWN">
修改為:<Server port="18005" shutdown="SHUTDOWN">
6.2 配置Connector port
在上一步基礎上,繼續向下尋找、
找到:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改為:<Connector port="18080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" URIEncoding="UTF-8"/>
繼續向下搜尋
找到:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改為:<Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />
註:這裡的port即為Apache通過apj協議與tomcat通訊的連接埠,以實現負載平衡,故此處的連接埠18009應與4.5章節中連接埠號碼對應。
6.3 配置Engine
首先關閉<Engine name="Catalina" defaultHost="localhost">
然後開啟<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
註:這裡的jvmRoute的值jvm1應與4.5章節中的route相對應。
6.4 配置Cluster
在當前檔案中繼續向下尋找,找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,預設Cluster配置未被開啟,這裡我們取消注釋,使其開啟,主要作用是使各tomcat間共用session,據介紹在壓力較大的情況下出現了session丟失情況,此段<Cluster />是一下代碼的簡寫,其完整代碼如下:
# 同步非同步模式由channelSendOptions參數控制,預設值是8,為非同步模式,4是同步模式。在非同步模式下,可以通過加上拷貝確認(Acknowledge)來提高可靠性,此時channelSendOptions設為10。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"> <Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> <Channel className="org.apache.catalina.tribes.group.GroupChannel"> <Membership className="org.apache.catalina.tribes.membership.McastService"address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"address="auto" port="15900" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> </Sender> <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> </Channel> # filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/> <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/></Cluster>
上面代碼中的<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>及<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>配置是在使用mod_jk並且沒有使用sticky sessions或者sticky sessions無法正常工作時的解決方案,我們沒有使用mod_jk,也就出現了壓力較大session複製失敗的情況,因此我們需要將上面的配置去掉這兩行,然後替換<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
6.5 配置其他用於叢集的tomcat,重複6.1~6.4的操作配置其他tomcat,主要是更改連接埠號碼(文中帶有綠色標識的地方)
7 測試負載平衡
7.1 測試專案準備
建立一個web項目,取名為cluster_demo;
在項目中建立一個index.jsp頁面,在頁面body中加入如下內容:
<% String sessionid = session.getId();System.out.println("當前sessionid = " + sessionid);%>
7.2 部署與啟動
將上一步建立的測試專案部署到用於叢集的tomcat中。
方式一:將項目放置到${TOMCAT_HOME_*}/webapps下;
方式二:在用於叢集的tomcat的${TOMCAT_HOME_*}/conf/server.xml中的Host節點下添加
<Context path="/cluster_demo" docBase="D:/apache_tomcat/projects/cluster_demo" reloadable="true" crossContext="false" privileged="true"></Context>
然後分別啟動叢集中的tomcat,再啟動Apache服務
7.3 並發訪問
利用Apache中所帶的ab來進行並發訪問的類比測試。
開啟命令列視窗,切換至${APACHE_HOME}/bin下
cd ${APACHE_HOME}/bin
ab –n 20 –c 10 http://localhost/cluster_demo/index.jsp
可看到各tomcat控制台中的輸出資訊,是否分別平均接收了20個請求。
運行結果分別如所示,可見兩個tomcat平均分擔了20個請求:
8 測試session共用
8.1 共用配置
在測試專案的web.xml中,添加<distributable/>元素,這樣可以通知tomcat伺服器,當前應用需要在急群眾的所有節點間實現session共用。
重要:所有session中的對象應是可序列化的,實現java.io.Serializable介面。
8.2 測試準備
在7.1章節基礎上,修改index.jsp的內容為
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>cluster test - share session</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> </head> <body> <% String sessionid = session.getId();System.out.println("當前sessionid = " + sessionid);// 如果有新的 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="index.jsp" id="form_add" method="post"> Key:<input id="dataName" name="dataName" type="text"/> Value:<input id="dataValue" name="dataValue" type="text"/> <input id="subBtn" name="subBtn" type="submit" value="提交" /> </form> </body></html>
8.3 驗證測試
重新部署啟動後,訪問http://localhost/cluster_demo/index.jsp ,在頁面上向session中添加一些資訊,可看到如下效果,說明session共用咯,不解釋。
至此,大功告成!