Linux下搭建tomcat集群全記錄
1.預(yù)期目標(biāo)
本文將講述如何在Linux下搭建tomcat集群,以及搭建過程中可能的遇到的問題和解決方法。為簡單起見,本文演示搭建的集群只有兩個tomact節(jié)點(diǎn)外加一個apache組成,三者將安裝在同一機(jī)器上:
apache:
安裝路徑:/usr/local/apache2
端口:90
tomcat1:
安裝路徑:/usr/local/apache-tomcat-6.0.33-1
端口:6080
tomcat2:
安裝路徑:/usr/local/apache-tomcat-6.0.33-2
端口:7080
2.所需要軟件列表
apache
當(dāng)前最新版本:2.2.21
本文采用源碼方式安裝,源碼包下載地址:http://labs.renren.com/apache-mirror//httpd/httpd-2.2.21.tar.gz
其他版本下載地址參見:http://httpd.apache.org/download.cgi
tomcat 6
當(dāng)前最新版本:6.0.33
本文使用自解壓的tar.gz包進(jìn)行安裝,下載地址:http://labs.renren.com/apache-mirror/tomcat/tomcat-6/v6.0.33/bin/apache-tomcat-6.0.33.tar.gz
其他版本下載地址參見:http://tomcat.apache.org/download-60.cgi
Apache Tomcat Connector (也就是mod_jk)
當(dāng)前最新版本:JK-1.2.32
本文采用源碼方式安裝,源碼包下載地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.32-src.tar.gz
其他版本下載地址參見:http://tomcat.apache.org/download-connectors.cgi
3.軟件安裝
3.1 安裝apache
1.進(jìn)入下載好的httpd-2.2.21.tar.gz文件所在目錄,執(zhí)行解壓操作:
- tar -zxvf httpd-2.2.21.tar.gz
2.進(jìn)入解壓出的文件夾根目錄:
- cd httpd-2.2.21
3.進(jìn)行編譯參數(shù)配置:
- ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all
關(guān)于configure參數(shù)的更多內(nèi)容可參考:
http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories
4.編譯安裝:
- make
- make install
5.啟動和關(guān)閉apache
完成上述步驟后,apache的安裝就結(jié)束了,通過下面的命令啟動和關(guān)閉apache:
啟動:
- /usr/local/apache2/bin/apachectl start
關(guān)閉:
- /usr/local/apache2/bin/apachectl stop
3.2 關(guān)于在安裝apache過程中報Cannot use an external APR with the bundled APR-util錯誤的解決辦法
有時候,在安裝apache,執(zhí)行./configure操作時會報這個錯誤,解決方法是安裝apache2.2.x自身攜帶的apr,方法為:
1.自源碼安裝目錄httpd-2.2.21進(jìn)入apache2.2.x自帶apr的安裝目錄
- cd srclib/apr
2.安裝apr(此處將之安裝在/usr/local/apr下,如果系統(tǒng)中已經(jīng)安裝apr,可找到安裝目錄進(jìn)行覆蓋)
- ./configure --prefix=/usr/local/apr
- make
- make install
3.安裝apr-util
- ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
- make
- make install
4.使用新安裝的apr重新進(jìn)行apache編譯配置
放回安裝根目錄httpd-2.2.21,執(zhí)行:
- ./configure --prefix=/usr/local/apache2 \
- --enable-mods-shared=all \
- --with-apr=/usr/local/apr \
- --with-apr-util=/usr/local/apr-util/bin
補(bǔ)充:
如果你安裝是apache-2.4以上版本,有以下幾點(diǎn)不同:
1、需要單獨(dú)下載apr和apr-util
apr下載地址: http://mirror.bjtu.edu.cn/apache//apr/apr-1.4.6.tar.bz2
apr-util下載地址:http://mirror.bjtu.edu.cn/apache//apr/apr-util-1.4.1.tar.bz2
2. 此外還需要安裝pcre
去http://pcre.org/下載pcre,解壓進(jìn)入源碼目錄執(zhí)行
- ./configure --prefix=/usr/local/pcre
3. 最后安裝apache時configure需要這樣配置
- ./configure --prefix=/usr/local/apache2 \
- --enable-mods-shared=all \
- --with-apr=/usr/local/apr \
- --with-apr-util=/usr/local/apr-util/bin
- --with-pcre=/usr/local/pcre
#p#
3.3 安裝Apache Tomcat Connector(mod_jk)
1.進(jìn)入下載好的tomcat-connectors-1.2.32-src.tar.gz文件所在目錄,執(zhí)行解壓操作:
- tar -zxvf tomcat-connectors-1.2.32-src.tar.gz
2.進(jìn)入解壓出的文件夾下的native子目錄:
- cd tomcat-connectors-1.2.32-src/native
3.進(jìn)行編譯參數(shù)配置:
- ./buildconf.sh
- ./configure --with-apxs=/usr/local/apache2/bin/apxs \
- --with-java-home=$JAVA_HOME --with-java-platform=2 \
- --enable-jni
4.編譯安裝:
- make
- make install
如果成功結(jié)束,你可以在/usr/local/apache2/modules/下找到mod_jk.so文件。
3.4 安裝tomcat
兩次解壓下載到的apache-tomcat-6.0.33.tar.gz文件至/usr/local/,并分別重命名為apache-tomcat-6.0.33-1和apache-tomcat-6.0.33-2
4.集群配置
4.1 配置tomcat
1.修改端口
對于tomcat配置主要集中在conf/server.xml文件上。首先,鑒于是在同一機(jī)器上運(yùn)行兩個tomcat實例,因此,要對server.xml中配置的所有端口進(jìn)行修改,避免端口被占用,一種簡單而穩(wěn)妥的修改方法是將該文件中出現(xiàn)的所有端口號按一種簡單的規(guī)則統(tǒng)一進(jìn)行改動,比如在原端口號基礎(chǔ)上統(tǒng)一加1000或減1000?;谶@個原則,apache-tomcat-6.0.33-1的連接端口修改為
6080,apache-tomcat-6.0.33-2的連接端口修改為:7080,其他端口配置同樣依照該原則。
2.開啟tomcat集群支持
同樣是在conf/server.xml文件里,進(jìn)行兩處改動:
改動1:為<Engine>設(shè)置jvmRoute
實際上,在server.xml里就有一段現(xiàn)成的帶jvmRoute的<Engine>配置,我們可以參考這段配置為<Engine/>加個jvmRoute就可以了,對于jvmRoute的取值要特別注意:其值必須于后面要提到的mod_jk的workers.properties文件中結(jié)點(diǎn)名相一致!由于那個文件中結(jié)點(diǎn)名為tomcat1和tomcat2,因此,此處我們必須設(shè)定jvmRoute的值為這兩個值之一。關(guān)于這一點(diǎn)在tomcat官方關(guān)于Apache Tomcat Connector的文檔 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 也有明確提及。jvmRoute值會出現(xiàn)在由該結(jié)點(diǎn)創(chuàng)建的session id中,例如:在非集群環(huán)境下,一個sessionid可能是 “xxxxxxxxx” 的格式,而在集群環(huán)境下,如果當(dāng)前結(jié)點(diǎn)的jvmRtomat1oute被配置為tomcat1,那由該結(jié)點(diǎn)生成的sessionid將變成“xxxxxxxxx.tomat1”格式,而mod_jk正是依賴于這個節(jié)點(diǎn)后綴實現(xiàn)sticky session的,也就是把所有后綴是tomat1的請求都發(fā)送給tomat1結(jié)點(diǎn)進(jìn)行處理。
改動2:在<Engine/>中添加關(guān)于集群的配置
在tomcat官方關(guān)于tomcat集群配置的文檔:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 中,有一份默認(rèn)配置:
- <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="4000"
- 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>
- <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>
這份默認(rèn)配置可以滿足大多數(shù)應(yīng)用場景,因此,我們只需要將這份配置復(fù)制到<Engine/>中,tomcat的配置就全部完成了。
#p#
4.2 配置apache
打開apache安裝目錄下的conf/httpd.conf文件,在文件最后追加以下內(nèi)容:
- # Load mod_jk module
- LoadModule jk_module modules/mod_jk.so
- # Specify jk log file.
- JkLogFile /var/log/mod_jk.log
- # Specify jk log level [debug/error/info]
- JkLogLevel info
- # Specify workers.properties, this file tell jk:
- # how many nodes and where they are.
- JkWorkersFile conf/workers.properties
- # Specify which requests should handled by which node.
- JkMount /* controller
關(guān)于mod_jk配置項的詳細(xì)內(nèi)容,可參考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
上述配置中:JkWorkersFile conf/workers.properties 指明由一個workers.properties文件來描述集群結(jié)點(diǎn)的情況,因此,我們需要創(chuàng)建這個workers.properties文件,并放置于conf文件夾下,這個文件的內(nèi)容如下:
- #所有節(jié)點(diǎn)列表,其中controller是一個邏輯結(jié)點(diǎn),負(fù)責(zé)負(fù)載均衡控制,
- #如果JkMount中的URL指定給了controller就表示這個請求會被自動散列到某個物理節(jié)點(diǎn)上。
- #注意:真正負(fù)責(zé)處理請求的tomcat的名稱(這里就是tomcat1,tomcat2)必須于它們在conf/server.xml
- #文件中配置的jvmRout的屬性值是一致的!
- worker.list = controller,tomcat1,tomcat2
- #========tomcat1========
- worker.tomcat1.port=6009 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
- worker.tomcat1.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚慽p地址
- worker.tomcat1.type=ajp13
- worker.tomcat1.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
- #========tomcat2========
- worker.tomcat2.port=7009 #ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
- worker.tomcat2.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚慽p地址
- worker.tomcat2.type=ajp13
- worker.tomcat2.lbfactor = 1 #server的加權(quán)比重,值越高,分得的請求越多
- #========controller,負(fù)載均衡控制器========
- worker.controller.type=lb
- worker.controller.balance_workers=tomcat1,tomcat2 #指定分擔(dān)請求的tomcat,舊版本中的balanced_workers,已不再推薦使用!
- worker.controller.sticky_session=1 #sticky_session為1表示,
- #當(dāng)某一 client的session創(chuàng)建之后,后續(xù)由該客戶端發(fā)起的請求,也就是這個session的所有請求都始終由第一次處理該請求的結(jié)點(diǎn)
- #負(fù)責(zé)處理(除非該結(jié)點(diǎn)掛掉)
到此,所有配置均已完成,啟動兩個tomcat和apache后,將某一應(yīng)用同時部署到兩個tomcat中,通過apache訪問這個應(yīng)用,觀察tomcat后臺打出的日志會發(fā)現(xiàn),請求被隨機(jī)分配給了兩個tomcat交替執(zhí)行。
備注:應(yīng)用程序要為集群所做的準(zhǔn)備
1. 在應(yīng)用程序的web.xml中需要加入:<distributable/>元素
2. session中存放的數(shù)據(jù)(如attribute)必須實現(xiàn)序列化。
參考資源:
tomcat官方關(guān)于tomcat集群配置的文檔:
http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html
tomcat官方關(guān)于Apache Tomcat Connector的文檔
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
apache官方關(guān)于apache的安裝文檔
http://httpd.apache.org/docs/2.2/en/install.html
apache官方關(guān)于configure參數(shù)的文檔
http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories