1.預期目標
本文將講述如何在Linux下搭建tomcat集羣,以及搭建過程當中可能的遇到的問題和解決方法。爲簡單起見,本文演示搭建的集羣只有兩個tomact節點外加一個apache組成,三者將安裝在同一機器上:
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
當前最新版本:2.2.21
本文采用源碼方式安裝,源碼包下載地址:http://labs.renren.com/apache-mirror//httpd/httpd-2.2.21.tar.gz
其餘版本下載地址參見:http://httpd.apache.org/download.cgi
tomcat 6
當前最新版本:6.0.33
本文使用自解壓的tar.gz包進行安裝,下載地址: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)
當前最新版本: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.進入下載好的httpd-2.2.21.tar.gz文件所在目錄,執行解壓操做:
tar -zxvf httpd-2.2.21.tar.gz
2.進入解壓出的文件夾根目錄:
cd httpd-2.2.21
3.進行編譯參數配置:
./configure --prefix=/usr/local/apache2 --enable-mods-shared=all
關於configure參數的更多內容可參考:
http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories
4.編譯安裝:
make
make install
5.啓動和關閉apache
完成上述步驟後,apache的安裝就結束了,經過下面的命令啓動和關閉apache:
啓動:
/usr/local/apache2/bin/apachectl start
關閉:
/usr/local/apache2/bin/apachectl stop
3.2 關於在安裝apache過程當中報Cannot use an external APR with the bundled APR-util錯誤的解決辦法
有時候,在安裝apache,執行./configure操做時會報這個錯誤,解決方法是安裝apache2.2.x自身攜帶的apr,方法爲:
1.自源碼安裝目錄httpd-2.2.21進入apache2.2.x自帶apr的安裝目錄
cd srclib/apr
2.安裝apr(此處將之安裝在/usr/local/apr下,若是系統中已經安裝apr,可找到安裝目錄進行覆蓋)
./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從新進行apache編譯配置
放回安裝根目錄httpd-2.2.21,執行:
./configure --prefix=/usr/local/apache2 \
--enable-mods-shared=all \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/bin
補充:html
若是你安裝是apache-2.4以上版本,有如下幾點不一樣:
java
一、須要單獨下載apr和apr-utilnode
apr下載地址: http://mirror.bjtu.edu.cn/apache//apr/apr-1.4.6.tar.bz2web
apr-util下載地址:http://mirror.bjtu.edu.cn/apache//apr/apr-util-1.4.1.tar.bz2apache
2. 此外還須要安裝pcre
tomcat
去http://pcre.org/下載pcre,解壓進入源碼目錄執行session
./configure --prefix=/usr/local/pcre負載均衡
3. 最後安裝apache時configure須要這樣配置jvm
./configure --prefix=/usr/local/apache2 \
--enable-mods-shared=all \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/bin
tcp
--with-pcre=/usr/local/pcre
3.3 安裝Apache Tomcat Connector(mod_jk)
1.進入下載好的tomcat-connectors-1.2.32-src.tar.gz文件所在目錄,執行解壓操做:
tar -zxvf tomcat-connectors-1.2.32-src.tar.gz
2.進入解壓出的文件夾下的native子目錄:
cd tomcat-connectors-1.2.32-src/native
3.進行編譯參數配置:
./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
若是成功結束,你能夠在/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文件上。首先,鑑因而在同一機器上運行兩個tomcat實例,所以,要對server.xml中配置的全部端口進行修改,避免端口被佔用,一種簡單而穩妥的修改方法是將該文件中出現的全部端口號按一種簡單的規則統一進行改動,好比在原端口號基礎上統一加1000或減1000。基於這個原則,apache-tomcat-6.0.33-1的鏈接端口修改成:6080,apache-tomcat-6.0.33-2的鏈接端口修改成:7080,其餘端口配置一樣依照該原則。
2.開啓tomcat集羣支持
一樣是在conf/server.xml文件裏,進行兩處改動:
改動1:爲<Engine>設置jvmRoute
實際上,在server.xml裏就有一段現成的帶jvmRoute的<Engine>配置,咱們能夠參考這段配置爲<Engine/>加個jvmRoute就能夠了,對於jvmRoute的取值要特別注意:其值必須於後面要提到的mod_jk的workers.properties文件中結點名相一致!因爲那個文件中結點名爲tomcat1和tomcat2,所以,此處咱們必須設定jvmRoute的值爲這兩個值之一。關於這一點在tomcat官方關於Apache Tomcat Connector的文檔 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 也有明確說起。jvmRoute值會出如今由該結點建立的session id中,例如:在非集羣環境下,一個sessionid多是 「xxxxxxxxx」 的格式,而在集羣環境下,若是當前結點的jvmRtomat1oute被配置爲tomcat1,那由該結點生成的sessionid將變成「xxxxxxxxx.tomat1」格式,而mod_jk正是依賴於這個節點後綴實現sticky session的,也就是把全部後綴是tomat1的請求都發送給tomat1結點進行處理。
改動2:在<Engine/>中添加關於集羣的配置
在tomcat官方關於tomcat集羣配置的文檔:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 中,有一份默認配置:
- <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>
這份默認配置能夠知足大多數應用場景,所以,咱們只須要將這份配置複製到<Engine/>中,tomcat的配置就所有完成了。
4.2 配置apache
打開apache安裝目錄下的conf/httpd.conf文件,在文件最後追加如下內容:
- # 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
關於mod_jk配置項的詳細內容,可參考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
上述配置中:JkWorkersFile conf/workers.properties 指明由一個workers.properties文件來描述集羣結點的狀況,所以,咱們須要建立這個workers.properties文件,並放置於conf文件夾下,這個文件的內容以下:
- #全部節點列表,其中controller是一個邏輯結點,負責負載均衡控制,
- #若是JkMount中的URL指定給了controller就表示這個請求會被自動散列到某個物理節點上。
- #注意:真正負責處理請求的tomcat的名稱(這裏就是tomcat1,tomcat2)必須於它們在conf/server.xml
- #文件中配置的jvmRout的屬性值是一致的!
- worker.list = controller,tomcat1,tomcat2
-
- #========tomcat1========
- worker.tomcat1.port=6009 #ajp13 端口號,在tomcat下server.xml配置,默認8009
- worker.tomcat1.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
- worker.tomcat1.type=ajp13
- worker.tomcat1.lbfactor = 1 #server的加權比重,值越高,分得的請求越多
- #========tomcat2========
- worker.tomcat2.port=7009 #ajp13 端口號,在tomcat下server.xml配置,默認8009
- worker.tomcat2.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
- worker.tomcat2.type=ajp13
- worker.tomcat2.lbfactor = 1 #server的加權比重,值越高,分得的請求越多
-
- #========controller,負載均衡控制器========
- worker.controller.type=lb
- worker.controller.balance_workers=tomcat1,tomcat2 #指定分擔請求的tomcat,舊版本中的balanced_workers,已再也不推薦使用!
- worker.controller.sticky_session=1 #sticky_session爲1表示,
- #當某一 client的session建立以後,後續由該客戶端發起的請求,也就是這個session的全部請求都始終由第一次處理該請求的結點
- #負責處理(除非該結點掛掉)
到此,全部配置均已完成,啓動兩個tomcat和apache後,將某一應用同時部署到兩個tomcat中,經過apache訪問這個應用,觀察tomcat後臺打出的日誌會發現,請求被隨機分配給了兩個tomcat交替執行。 備註:應用程序要爲集羣所作的準備 1. 在應用程序的web.xml中須要加入:<distributable/>元素 2. session中存放的數據(如attribute)必須實現序列化。 參考資源: tomcat官方關於tomcat集羣配置的文檔: http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html tomcat官方關於Apache Tomcat Connector的文檔 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html apache官方關於apache的安裝文檔 http://httpd.apache.org/docs/2.2/en/install.html apache官方關於configure參數的文檔 http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories