问题与需求
平常,我们把Web应用往Tomcat的安装目录一丢,就算是部署完成了,非常简单,只是一个手工操作,无过多技术可言。但这只是在开发或测试的时候是这么玩玩,到了真正运用Tomcat运行项目的时候,就并不是这样了。
资源利用率问题&Tomcat单实例问题
在实际中,一台服务器基本都要物尽所用:服务器有多少资源那就尽量利用多少,有过多的空闲那就是等于浪费。更具体地可以说是一个服务器单独运行一个非常耗费资源的大项目,或一个服务器同时运行多个小项目。这是一个关于服务器资源利用率的问题。
把这些情况代入到具体运用Tomcat的情景。按照最普通的做法就是一个服务器只运行一个Tomcat实例,并且在里面部署了单个Web大应用或多个Web小应用。乍看之下,光运用单个Tomcat实例,之前的服务器资源利用率问题好像得到解决了。Tomcat单实例可以很好地适应前者,因为只是在Tomcat单独地运行一个Web大应用,只单独针对一个点,Tomcat版本升级、资源配置等操作就很好办了;但这种做法对于后者就不大适用了,试想一下,在Tomcat单实例下部署了5个Web小应用,这5个应用运行时所需的内存等资源都是各不相同的,但Tomcat的配置只能为指定的Tomcat实例进行配置,所以说这种解决方案仍不算可靠。不过问题缩小了:Tomcat单实例问题。
有瑕疵的解决方案
既然Tomcat单实例无法100%有效地解决问题并实现需求。那么很自然地想到,那必须得实现Tomcat多实例才行。
我们都清楚Tomcat安装目录自身其实就是一个Tomcat实例(默认情况下$CATALINA_BASE
和$CATALINA_HOME
是等价的,这是关于它们的简单描述),所以最简单的做法就是复制Tomcat的安装目录,然后在每一个Tomcat实例里的conf\server.xml
都给配置上不同的端口,这就形成了多个独立的Tomcat实例,接着每个实例里面只部署一个Web应用。具体步骤:
- 复制完整的Tomcat安装目录,这就相当于创建了一个新的Tomcat实例(复制量根据所要部署的Web应用数量而定)
修改每一个Tomcat实例里的
conf/server.xml
文件的这些端口:<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
每一个
port
属性你想改成什么都行,但它们必须是唯一的。将Web应用部署到你所想要部署到的Tomcat实例上
根据所每个Web应用所需而为对应Tomcat实例进行配置。
现在,确实是实现Tomcat多实例了,每一个实例里部署一个应用,并为这个应用进行所需的配置。资源利用率问题和Tomcat单实例问题都得到解决了,然而这种解决方案有一个缺陷:这多个Tomcat实例都是完全独立的没有任何关联,进而引发这些问题:
- Tomcat版本升级问题。
如果需要进行Tomcat版本升级,那么我们无法1次性对所有实例进行升级,实例数量越多越麻烦 - 全局配置问题。
如果需要修改某些配置,并且修改是对所有Tomcat实例要做的,那么我们无法1次性对所有实例的配置进行修改,也是实例越多越麻烦
这种解决方案虽然可以解决之前的问题,但这是牺牲统领全局的便利性而换来的,所以它还是不完美的,然而更好的办法还是有的:
通过分离CATALINA_HOME
和CATALINA_BASE
所代表的目录进行实现。
深入了解Tomcat
首先要了解一些概念那才开始讲实际操作,如果急着用那直接看实操也行,但我觉得概念和实操两者之间是相辅相成的,实操固然重要,但概念可以帮助我们更加深入地理解实操的本质,同时实操也能让我们对概念有更深刻的印象。
两个重要的环境变量
$CATALINA_HOME
:Tomcat安装所在的根目录官方文档描述
This represents the root of your Tomcat installation. When we say, “This information can be found in your
$CATALINA_HOME/README.txt
file” we mean to look at the README.txt file at the root of your Tomcat install.渣翻
这个代表着Tomcat安装所在的根目录。
当我们说:“某些信息能够在你的$CATALINA_HOME/README.txt
中查找到”,
这意指具体去看你的Tomcat安装所在的根目录的README.txt
。
比如:你的Tomcat
apache-tomcat-8.5.16
安装在D:\tomcat_server\
内,那么$CATALINA_HOME
指代的就是D:\tomcat_server\apache-tomcat-8.5.16
$CATALINA_BASE
:Tomcat运行实例所在的根目录 或 Tomcat的工作根目录官方文档描述
Tomcat may be configured for multiple instances by defining
$CATALINA_BASE
for each instance.
If multiple instances are not configured,$CATALINA_BASE
is the same as$CATALINA_HOME
.The
CATALINA_BASE
environment variable specifies location of the root directory of the “active configuration” of Tomcat.
It is optional. It defaults to be equal toCATALINA_HOME
.渣翻
Tomcat可以通过为每个实例定义
$CATALINA_BASE
为多个实例进行配置。
如果Tomcat没有配置多个实例,那么$CATALINA_BASE
与$CATALINA_HOME
是一样的。CATALINA_BASE
环境变量指定Tomcat”活动配置”的根目录的位置。这个环境变量的配置时可选的,它的默认值等于CATALINA_HOME
的配值。
更直白地说,默认情况下Tomcat的安装目录和工作目录是一致的,但也可以将它们分离,并且工作目录可以有多个,代表多个Tomcat实例。