在构建真实的应用程序时,您经常发现自己必须处理软件的不同阶段。 最常见的阶段是开发,测试和生产,但是您可以拥有更多。 这意味着您需要一个不同的环境才能在当前每个阶段中部署应用程序。 您使用不同的环境来执行版本控制,不同的配置,测试错误修复等。 这也给升级环境,更改共享配置或跟踪服务器带来了挑战。 我将向您展示如何使用Tomcat进行操作 。
设置多个Tomcat实例的最简单方法是复制整个Tomcat文件夹并更改一些配置。 我不建议这样做,因为它更难维护,更难启动新实例且更难升级。 取而代之的是,我们将通过仅复制一些内容并为所有实例保留一个共享的基本文件夹,以更加灵活的方式设置实例。
安装
我使用的是7.0版,但它也可以与其他版本一起使用。 我也在类似Unix的环境中进行设置。 这也可以在Windows框中完成,但是需要调整命令。
将安装文件夹解压缩到您选择的目录中。 我只建议在父文件夹中执行此操作,您可以使用tomcat
或server
类的名称。
现在,我们不使用解压缩的文件夹,而是要创建一个指向它的链接,如下所示: ln -s apache-tomcat-7.0.64/ current
这是一个示例:
Tomcat安装
radcortez:tomcat radcortez$ pwd
/usr/local/share/java/tomcat
radcortez:tomcat radcortez$ ln -s apache-tomcat-7.0.64/ current
radcortez:tomcat radcortez$ ls
total 8
drwxr-xr-x 4 radcortez admin 136B Sep 24 01:49 .
drwxr-xr-x@ 26 radcortez admin 884B Sep 24 01:38 ..
drwxr-xr-x 13 radcortez admin 442B Sep 24 01:45 apache-tomcat-7.0.64
lrwxr-xr-x 1 radcortez admin 21B Sep 24 01:49 current -> apache-tomcat-7.0.64/
radcortez:tomcat radcortez$
设定
为简单起见,我们将创建两个实例: development
和production
。 但是请记住,可以通过对脚本进行必要的调整来创建任意数量的内容。
资料夹
创建一个现在命名为instances
或environments
的文件夹。 在内部,创建一个名为development
的文件夹:
Tomcat实例
radcortez:tomcat radcortez$ mkdir instances
radcortez:tomcat radcortez$ cd instances/
radcortez:instances radcortez$ mkdir development
radcortez:instances radcortez$ ls
total 0
drwxr-xr-x 4 radcortez admin 136B Sep 24 01:56 .
drwxr-xr-x 5 radcortez admin 170B Sep 24 01:56 ..
drwxr-xr-x 2 radcortez admin 68B Sep 24 01:56 development
radcortez:instances radcortez$ pwd
/usr/local/share/java/tomcat/instances
radcortez:instances radcortez$
现在,将文件夹conf
, logs
, temp
, webapps
和work
从Tomcat安装文件夹复制到development
和production
:
Tomcat实例设置
radcortez:instances radcortez$ ls
total 0
drwxr-xr-x 4 radcortez admin 136B Sep 24 02:06 .
drwxr-xr-x 5 radcortez admin 170B Sep 24 01:56 ..
drwxr-xr-x 2 radcortez admin 68B Sep 24 02:06 development
drwxr-xr-x 2 radcortez admin 68B Sep 24 02:06 production
radcortez:instances radcortez$ cp -rf ../current/conf/ development/conf
radcortez:instances radcortez$ cp -rf ../current/logs/ development/logs
radcortez:instances radcortez$ cp -rf ../current/temp/ development/temp
radcortez:instances radcortez$ cp -rf ../current/webapps/ development/webapps
radcortez:instances radcortez$ cp -rf ../current/work/ development/work
radcortez:instances radcortez$ ls development/
total 0
drwxr-xr-x 7 radcortez admin 238B Sep 24 02:08 .
drwxr-xr-x 4 radcortez admin 136B Sep 24 02:06 ..
drwxr-xr-x 9 radcortez admin 306B Sep 24 02:07 conf
drwxr-xr-x 2 radcortez admin 68B Sep 24 02:07 logs
drwxr-xr-x 3 radcortez admin 102B Sep 24 02:08 temp
drwxr-xr-x 7 radcortez admin 238B Sep 24 02:08 webapps
drwxr-xr-x 2 radcortez admin 68B Sep 24 02:08 work
radcortez:instances radcortez$
如果需要,您现在可以从Tomcat安装文件夹中删除这些文件夹,但这不是强制性的。
家和基地
这里的想法是共享主要的Tomcat文件夹,并且每个实例都有其个人文件夹的副本,以免彼此冲突。 Tomcat定义了两个称为CATALINA_HOME
和CATALINA_BASE
环境变量,它们允许我们执行此操作。
在实例development
创建一个bin
文件夹。 添加以下exec.sh
脚本:
可执行文件
#!/bin/bash
TOMCAT_HOME="$(dirname $0)/.."
cd $TOMCAT_HOME && TOMCAT_HOME=$PWD && cd - &> /dev/null
export TOMCAT_HOME
export CATALINA_HOME="$(readlink -f "$TOMCAT_HOME/../../current")"
export CATALINA_BASE="$(readlink -f "$TOMCAT_HOME")"
export CATALINA_OPTS="-Dhttp.port=8080 $CATALINA_OPTS"
export CATALINA_OPTS="-Dhttps.port=8443 $CATALINA_OPTS"
export CATALINA_OPTS="-Dajp.port=8009 $CATALINA_OPTS"
export CATALINA_OPTS="-Dshutdown.port=8005 $CATALINA_OPTS"
echo "JAVA_HOME set to $JAVA_HOME"
echo "CATALINA_BASE set to $CATALINA_BASE"
echo "CATALINA_HOME set to $CATALINA_HOME"
$CATALINA_HOME/bin/"$(basename "$0")" "$@"
注意:如果使用的是MacOSX,则可能需要使用brew
安装core-utils
readlink
,并用readlink
替换greadlink
以获得正确的性能。
该脚本将设置适当的配置变量,以指向我们的共享Tomcat和特定的实例文件夹。 请注意,属性http.port
, https.port
, ajp.port
和shutdown.port
包含在CATALINA_OPTS
环境变量中。 通过这些,我们可以将特定的配置传递到server.xml
文件。 只要您拥有适当的占位符, Tomcat就足够聪明地执行属性替换替换。
档案
所有这些操作都在development
文件夹实例中执行。
conf / server.xml
编辑文件conf/server.xml
进行以下更改;
更换 | 通过 |
---|---|
8080 | $ {http.port} |
8443 | $ {https.port} |
8009 | $ {ajp.port} |
注意:不幸的是,唯一无法进行属性替换的地方是关闭端口。 我认为这是Tomcat中的错误,应予以修复。 因此,现在,我们需要对其进行硬编码。
bin / exec.sh
在bin文件夹上,创建指向exec.sh
的以下文件的链接: catalina.sh
, startup.sh
, shutdown.sh
。
Tomcat Bin脚本
radcortez:bin radcortez$ ln -s exec.sh catalina.sh
radcortez:bin radcortez$ ln -s exec.sh startup.sh
radcortez:bin radcortez$ ln -s exec.sh shutdown.sh
radcortez:bin radcortez$ ls
total 32
drwxr-xr-x 6 radcortez admin 204B Sep 24 10:14 .
drwxr-xr-x 8 radcortez admin 272B Sep 24 08:07 ..
lrwxr-xr-x 1 radcortez admin 7B Sep 24 10:13 catalina.sh -> exec.sh
-rw-r--r-- 1 radcortez admin 651B Sep 24 09:32 exec.sh
lrwxr-xr-x 1 radcortez admin 7B Sep 24 10:14 shutdown.sh -> exec.sh
lrwxr-xr-x 1 radcortez admin 7B Sep 24 10:13 startup.sh -> exec.sh
radcortez:bin radcortez$
这将允许您调用原始的Tomcat ,但是可以先调用设置的exec.sh
魔术是通过exec.sh
脚本中的$CATALINA_HOME/bin/"$(basename "$0")" "$@"
行exec.sh
。
跑
该实例应准备好执行。 只要从development
实例文件夹中执行sh catalina.sh run
或sh startup.sh
,就可以像通常那样运行它。
其他实例
只需将development
实例文件夹复制到production
文件夹中,然后编辑bin/exec.sh
以使用不同的端口bin/exec.sh
进行更新。 您可以将7080用于http,将7443用于https,将7009用于ajp,将7005用于关机。
由于关闭端口的属性替换无法正常工作,因此我们需要在production
实例中手动编辑conf/server.xml
并将7005替换为7005。修复此错误并实际使用属性后,您将不必担心这样做。
注意:您可能需要在bin
文件夹中存储的脚本catalina.sh
, startup.sh
和shutdown.sh
重建正确的链接。
之后,您的第二实例production
就可以运行了。 如果需要更多功能,只需重复最后的步骤,并确保选择与已设置的实例不冲突的端口。
津贴
通过此设置,您现在可以:
- 只需最少的更改即可轻松创建新实例。 实际上,您可以拥有一个不变的不变实例,您可以使用该实例进行复制以创建其他实例。
- 仅通过安装新发行版并将链接更新为
current
更新Tomcat版本。 - 如果将jars放在
HOME
安装的libs
文件夹中,它们将立即对所有实例可用。 - 实际上,您可以链接到
HOME
的一个文件夹,也可以在所有环境之间共享配置,而不是复制conf
文件夹。 或者只是链接到您要共享的文件。 - 只需删除实例的
BASE
文件夹即可删除该实例。 - 也适用于TomEE !
备择方案
如果您不喜欢此设置,则可以尝试使用Docker 。 检查以下文章: 进入Docker 。
让我知道这对您是否有用,或者在按照博客说明进行操作时遇到任何麻烦!
翻译自: https://www.javacodegeeks.com/2015/09/multiple-tomcat-instances.html