無意間看到tomcat 6集群的內容,就嘗試配置了一下,還是遇到很多問題,特此記錄。apache服務器和tomcat的連接方法其實有三種:JK、http_proxy和ajp_proxy。本文主要介紹最為常見的JK。
環境: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文件中添加
Xml代碼
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
JkWorkersFile conf/workers.properties
JkMount /* lbcontroller
?具體的說明如下:
Xml代碼
LoadModule?jk_module?modules/mod_jk-1.2.26-httpd-2.2.4.so??
LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so
?表示載入JK模塊。
Xml代碼
JkWorkersFile?conf/workers.properties??
JkWorkersFile conf/workers.properties
tomcat實例配置,具體參見2.2。
Xml代碼
JkMount?/*?lbcontroller???
JkMount /* lbcontroller
??設置apache分發器,/*表示apache將所有文件都由分發器lbcontroller 進行分發,你可以自行設置*.jsp,*.do等?
??2.2 workers.properties文件
在apache_home下conf目錄中新建workers.properties文件,輸入以下內容
Xml代碼
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#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
?在這里
Xml代碼
worker.list=lbcontroller?? worker.list=lbcontroller
?內容即為httpd.conf文件中的分發器名稱。需要注意的內容是,tomcat實例名稱
Xml代碼
worker.tomcat1.host=.... ??... ??worker.tomcat2.host=.... ??...?? worker.tomcat1.host=....
...
worker.tomcat2.host=....
...
?在這里就是tomcat1和tomcat2必須與之后tomcat中的server.xml中jvmRoute值一致。
3.tomcat集群配置
配置每個tomcat目錄下的server.xml文件,具體修改內容如下
3.1 Engine配置
修改前
Xml代碼
<Engine?name="Catalina"?defaultHost="localhost">?? <Engine name="Catalina" defaultHost="localhost">
修改后
Xml代碼
<Engine?name="Catalina"?defaultHost="localhost"??jvmRoute="tomcat1"?>?? <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1" >
?具體tomcat中jvmRoute的值根據在workers.properties的配置,注意IP地址、tomcat實例名稱和jvmRoute值必須一一對應。
3.2 Connector配置
修改前
Xml代碼
<Connector?port="8009"?protocol="AJP/1.3"?redirectPort="8443"?/>?? <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改后
Xml代碼
<Connector?port="9009"?protocol="AJP/1.3"?redirectPort="8443"?/>?? <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
?這里tomcat的port值必須與在workers.properties中的port值一致。
3.3 Cluster配置
修改前
Xml代碼
???? <!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" >
-->
?修改后,去掉注釋并添加一些內容如下
Xml代碼
<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"/>??? ?????????????? ???????????<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>?? <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官方建議的配置,去掉了
Xml代碼
<Deployer?className="org.apache.catalina.ha.deploy.FarmWarDeployer"?????????????????????tempDir="/tmp/war-temp/"?????????????????????deployDir="/tmp/war-deploy/"?????????????????????watchDir="/tmp/war-listen/"?????????????????????watchEnabled="false"/>?? <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文件中
Xml代碼
worker.lbcontroller.sticky_session=True??? 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中添加
Xml代碼
<distributable/>?? <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文件的修改,然后重啟服務器,可以正常訪問,問題解決
-Xms1024m
-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
一般這兩個參數設置成一樣的,能提高效率:??-Xms1024m?-Xmx1024m?
-Xss128k?:這個參數設置其實要小心,128是我們一直用的值,一直?也沒出什么問題。
以上參數都調大后其它的參數也要隨著調,要不然還是用默認值,這樣一定就會內存溢出了。
-XX:PermSize=512M??
-XX:NewSize=512m?
-XX:MaxNewSize=512m?
-XX:MaxPermSize=512m?
但下面幾個參數也不能調大,我們一般設置為最大JVM內存的一半。
楊航收集技術資料,分享給大家
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的apache+tomcat配置的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。