如何在Ubuntu上配置Tomcat集群?
譯文【51CTO精選譯文】Apache Tomcat可以說是當(dāng)下最受歡迎的開源Java Web服務(wù)器。如果貴公司的網(wǎng)站預(yù)計(jì)會隨著業(yè)務(wù)不斷發(fā)展而迎來更大的訪問量,Tomcat的單個(gè)實(shí)例恐怕無法滿足訪問量日增的需要。這種情況下,你可能會考慮在“集群”環(huán)境下運(yùn)行Tomcat;在這種環(huán)境下,Web服務(wù)器的工作負(fù)載分配到多個(gè)Tomcat實(shí)例。
我在本文中將向大家介紹如何配置具有負(fù)載均衡和會話復(fù)制機(jī)制的Tomcat集群。在我們深入探討配置方面的細(xì)節(jié)之前,有必要闡明本教程中將出現(xiàn)的幾個(gè)術(shù)語。
術(shù)語介紹
負(fù)載均衡:前端服務(wù)器(常常名為“負(fù)載均衡器”、“代理均衡器”或“反向代理”)收到HTTP請求后,前端服務(wù)器將請求分發(fā)到后端的不止一個(gè)“worker”Web服務(wù)器,由它們實(shí)際處理請求。負(fù)載均衡可以消除后端的單一故障點(diǎn),并且可以為任何Web服務(wù)實(shí)現(xiàn)高可用性、高擴(kuò)展性以及更合理的資源優(yōu)化。
會話復(fù)制:會話復(fù)制是一種機(jī)制,將客戶端會話的整個(gè)狀態(tài)原原本本復(fù)制到集群中的兩個(gè)或多個(gè)服務(wù)器實(shí)例,以實(shí)現(xiàn)容錯(cuò)和故障切換功能。通常情況下,分發(fā)的狀態(tài)服務(wù)能夠跨集群中的多個(gè)不同服務(wù)器實(shí)例,復(fù)制客戶端會話的狀態(tài)。
集群:集群由兩個(gè)或多個(gè)Web服務(wù)器實(shí)例組成,這些服務(wù)器實(shí)例步調(diào)一致地工作,透明地處理客戶端請求??蛻舳藢⒁唤M服務(wù)器實(shí)例認(rèn)為是單一實(shí)體服務(wù)。集群的目的是,為客戶端提供高可用性服務(wù),同時(shí)盡量高效地利用所有的可用計(jì)算資源。
具體要求
下面是搭建Tomcat集群的具體要求。我在本教程中假設(shè)有三臺Ubuntu服務(wù)器。
- 服務(wù)器#1:帶mod_jk的Apache HTTP Web服務(wù)器(充當(dāng)代理均衡器)
 - 服務(wù)器#2和服務(wù)器#3:Java運(yùn)行時(shí)6.x或更高版本,以及Apache Tomcat 7.x(充當(dāng)worker Web服務(wù)器)。
 
Apache Web服務(wù)器充當(dāng)代理均衡器。Apache Web服務(wù)器是客戶端唯一看得見的那臺服務(wù)器,所有的Tomcat實(shí)例都被隱藏起來,客戶端看不見它們。mod_jk插件被激活后,Apache Web服務(wù)器將任何入站的HTTP請求轉(zhuǎn)發(fā)到集群中的Tomcat worker實(shí)例。
在本教程的其余部分,我將描述配置Tomcat集群的逐步過程。
第一步:安裝帶mod_jk插件的Apache Web服務(wù)器
Tomcat Connectors讓你可以將Tomcat連接到其他開源Web服務(wù)器。對Apache Web服務(wù)器而言,Tomcat Connectors以一種名為mod_jk的Apache模塊而出現(xiàn)。裝有mod_jk的Apache Web服務(wù)器可以將Ubuntu服務(wù)器變成代理均衡器。想安裝Apache Web服務(wù)器和mod_jk模塊,只要使用下面這個(gè)命令。
$ sudo apt-get install apache2 libapache2-mod-jk
第二步:安裝JDK和Apache Tomcat
下一步就是將Apache Tomcat安裝到另外兩臺Ubuntu服務(wù)器,這兩臺服務(wù)器將作為worker,實(shí)際處理HTTP請求。由于Apache Tomcat需要Java開發(fā)工具包(JDK),你同樣需要安裝它。請參閱這篇指南:http://ask.xmodulo.com/install-apache-tomcat-ubuntu-debian.html,即可了解如何將JDK和Apache Tomcat安裝到Ubuntu服務(wù)器上。
第三步:在代理均衡器上配置Apache mod_jk
在Ubuntu上,mod_jk配置文件位于/etc/apache2/mods-enabled/jk.conf。用下列內(nèi)容更新該文件:
- <IfModule jk_module>
 - # We need a workers file exactly once
 - # and in the global server
 - JkWorkersFile /etc/libapache2-mod-jk/workers.properties
 - # JK error log
 - # You can (and should) use rotatelogs here
 - JkLogFile /var/log/apache2/mod_jk.log
 - # JK log level (trace,debug,info,warn,error)
 - JkLogLevel info
 - JkShmFile /var/log/apache2/jk-runtime-status
 - JkWatchdogInterval 60
 - JkMount /* loadbalancer
 - JkMount /jk-status jkstatus
 - # Configure access to jk-status and jk-manager
 - # If you want to make this available in a virtual host,
 - # either move this block into the virtual host
 - # or copy it logically there by including "JkMountCopy On"
 - # in the virtual host.
 - # Add an appropriate authentication method here!
 - <Location /jk-status>
 - # Inside Location we can omit the URL in JkMount
 - JkMount jk-status
 - Order deny,allow
 - Deny from all
 - Allow from 127.0.0.1
 - </Location>
 - <Location /jk-manager>
 - # Inside Location we can omit the URL in JkMount
 - JkMount jk-manager
 - Order deny,allow
 - Deny from all
 - Allow from 127.0.0.1
 - </Location>
 - </IfModule>
 
為了讓上述配置適用于多個(gè)Tomcat實(shí)例,我們不得不在/etc/libapache2-mod-jk/workers.properties中配置每一個(gè)Tomcat worker實(shí)例。我們假設(shè),兩個(gè)worker Ubuntu機(jī)器的IP地址分別是192.168.1.100和192.168.1.200。
使用下列內(nèi)容,創(chuàng)建或編輯etc/libapache2-mod-jk/workers.properties:
- worker.list=loadbalancer,jkstatus # 為192.168.1.100配置Tomcat實(shí)例
 - worker.tomcat1.type=ajp13
 - worker.tomcat1.host=192.168.1.100
 - worker.tomcat1.port=8081
 - # worker“tomcat1”使用多達(dá)20個(gè)套接字,套接字在連接池中駐留的時(shí)間只有短短10分鐘。
 - worker.tomcat1.connection_pool_size=200
 - worker.tomcat1.connection_pool_timeout=600
 - # worker“tomcat1”將要求操作系統(tǒng)發(fā)送關(guān)于連接的KEEP-ALIVE信號。
 - worker.tomcat1.socket_keepalive=1
 - # 為192.168.1.200配置Tomcat實(shí)例
 - worker.tomcat2.type=ajp13
 - worker.tomcat2.host=192.168.1.200
 - worker.tomcat2.port=8082
 - # worker“tomcat2”使用多達(dá)20個(gè)套接字,套接字在連接池中駐留的時(shí)間只有短短10分鐘。
 - worker.tomcat2.connection_pool_size=200
 - worker.tomcat2.connection_pool_timeout=600
 - # worker“tomcat2”將要求操作系統(tǒng)發(fā)送關(guān)于連接的KEEP-ALIVE信號。
 - worker.tomcat2.socket_keepalive=1
 - worker.jkstatus.type=status
 - worker.loadbalancer.type=lb
 - worker.loadbalancer.balance_workers=tomcat1,tomcat2
 
第四步:配置Tomcat實(shí)例
使用下列內(nèi)容,為地址是192.168.1.100的Tomcat實(shí)例編輯/opt/apache-tomcat-7.0.30/conf/server.xml:
- <Engine name="Catalina" defaultHost="192.168.1.100” jvmRoute="tomcat1">
 - <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">
 - <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
 - <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
 - </Sender>
 - <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="50"/>
 - <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"/>
 - <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
 - <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
 - </Cluster>
 - 使用下列內(nèi)容,為地址是192.168.1.200的Tomcat實(shí)例編輯/opt/apache-tomcat-7.0.30/conf/server.xml:
 - <Engine name="Catalina" defaultHost="192.168.1.200” jvmRoute="tomcat2">
 - <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">
 - <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
 - <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
 - </Sender>
 - <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="30"/>
 - <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"/>
 - <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
 - <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
 - </Cluster>
 
第五步:測試Tomcat集群
Tomcat Connectors有一種特殊類型的worker,那就是所謂的狀態(tài)worker。狀態(tài)worker并不將請求轉(zhuǎn)發(fā)到Tomcat實(shí)例。相反,它允許在運(yùn)行時(shí)獲取狀態(tài)和配置信息,甚至允許動(dòng)態(tài)更改許多配置選項(xiàng)。你可以通過訪問該狀態(tài)worker來監(jiān)測Tomcat集群:只要使用Web瀏覽器,進(jìn)入到http://<proxy-balancer-ip-address>/jk-status,就很容易進(jìn)行監(jiān)測了。
英文:http://xmodulo.com/2014/06/configure-tomcat-cluster-ubuntu.html
















 
 
 





 
 
 
 