Tomcat - CATALINA_BASE 和 CATALINA_HOME 变量 在 Tomcat 中,CATALINA_BASE 和 CATALINA_HOME 是两个重要的环境变量。CATALINA_HOME 指向 Tomcat 的安装目录,而 CATALINA_BASE 则指向 Tomcat 实例的基本目录。这些变量在多实例部署和管理中非常有用。

132

我在同一台Linux服务器上运行了多个Tomcat 6实例,目前一切正常。我试图找出关于设置 CATALINA_HOMECATALINA_BASE 变量的标准做法。

在我的Tomcat安装中,我已经将 CATALINA_HOME 设置为指向一个“公共”文件夹(例如 /tomcat6),而 CATALINA_BASE 变量则根据实例名称而变化(例如 /tomcat_instance1, /tomcat_instance2)。

我的问题是:

  • 我真的需要这两个变量吗?
  • 还是我只需要一个 CATALINA_HOME ,然后放弃 CATALINA_BASE (或反之亦然)?

3
这个问题本身就是一个答案。 - Koray Tugay
5
你需要这样做的原因是为了将Tomcat软件的维护(存储在$CATALINA_HOME中)与Tomcat实例的配置和内容的维护(存储在$CATALINA_BASE中)分开。 - reinierpost
6个回答

127

如果您在单个主机上运行多个Tomcat实例,则应将CATALINA_BASE设置为相应的.../tomcat_instance1.../tomcat_instance2目录,并将CATALINA_HOME环境变量设置为两个实例之间共享文件的公共Tomcat安装。

如果您在主机上运行单个Tomcat实例,则CATALINA_BASE环境是可选的,并且在这种情况下将默认为CATALINA_HOME。如果您像您一样运行多个实例,则应提供它。

在Apache Tomcat发行版的根目录下的RUNNING.txt文件中,有一个非常好的描述此设置的部分,标题为高级配置-多个Tomcat实例

另请参阅Apache Tomcat 10/Introduction/CATALINA_HOME和CATALINA_BASE的文档。


1
当在Ubuntu上使用打包的Tomcat时,您的第二段是不正确的。它会将Tomcat软件(位于$CATALINA_HOME)与Tomcat实例(位于$CATALINA_BASE)正确分离。 - reinierpost
此处提供的信息是指由ASF提供的标准Tomcat。不同的分发者可能会决定根据自己的口味进行配置,因此你的体验可能会有所不同。 - Queeg

117

CATALINA_HOMECATALINA_BASE

如果您运行多个Tomcat实例,则需要同时设置这两个环境变量;否则仅需设置CATALINA_HOME即可。

换句话说:CATALINA_HOME是必需的,而CATALINA_BASE是可选的。

CATALINA_HOME代表Tomcat安装的根目录。

可以通过为每个实例定义$CATALINA_BASE来配置Tomcat进行多个实例的操作。如果没有配置多个实例,则$CATALINA_BASE$CATALINA_HOME相同。

详见:Apache Tomcat 7 - Introduction

在RUNNING.txt文件中记录了单独运行CATALINA_HOMECATALINA_BASE的方法,其中写道:

CATALINA_HOMECATALINA_BASE环境变量用于分别指定Apache Tomcat的位置和其活动配置的位置。

不能在setenv脚本中配置CATALINA_HOMECATALINA_BASE变量,因为它们用于查找该文件。

例如:

(4.1) 可以通过执行以下命令中的任意一个来启动Tomcat:

  %CATALINA_HOME%\bin\startup.bat         (Windows)

  $CATALINA_HOME/bin/startup.sh           (Unix)
或者
  %CATALINA_HOME%\bin\catalina.bat start  (Windows)

  $CATALINA_HOME/bin/catalina.sh start    (Unix)

多个Tomcat实例

在许多情况下,希望在同一台服务器上的多个用户之间共享一个Tomcat二进制分发的副本。为了实现这一点,可以将CATALINA_BASE环境变量设置为包含“个人” Tomcat 实例文件的目录。

当使用不同的CATALINA_HOMECATALINA_BASE运行时,文件和目录被分成以下部分:

CATALINA_BASE中:

  • bin - 只有 setenv.bat (Windows) 或 setenv.sh (*nix),tomcat-juli.jar
  • conf - 服务器配置文件(包括 server.xml)
  • lib - 库和类,如下所述
  • logs - 日志和输出文件
  • webapps - 自动加载的 Web 应用程序
  • work - Web 应用程序的临时工作目录
  • temp - JVM 用于临时文件的目录

CATALINA_HOME中:

  • bin - 启动和关闭脚本
  • lib - 库和类,如下所述
  • endorsed - 覆盖标准“认可标准”的库。默认情况下不存在。

如何检查

检查你的CATALINA_BASECATALINA_HOME最简单的方法是运行startup.sh,例如:

$ /usr/share/tomcat7/bin/startup.sh
Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7

您还可以通过以下方式检查Tomcat文件的安装位置(Debian / Ubuntu):dpkg 工具:

dpkg -L tomcat7-common

10
这个答案比被采纳的答案好得多。解释得非常清楚。 - syncdk
1
请解释如何使用不同的CATALINA_BASE启动多个Tomcat实例? - Mark
1
CATALINA_BASE和CATALINA_HOME必须设置为系统变量:Windows:set CATALINA_BASE=path - Mark

13
CATALINA_BASE 指向与 CATALINA_HOME 不同的目录,可以将配置目录与二进制目录分开。默认情况下,CATALINA_BASE(配置)和 CATALINA_HOME(二进制)指向相同的文件夹,但是将配置与二进制分开可以帮助您在不重复二进制的情况下同时运行多个Tomcat实例。当您想要更新二进制文件时,这也非常有用,而无需修改或备份/恢复Tomcat的配置文件。

2018年更新

现在有一种更简单的方法使用 makebase 工具设置 CATALINA_BASE。我发表了一篇教程,涵盖了这个主题 http://blog.rasia.io/blog/how-to-easily-setup-lucee-in-tomcat.html,以及一个视频教程 https://youtu.be/nuugoG5c-7M

原始答案继续如下:

要使用此功能,只需创建配置目录并使用CATALINA_BASE环境变量指向它。您需要将一些文件放入该目录中:
  • 从原始Tomcat安装目录中复制conf目录及其内容,并确保Tomcat具有读取权限。根据您的需求编辑配置文件。
  • 如果conf/logging.properties指向${catalina.base}/logs,则创建logs目录,并确保Tomcat具有读写权限。
  • 如果未覆盖默认值$CATALINA_TMPDIR(指向${CATALINA_BASE}/temp),则创建temp目录,并确保Tomcat具有写入权限。
  • 创建一个默认为${CATALINA_BASE}/workwork目录,并确保Tomcat具有写入权限。

1
好答案!特别是关于如何手动构建/创建CATALINA_BASE的部分。 - Marco Schoolenberg

11

我不能说我知道最佳实践,但这是我的观点。

是否在使用这些变量来做什么?

个人而言,无论是在开发还是生产环境中,无论是Linux还是Windows,我都没有需要更改它们的情况。除非您正在进行依赖于它们的特定操作,否则您可以将它们保持原样。

catalina.sh设置了Tomcat直接工作所需的变量。它还指出CATALINA_BASE是可选的:

#   CATALINA_HOME   May point at your Catalina "build" directory.
#
#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
#                   of a Catalina installation.  If not present, resolves to
#                   the same directory that CATALINA_HOME points to.

当你启动服务器时,我相信你会知道你的设置是否有效。


你能否在\bin\catalina.sh文件中为两个Tomcat实例设置catalina_home路径? - Giri

2

CATALINA_BASE是可选的。

然而,在以下情况下,设置与CATALINA_HOME分开的CATALINA_BASE有助于解决问题:

  1. 当同一主机上运行多个Tomcat实例时

    • 这有助于只安装一个Tomcat运行时,多个CATALINA_BASE服务器配置运行在不同的端口上。
    • 如果需要进行任何补丁或版本升级,则只需更改1次安装或需要进行测试/验证/签署。
  2. 责任分离(单一职责)

    • Tomcat运行时是标准的,并且在每个发布过程中不会更改。即Tomcat二进制文件
    • 发布过程可能会添加更多内容作为Web应用程序(webapps文件夹),环境配置(conf目录),日志/临时/工作目录

-6

这是包含 tomcat.exe 文件的 bin 文件夹的父文件夹:

CATALINA_HOME='C:\Program Files\Apache Software Foundation\Tomcat 6.0'

CATALINA_BASECATALINA_HOME 是相同的。


2
你的回答有误导性... 正确的回答应该是 如果没有配置多个实例,$CATALINA_BASE 与 $CATALINA_HOME 相同,根据文档 - Edward J Beckett
1
CATALINA_BASE只有在运行根实例时等于CATALINA_HOME。当您拥有多个实例时,它将是不同的。 - splatch
1
我认为即使您只有一个实例,CATALINA_BASE和CATALINA_HOME也应该不同。这样,您的内容就与安装分开了。例如,CATALINA_HOME在/usr/share/tomcat中,而CATALINA_BASE在/var/lib/tomcat中。 - user1725779
无论多少实例,返回的编号可能相同,也可能不同。 - Andrey Regentov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接