天天看点

Apache2+tomcat6集群+session同步

Apache2+tomcat6 闆嗙兢+session鍚屾

璇存槑锛氬€熷墠浜轰箣閴达紝鍐欎竴绡囧叧浜巘omcat闆嗙兢鍙妔ession鍚屾鐨勯棶棰橈紝棣栧厛浠嬬粛tomcat闆嗙兢鍙婂仛闆嗙兢鐨勫師鍥犲拰蹇呰鎬э紱session鍚屾鐨勪綔鐢紱鍚勮蒋浠剁殑瀹夎閰嶇疆鍙婃祴璇曘€

鍘熺悊锛

Apache2+tomcat6集群+session同步

Apache鏄痟ttpd鏈嶅姟鍣紝璐熻矗鎺ユ敹http璇锋眰锛屽浣曞皢璇锋眰鍒嗗彂缁欏悗鍙皌omcat锛岃繖灏遍渶瑕乵od_jk浜嗭紝mod_jk鏄痑pache鐢ㄦ潵杩炴帴tomcat鐨勬ā鍧楋紝瀹冮渶瑕侀厤缃湪apache涓€備笅闈㈡弿杩扮殑鏄粬浠悇鑷殑鍒嗗伐鎯呭喌銆

Apache瑕佸仛鐨勬槸锛歛pache榛樿澶勭悊鎺ユ敹鍒扮殑鎵€鏈塰ttp璇锋眰锛屼絾鍙€氳繃閰嶇疆灏嗚姹傝浆鍙戠粰鏌愪釜妯″潡澶勭悊锛屽苟涓斿皢妯″潡澶勭悊缁撴灉杩斿洖锛屽湪杩欓噷鎴戜滑灏嗘墍鏈夎姹傞兘杞彂缁檓od_jk杩欎釜妯″潡鍘诲鐞嗐€

Mod_jk瑕佸仛鐨勬槸锛

a.聽鐧昏鎵€鏈夌殑tomcat鏈嶅姟鍣紝骞堕拡瀵逛笉鍚屽姛鑳藉垝鍒唗omcat鍋氫笉鍚岀殑閰嶇疆銆

b.聽灏嗕粠apache鎺ユ敹鍒扮殑璇锋眰鎸夌瓥鐣ュ垎閰嶇粰tomcat锛屽垎閰嶇瓥鐣ュ涓嬶細

i.聽聽聽聽聽聽 瀵逛簬鏂扮殑浼氳瘽鎸夐厤缃瘮渚嬪垎鍙戠粰tomcat

ii.聽聽聽聽聽 瀵逛簬宸叉湁浼氳瘽锛坔ttp涓寘鍚玸ession淇℃伅锛夌殑璇锋眰浼氬彂閫佺粰鍒涘缓璇ヤ細璇濈殑tomcat

iii.聽聽聽 褰撳垱寤轰細璇濈殑tomcat鏃犳硶鍝嶅簲鏃讹紝鍙戦€佺粰璇omcat鎸囧畾鐨勫浠絫omcat銆傚鏋滄病鏈夋寚瀹氾紝鍒欒涓烘柊浼氳瘽澶勭悊銆

Tomcat瑕佸仛鐨勬槸锛氬鐞唌od_jk鍙戦€佽繃鏉ョ殑璇锋眰骞惰繑鍥炵粨鏋溿€傚鏋滄煇涓€tomcat鏃犳硶鍝嶅簲搴旇浆鐢卞叾浠杢omcat澶勭悊鏃讹紝鍘熸湁鐨剆ession淇℃伅灏嗕細涓㈠け銆備负瑙e喅姝ら棶棰橈紝浜庢槸灏辨湁浜唖ession鍚屾鐨勬蹇碉紝鍗冲涓湇鍔″櫒涔嬮棿鍏变韩session锛屽綋鏌愪竴鏈嶅姟鍣ㄤ笉鑳芥彁渚涙湇鍔℃椂涓嶄細瀵艰嚧鐢ㄦ埛session涓㈠け銆俆omcat聽鐨剆ession鍏变韩鏄熀浜巌p缁勬挱鍗忚瀹炵幇鐨勩€傝繖閲屽彧闇€瑕佺煡閬搒ession鍚屾鏄彲浠ラ€氳繃閰嶇疆瀹炵幇鐨勶紝骞朵笖鏄敱tomcat瀹炵幇鐨勫苟闈瀖od_jk銆備簡瑙d簡鍘熺悊涔嬪悗锛岄厤缃捣鏉ュ氨姘村埌娓犳垚浜嗐€

.

闇€姹

鐢ㄤ袱鍙版湇鍔″櫒鎼缓apache+tomcat娴嬭瘯寮€鍙戠幆澧冿紝tomcat鍏锋湁璐熻浇鍧囪 鑳藉姏锛屽苟瀹炵幇session鍚屾銆

.鐜

OS锛欳entOS 5.6

httpd-2.2.17.tar.gz

jdk-6u20-linux-i586-rpm.bin

apache-tomcat-6.0.33.tar.gz

jakarta-tomcat-connectors-1.2.15-src.tar.gz

tomcat-connectors-1.2.32-src.tar.gz

.瑙勫垝瀹夎

192.168.2.4---------apache+tomcat+jdk

192.168.2.5---------tomcat+jdk

.閮ㄧ讲

Apache

瀹夎锛欬/b>

#tar httpd-2.2.17.tar.gz

#cd httpd-2.2.17

#./configure 鈥?prefix=/usr/local/apache2 鈥?enable-modules=so 鈥?enable-so

#make && make install

/usr/local/apache2/bin/apachectl start

鐪嬪埌apache灏遍厤缃垚鍔熶簡銆

JDK

鐨勫畨瑁匋/b>

#chmod +x jdk-6u20-linux-i586-rpm.bin

#./ jdk-6u20-linux-i586-rpm.bin

涓€璺┖鏍奸敭锛岀劧鍚庤緭鍏es,鍥炶溅榛樿灏卞畨瑁呭埌/usr/java/涓嬩簡銆

璁剧疆鐜鍙橀噺锛

#vim /etc/profile娣诲姞濡備笅鍐呭锛

#set java environment

export JAVA_HOME=/usr/java/jdk1.6.0_20

export JAVA_BIN=/usr/java/jdk1.6.0_20/bin

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JAVA_BIN PATH CLASSPATH

杩愯锛屼娇鐜鐢熸晥;

#source /etc/profile

[root@Client ~]# java -version

java version "1.4.2"

gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-52)

Copyright (C) 2006 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.聽There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

瀹夎tomcat

#tar 鈥搝xvf apache-tomcat-6.0.33.tar.gz

#mv apache-tomcat-6.0.33 /usr/local/tomcat

鍚姩涓€涓猼omcat瀹炰緥

#/usr/local/tomcat/bin/startup.sh

鍦ㄦ祻瑙堝櫒涓緭鍏ttp://192.168.2.4:8080鐪嬪埌鐚ご锛屽氨浠h〃鎴愬姛瀹夎浜嗭紒

鍦ㄥ彟涓€鍙版湇鍔″櫒锛?92.168.2.5锛変笂涔熷悓鏍峰畨瑁卝dk+tomcat銆傚惎鍔ㄥ嵆鍙

瀹夎tomcat-connectors-1.2.32-src.tar.gz

JK瀹夎锛堟暣鍚坅pache tomcat锛

#tar 鈥搝xvf tomcat-connectors-1.2.32-src.tar.gz

#cd tomcat-connectors-1.2.32-src/native

#./configure 鈥搘ith-apxs=/usr/local/apache2/bin/apxs 鈥搘ith-java-home= /usr/java/jdk1.6.0_20

鍦?usr/local/apache2/modules鐩綍涓嬩細浜х敓mod_jk.so

Apache+tomcat 鏁村悎

淇敼apache閰嶇疆鏂囦欢锛屾坊鍔犲涓嬪唴瀹癸細

JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties聽聽聽 //JK鐨勯厤缃枃浠讹紝璐熻浇鐨勯厤缃

JkShmFile logs/mod_jk.shm

JkLogFile /usr/local/tomcat/logs/mod_jk.log聽聽聽聽聽聽聽 //jk鐨勬棩蹇楁枃浠

JkLogLevel info聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 //鏃ュ織绾у埆

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

JkOptions聽 +ForwardKeySize +ForwardURICompat -ForwardDirectories

JkRequestLogFormat "%w %V %T"

JkMount /*.jsp controller 聽聽//灏嗘墍鏈塲sp鐨勮姹傝浆鍙戠粰controller锛堣礋杞藉潎琛℃帶鍒跺櫒锛

淇敼apache鐨勯厤缃枃浠秇ttpd.conf

i.聽聽聽聽聽聽 鍦―irectoryIndex涓坊鍔爄ndex.jsp

ii.聽聽聽聽聽 淇敼DocumentRoot鐩綍涓巘omcat鐩綍涓€鑷淬€備负锛?usr/local/tomcat/webapps

淇濆瓨閫€鍑猴紒閲嶅惎apache鏈嶅姟銆

璋冨害鍣↗K鐨勯厤缃細

#vim /usr/local/tomcat/conf/jk/workers.properties聽聽 \\鏁村悎閰嶇疆鏂囦欢

workers.tomcat_home=/usr/local/tomcat

workers.java_home=/usr/java/jdk1.6.0_20

ps=/

worker.list=controller聽聽

#鎸囧畾璐熻浇鍚嶏紝杩欎釜鍚嶅瓧鍙嚜瀹氫箟锛屼絾瑕佷笌涓嬮潰鐨剋ork.controller.type=lb瀵瑰簲

#---------tomcat1---------------聽绗竴鍙皌omcat鐨勯厤缃

worker.tomcat1.port=8009

worker.tomcat1.host=localhost聽聽聽聽聽聽聽聽聽 //姝ゅ鍙互鍐欐湰鏈篒P锛?92.168.2.4锛

worker.tomcat1.type=ajp13聽聽聽聽聽聽聽聽聽聽 //浣跨敤鐨勫崗璁產jp13

worker.tomcat1.lbfactor=1聽聽聽聽聽聽 聽聽聽聽 //鏉冮噺锛屾暟鍊艰秺澶э紝鍒嗛厤鐨勫嚑鐜囪秺灏

#worker.tomcat1.redirect=tomcat2聽聽聽 //瀹氫箟tomcat1瀹炰緥濡傛灉鎸傛帀锛岀敱tomcat2瀹炰緥鎺ユ浛tomcat1

#---------tomcat2---------------

worker.tomcat2.port=8009

worker.tomcat2.host=192.168.2.5聽聽聽聽聽聽聽 //鍙︿竴鍙皌omcat鐨処P鍦板潃

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

#woker.tomcat2.local_worker=0

#worker.tomcat2.activation=disabled

#浠ヤ笂娉ㄩ噴鎺夌殑涓よ濡傛灉寮€鍚紝鍒檛omcat2鎴愪负tomcat1鐨勫鐢紝鍦╰omcat1涓嶅彲鐢ㄧ殑鎯呭喌涓嬫墠浼氬悜tomcat2璇锋眰銆

#--------controller------------- 璐熻浇鍧囪 鍣

worker.controller.type=lb

worker.controller.balance_workers=tomcat1,tomcat2

#鍚則omcat閰嶇疆鏂囦欢server.xml閲岀殑jvmRoute="tomcat1"绛夋寚瀹氱殑鍚嶅瓧锛岄渶瑕佸悇鑷慨鏀逛竴涓嬨€

worker.controller.sticky_session=1

鍒版澶勶紝宸插彲瀹炵幇tomcat鐨勮礋杞藉潎琛★紒鍙互灏唗omcat鐨勪富椤垫枃浠秈ndex.jsp绋嶄綔淇敼锛岀劧鍚庡湪娴忚鍣ㄤ腑杈撳叆http://192.168.2.4杩涜娴嬭瘯锛屽彲浠ュ緢娓呮櫚鐨勭湅鍒帮紝姣忔鍒锋柊鍚庣殑椤甸潰閮戒笉涓€鏍凤紝1,2浜ゆ浛鍑虹幇銆

Tomcat 闆嗙兢閰嶇疆锛坰ession鍚屾锛夛細

i.聽聽聽聽聽聽 淇敼192.168.2.4涓璽omcat鐨勯厤缃枃浠秙erver.xml

#vim /usr/local/tomcat/conf/server.xml

ii.聽聽聽聽聽 淇敼192.168.2.5涓璽omcat鐨勯厤缃枃浠秙erver.xml

娉紝鍐呭淇℃伅鏄細

聽聽聽 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

聽聽 聽聽聽<!--For clustering, please take a look at documentation at:

聽聽聽聽聽聽聽聽聽 /docs/cluster-howto.html聽(simple how to)

聽聽聽聽聽聽聽聽聽 /docs/config/cluster.html (reference documentation) -->

聽聽聽聽聽 <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"

聽聽聽聽聽聽聽 mcastBindAddress="192.168.2.4"

聽聽聽聽聽聽聽 mcastAddr="224.0.0.1"

聽聽聽聽聽聽聽 port="45564"

聽聽 聽聽聽聽聽frequency="500"

聽聽聽聽聽聽聽 dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

聽聽聽聽聽聽聽 tcpListenAddress="192.168.2.4"

聽聽聽聽聽聽聽 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>

淇濆瓨閫€鍑猴紒

娉ㄦ剰浜嬮」锛歮castAddr="224.0.0.1"闇€瑕佸紑鍚綉鍗$粍鎾姛鑳

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0锛堝彲浠ユ坊鍔犺嚦寮€鏈哄惎鍔級

Session澶嶅埗閰嶇疆

Tomcat闆嗙兢涓殑session绠$悊锛屼富瑕佹湁涓ょ鏂瑰紡锛

1.聽绮樻€ession

琛ㄧず浠庡悓涓€绐楀彛鍙戞潵鐨勮姹傞兘灏嗘湁闆嗙兢闆嗙兢涓悓涓€tomcat杩涜澶勭悊銆傞厤缃柟寮忔槸鍦ㄤ笂闈orker.properties鏂囦欢涓唬鐮亀orker.controller.sticky_session=1

绮樻€ession鐨勫ソ澶勬槸涓嶄細鍦ㄤ笉鍚岀殑tomcat涓婃潵鍥炶烦鍔ㄥ鐞嗚姹傦紝浣嗘槸鍧忓鏄鏋滆session鐨則omcat宕╂簝锛岄偅涔堜箣鍚庣殑璇锋眰灏嗙敱鍏朵粬tomcat澶勭悊锛屽師鏈塻ession澶辨晥鑰岄噸鏂板缓涓€涓柊鐨剆ession锛岃繖鏍峰鏋滅户缁粠session鍙栧€硷紝浼氭姏鍑簄ullpointer鐨勮闂紓甯搞€

2.聽session澶嶅埗

session澶嶅埗鏄寚tomcat褰兼涔嬮棿閫氳繃缁勬挱鏂瑰紡灏唖ession鍙戦€佸悇涓猼omcat瀹炰緥涓婏紝濡傛灉鍏朵腑涓€涓闂嚭閿欙紝鍒欏彟澶杢omcat浠嶇劧鍏锋湁鏈夋晥鐨剆ession鍐呭锛屼粠鑰岃兘姝e父鎺ョ鍏秙ession銆傚潖澶勬槸tomcat瀹炰緥寰堝鎴栬€呯敤鎴峰湪session涓湁澶ч噺鎿嶄綔鏃讹紝缁勬挱鍙戦€佺殑淇℃伅閲忓崄鍒嗘儕浜恒€係ession澶嶅埗閰嶇疆鍒欐槸鍦ㄥ彂甯冪殑WEB搴旂敤绋嬪簭涓殑web.xml涓坊鍔爔ml浠g爜<distributable/>

3.鏌ョ湅

[root@Client apache_tomcat]# netstat -tnlp

tcp聽0聽0 聽192.168.2.4:4001聽聽聽聽聽聽聽 聽聽聽聽0.0.0.0:*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LISTEN聽聽聽聽聽 1990/java聽聽聽聽聽

4.淇敼搴旂敤绋嬪簭鐨剋eb.xml鏂囦欢

Web.xml閰嶇疆鏂囦欢鍔犱笂<distributable/>鑺傜偣锛屾閰嶇疆璇存槑褰撳墠web宸ョ▼澶勪簬鍒嗗竷寮忛儴缃茬幆澧冿紝濡傛灉涓嶈繘琛岃繖涓厤缃紝姣忔璁块棶椤甸潰tomcat閮戒細浜х敓涓€涓柊鐨剆essionid銆

鍦?lt;/web-app>涔嬪墠鍔犱笂<distributable/>鐢ㄤ簬session澶嶅埗銆

#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml

聽<description>

聽聽聽聽 Welcome to Tomcat

聽</description>

<distributable/>

</web-app>

5.鍦╳ebapps鐩綍涓嬪垱寤虹洰褰晅est銆佸湪test涓垱寤簆rint.jsp涓巘est.jsp

#vim /usr/local/tomcat/webapps/test/print.jsp

<%

聽聽聽 System.out.println(wjpinrain.blog.51cto.com);

%>

#vim /usr/local/tomcat/webapps/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");

聽 session.setAttribute("myname","session?");

聽 if (dataName != null && dataName.length() > 0) {

聽聽聽聽 String dataValue = request.getParameter("dataValue");

聽聽聽聽 session.setAttribute(dataName, dataValue);

聽 }

聽 out.print("<b>Session P卤?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="index.jsp" method="POST">

聽聽聽 没鲁?<input type=text size=20 name="dataName">

聽聽聽聽 <br>

聽聽聽 ?:<input type=text size=20 name="dataValue">

聽聽聽 <input type=submit>

聽聽 </form>

</body>

</html>

娉細鍦ㄤ袱鍙版湇鍔″櫒涓婂潎鍋氭涓や釜鏂囦欢锛屼慨鏀箇eb.xml銆

閲嶅惎鎵€鏈夋湇鍔°€

璁块棶锛歨ttp://192.168.2.4/test/test.jsp

Server Info: 192.168.2.4 : 80

ID 58EDB92B320CFFD0DDE8EE948CB22DC8.tomcat1

姝ゆ椂鎴戝皢tomcat1鍋滄鏈嶅姟鍐嶅埛鏂扮綉椤

ID 58EDB92B320CFFD0DDE8EE948CB22DC8.tomcat2

鍙互鐪嬪嚭褰撳叾涓竴鍙皌omcat鍋滄杩愯鍚庯紝鍒锋柊鍚巗ession鍊间笉鍙橈紝浣嗘彁渚涜鏈嶅姟鐨勬湇鍔″櫒宸叉洿鎹负tomcat2.

鍒版session鍚屾宸插畬鎴愶紒

继续阅读