(一) 什么是tomcat多实例部署?
tomcat多实例部署指的是只需要安装一个tomcat服务器软件同时可部署多个应用实例的场景,这样做的好处是:
不需要到处拷贝tomcat软件,减少磁盘空间占用;
当需要升级tomcat版本时,不需要一个个升级,浪费运维成本,只需要在一个地方升级就可以了;
那为什么tomcat能够支持多实例部署?这个需要从tomcat本身的架构来解释。
(二) tomcat架构
1.整体架构图
2.Container容器子容器间关系图
3.交互图
4.tomcat组件间关系图
组件说明:
Container容器包含4个子容器,Engine、Hose、Context、Wrapper;
4个子容器是父子关系,但不是通过继承实现,而是通过组合设置父级容器实现的;
Engine对应Server.xml中的Engine节点、Host对应Server.xml中的Host节点、Context对应Server.xml中的Context节点(或独立的Context.xml文件中);
一个Host标识一个虚拟主机,可以包含由多个Context代表的web应用;
每一个Context代表一个web应用;
Wrapper用于包装Servlet;
(三)Tomcat配置文件与组件关系映射:
知道组件之间的关系,再来看看XML配置文件与组件之间的对应关系就好办多了
Server.xml文件
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
<Context docBase="strutsdemo" path="/strutsdemo" reloadable="true" source="org.eclipse.jst.j2ee.server:strutsdemo"/>
</Host>
</Engine>
</Service>
</Server>
元素与组件对应关系:
Server——Server服务器,代表整个servlet容器,整个配置文件只能有一个,通过配置的端口来控制服务器,整个系统端口不能冲突;
Service ——Service 服务,可以存在多个,但name属性值必须唯一,可以接受多个Connector,但只能映射一个Engine;
Connector ——Connector 组件,负责接收管理客户端的连接,不同类型处理不同的连接类型;
Engine ——Engine 容器,接收和处理该Service下所有Connector的请求,defaultHost属性值必须与某个Host子元素的name属性值相等;
Host ——Host 容器,代表一个虚拟主机,用于与外界沟通,可以通过alias别名方式映射多个DNS(域名),即多个域名映射同一个主机,其中appBase属性值是加载应用的跟路径,本身相对于CATALINA_BASE;
Context ——Context 容器,代表一个web应用,可以直接配置在Host元素下面,也可以单独配置在独立路径下面,这个是根据Tomcat对配置文件加载方式和顺序决定的,一个Host下可以配置多个Context;
tomcat加载应用顺序
1)tomcat启动是,由Host加载应用,顺序如下:
a.加载[engine.name]/[host.name]/XXXX-web.xml,其中engine.name是Server.xml中Engine元素的name属性值,honst.name是Host元素的name属性值,XXXX-web.xml代表一个应用的Context元素,
XXXX-web.xml只能配置一个Context元素,且如果Context元素的path属性是空或/跟路径,则可以将文件命名为ROOT.xml;
b.加载Host元素appBase对应目录下的war工程,默认情况下appBase的值是webapps,表示加载该目录下的工程;
c.当Host的appBase目录存在多级目录工程时,进一步加载;
2)Context文件配置时,docBase可配置绝对路径,也可配置相对路径(相对于Host的appBase),当path属性值是多级目录时,如:/foor/bar,则该独立文件应该被命名为:foor#bar.xml,由#代替/命名文件;
3)修改Engine的name或Host的name则启动是可以看到文件路径发生了改变;
(四)关于CATALINA_HOME和CATALINA_BASE的关系
以Tomcat6.0为例,其Tomcat目 录结构如下:
bin (运行脚本)、conf (配置文件)、 lib (核心库文件) 、logs (日志目录)、 temp (临时目录) 、 webapps (自动装载的应用程序的目录)、 work (JVM临时文件目录[java.io.tmpdir])
其中只有 bin 和 lib 目录在多实例部署时被多个tomcat实例公用,其它目录conf、logs、temp、webapps和work 每个Tomcat实例必须拥有其自己独立的备份
所以:
catalina.home(安装目录):指向公用信息的位置,就是bin和lib的父目录。
catalina.base(工作目录):指向每个Tomcat目录私有信息的位置,就是conf、logs、temp、webapps和work的父目录。
(五)多实例部署 在知道了tomcat的架构原理之后就可以部署多实例了,顺序如下
1.安装tomcat软件,路径如下:/usr/local/apache-tomcat-6.0.18
2.拷贝tomcat软件到新的路径目录[/home/test]下作为新实例使用,需要删除其中的bin/lib子目录(公用的不需要),同时在当前目录[/home/test]的conf/Catalina/localhost/xxx-web.xml文件中配置context元素,指向应用所在目录,一般使用绝对路径配置docBase;
3.在当前实例目录下新建一个启动脚本start.sh,设置catalina.home指向/usr/local/apache-tomcat-6.0.18,catalina.base指向当前实例目录[/home/test],启动命令执行/usr/local/apache-tomcat-6.0.18/bin下的启动脚本即可;
4.停止脚本原理同启动脚本stop.sh;
至此,多实例部署已经完成!!!