環境:PC2臺:pc1(IP 192.168.88.118)安裝了apache和tomcat
???????????????????? pc2(IP 192.168.88.168)安裝了tomcat
???????? 系統 win xp sp3
? 1.安裝tomcat、apache服務器及版本對應的JK
??這里需要注意的是JK版本必須與apache服務器版本號對應,可以直接從我參考附件下載。apache_home表示apache服務器安裝目錄.
?2.配置apache服務器
??2.1 httpd.conf文件
?apache_home目錄下的conf/httpd.conf文件中添加
- LoadModule?jk_module?modules/mod_jk-1.2.26-httpd-2.2.4.so ??
- JkWorkersFile?conf/workers.properties ??
- JkMount?/*?lbcontroller???
?具體的說明如下:
- LoadModule?jk_module?modules/mod_jk-1.2.26-httpd-2.2.4.so??
?表示載入JK模塊。
- JkWorkersFile?conf/workers.properties??
tomcat實例配置,具體參見2.2。
- JkMount?/*?lbcontroller???
??設置apache分發器,/*表示apache將所有文件都由分發器lbcontroller 進行分發,你可以自行設置*.jsp,*.do等?
??2.2 workers.properties文件
在apache_home下conf目錄中新建workers.properties文件,輸入以下內容
- worker.list=lbcontroller??
- ??
- #Tomcat1實例配置 ??
- worker.tomcat1.host=192.168.88.118 ??
- worker.tomcat1.port=8009??
- worker.tomcat1.type=ajp13??
- #分發權重?值越大負載越大 ??
- worker.tomcat1.lbfactor?=?1 ??
- ??
- #Tomcat2實例配置 ??
- worker.tomcat2.host=192.168.88.168 ??
- worker.tomcat2.port=9009??
- worker.tomcat2.type=ajp13??
- #分發權重?值越大負載越大 ??
- worker.tomcat2.lbfactor?=?1??
- ??
- #負載均衡分發控制器 ??
- worker.lbcontroller.type=lb ??
- worker.lbcontroller.balance_workers=tomcat1,tomcat2 ??
- worker.lbcontroller.sticky_session=True??
?在這里
- worker.list=lbcontroller??
?內容即為httpd.conf文件中的分發器名稱。需要注意的內容是,tomcat實例名稱
- worker.tomcat1.host=.... ??
- ... ??
- worker.tomcat2.host=.... ??
- ...??
?在這里就是tomcat1和tomcat2必須與之后tomcat中的server.xml中jvmRoute值一致。
3.tomcat集群配置
配置每個tomcat目錄下的server.xml文件,具體修改內容如下
3.1 Engine配置
修改前
- <Engine?name="Catalina"?defaultHost="localhost">??
修改后
- <Engine?name="Catalina"?defaultHost="localhost"??jvmRoute="tomcat1"?>??
?具體tomcat中jvmRoute的值根據在workers.properties的配置,注意IP地址、tomcat實例名稱和jvmRoute值必須一一對應。
3.2 Connector配置
修改前
- <Connector?port="8009"?protocol="AJP/1.3"?redirectPort="8443"?/>??
修改后
- <Connector?port="9009"?protocol="AJP/1.3"?redirectPort="8443"?/>??
?這里tomcat的port值必須與在workers.properties中的port值一致。
3.3 Cluster配置
修改前
- <!-- ?
- <Cluster?className="org.apache.catalina.ha.tcp.SimpleTcpCluster"?>?
- -->??
?修改后,去掉注釋并添加一些內容如下
- <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="4001"?? ??
- ???????????????????autoBind="100"?? ??
- ???????????????????selectorTimeout="5000"?? ??
- ???????????????????maxThreads="6"/>??? ??
- ?????????<!--?timeout="60000"-->??? ??
- ?????????<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"/>??? ??
- ?????????<Interceptor?className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>??? ??
- ???????</Channel>??? ??
- ??
- ???????<Valve?className="org.apache.catalina.ha.tcp.ReplicationValve"?? ??
- ??????????????filter=""/>??? ??
- ???????<Valve?className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>??? ??
- ??
- ???????<ClusterListener?className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>??? ??
- ???????<ClusterListener?className="org.apache.catalina.ha.session.ClusterSessionListener"/>??? ??
- ?????</Cluster>??
?上述配置跟tomcat官方建議的配置,去掉了
- <Deployer?className="org.apache.catalina.ha.deploy.FarmWarDeployer"??
- ???????????????????tempDir="/tmp/war-temp/"??
- ???????????????????deployDir="/tmp/war-deploy/"??
- ???????????????????watchDir="/tmp/war-listen/"??
- ???????????????????watchEnabled="false"/>??
?如果不去掉這部分,則tomcat啟動會報"FarmWarDeployer can only work as host cluster subelement!."
3.4 session復制配置
tomcat集群中的session管理,主要有兩種方式:
1).粘性session
表示從同一窗口發來的請求都將有集群中的同一個tomcat進行處理。配置方式是在上面workers.properties文件中
- worker.lbcontroller.sticky_session=True???
粘性session的好處在不會在不同的tomcat上來回跳動處理請求,但是壞處是如果處理該session的tomcat崩潰,那么之后的請求將由其他tomcat處理,原有session失效而重新新建一個新的session,這樣如果繼續從session取值,會拋出nullpointer的訪問異常。
2).session復制
session復制是指tomcat彼此之間通過組播方式將session發到各個tomcat實例上,如果其中一個訪問出錯,則另外tomcat仍然具有有效的session內容,從而能正常接管其session。壞處是當tomcat實例很多,或者用戶在session中有大量操作時,組播發送的信息量十分驚人。session復制配置則是在發布的web應用程序中的web.xml中添加
- <distributable/>??
?此外,session復制所需的JDK必須是JDK 5.0及其以上版本。
4.測試
1) 先啟動apache服務器httpd
2) 啟動名為tomcat2的服務器
?在瀏覽器中輸入訪問地址http://localhost/test/index.html
?可以看到請求被轉發到了tomcat2進行處理
3)啟動tomcat 1 ,界面如下
?可以發現,tomcat1啟動后搜索到了tomcat2實例,并進行了session復制。在tomcat2的控制臺也可以找到如下輸出
?4)關閉tomcat 2,后繼續刷新url訪問。tomcat1控制臺中輸出的session?依然與之前tomcat2中的一致,并且在session中保存的屬性值仍然有效。
5.問題
上面的配置是在兩臺不同的配置上進行,tomcat負載和session復制都成功了。但是如果在同一臺機子上配置,則session復制總是不能成功,搜索了很多解決方式都不正確。
6.參考
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html
http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html#Cluster Basics?
系統架設
前臺采用apache2.2作為web服務器
后臺架設了3000,3001,3002,三個mongrol應用
?
?
問題表現
訪問http://localhost,出現一直在訪問服務器;
?
然后訪問http://localhost:3000可以正常訪問,估計問題出現apache上,查看錯誤日志error.log
?
apache后臺出現的錯誤提示:
?
[warn] Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
?
?
原因:
在httpd.conf中并沒有設置線程數量,Apache默認開啟了64個,看來是遠遠不夠。于是上網一查,在httpd.conf加入以下內容:
<IfModule mpm_winnt_module>
ThreadsPerChild 512
MaxRequestsPerChild 0
</IfModule>
這樣開啟了512工作線程。這個值根據需要可能要慢慢調整
按照上面的修改進行httpd。conf文件的修改,然后重啟服務器,可以正常訪問,問題解決
-Xmx1024m
-Xmn512m
-XX:PermSize=512M
-XX:NewSize=512m
-XX:MaxNewSize=512m
-XX:MaxPermSize=512m
-XX:ParallelGCThreads=4
-XX:MaxTenuringThreshold=5
-XX:ParallelCMSThreads=3
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=80
-Xss128k?:這個參數設置其實要小心,128是我們一直用的值,一直?也沒出什么問題。
以上參數都調大后其它的參數也要隨著調,要不然還是用默認值,這樣一定就會內存溢出了。
-XX:PermSize=512M??
-XX:NewSize=512m?
-XX:MaxNewSize=512m?
-XX:MaxPermSize=512m?
但下面幾個參數也不能調大,我們一般設置為最大JVM內存的一半。
楊航收集技術資料,分享給大家