Tomcat创建并运行多个实例

问题与需求

  平常,我们把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_HOMECATALINA_BASE所代表的目录进行实现。

深入了解Tomcat

  首先要了解一些概念那才开始讲实际操作,如果急着用那直接看实操也行,但我觉得概念和实操两者之间是相辅相成的,实操固然重要,但概念可以帮助我们更加深入地理解实操的本质,同时实操也能让我们对概念有更深刻的印象。

两个重要的环境变量

  • $CATALINA_HOMETomcat安装所在的根目录

    • 官方文档描述

      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

    比如:你的Tomcatapache-tomcat-8.5.16安装在D:\tomcat_server\内,那么$CATALINA_HOME指代的就是D:\tomcat_server\apache-tomcat-8.5.16

  • $CATALINA_BASETomcat运行实例所在的根目录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 to CATALINA_HOME.

    • 渣翻

      Tomcat可以通过为每个实例定义$CATALINA_BASE为多个实例进行配置。
      如果Tomcat没有配置多个实例,那么$CATALINA_BASE$CATALINA_HOME是一样的。

      CATALINA_BASE环境变量指定Tomcat”活动配置”的根目录的位置。这个环境变量的配置时可选的,它的默认值等于CATALINA_HOME的配值。

    更直白地说,默认情况下Tomcat的安装目录和工作目录是一致的,但也可以将它们分离,并且工作目录可以有多个,代表多个Tomcat实例。