Tomcat单机多实例部署

原文阅读地址

http://118.25.172.253/2018/11/28/Tomcat单机多实例部署/

介绍

tomcat相信大家都很熟悉了,web开发中经常会用到tomcat。

我们也大概知道tomcat的工作原理,tomcat启动的时候,会绑定系统的一个端口,来监听http请求。

当我们只有一个web应用的时候,使用一个tomcat看起来没有什么问题。

那么,当我们一台服务器内有多个应用呢?

有人会说,把应用打成war包都放在tomcat的webapp目录下,然后tomcat启动后,根据 http://localhost:8080/应用名/来访问。

这样虽然可以,但这样做的后果是 多个应用公用了一个公网端口。

如果多个应用是互相之间有调用关系的微服务呢?那这些应用公用一个端口无疑是不可取的。。

如果想不公用一个端口,也可以在机器上安装多个tomcat啊。每个应用都独立使用一个tomcat,那么,这样就让每个应用独自绑定了一个端口。

这样做虽然解决了问题,但是非常不好的,甚至可以说是愚蠢的。如果服务器配置非常好,可以在上面跑数十个应用,那么,我们也需要安装数十个tomcat?

如果真的这样做,那么极大的浪费了系统资源,也使得之后的运维变得麻烦起来。

针对这样的问题,其实Apache官方已经给出了一种解决方案,也就是如下的单机多实例部署。

单机多实例部署

原理

首先,我们知道tomcat有如下目录:

每个目录的作用就不解释了,请自行百度。

进入tomcat的官网,我们可以找到如下这段话

Throughout the docs, you'll notice there are numerous references to CATALINA_HOME. This represents the root of your Tomcat installation. When we say, "This information can be found in yourCATALINA_HOME/README.txt file" we mean to look at the README.txt file at the root of your Tomcat install. Optionally, 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.

这段话的最后的意思是:我们可以为多个实例配置tomcat,方法是为每个实例定义$CATALINA_BASE.如果没有配置多个实例,则$CATALINA_BASE$CATALINA_HOME相同。

这里先解释一下,$CATALINA_BASE$CATALINA_HOME,见下图:

tomcat里面的目录分为$CATALINA_BASE$CATALINA_HOME

$CATALINA_BASE 是tomcat运行的基础目录,里面包含了tomcat的一些命令和依赖包。

$CATALINA_HOME可以理解为是存储我们应用相关信息的目录,我们可以修改$CATALINA_HOME/conf/server.xml配置,来进行每个实例的定制配置。

所以tomcat单机多实例部署的核心 就是多个$CATALINA_HOME 共享一个$CATALINA_BASE

实现

那我们怎么进行多实例部署呢?

简单的很,几个步骤就完事了。。

  • 下载tomcat的安装包,解压到服务器。
  • 进入tomcat解压后的目录,将CATALINA_BASE相关的目录复制出来,并新建一个目录存储,我们暂且将这个目录称为base_container
  • base_container里新建一个目录bin,编写启动实例脚本和关闭实例脚本。脚本在后面会给出来
  • 经过上面两个步骤,tomcat解压后的目录就成了$CATALINA_HOME,而base_container就成了$CATALINA_BASE
  • 如果我们有应用A和应用B需要部署,那么我们复制两个base_container 改名为应用A和应用B,运行各自应用下的bin目录下编写的启动脚本就可以了。

在使用tomcat多实例部署,实例启动时需要指定$CATALINA_BASE$CATALINA_HOME

所以实例的启动、关闭 一般通过脚本,在脚本里设置环境变量,然后去调用$CATALINA_HOME/bin/的开启或关闭命令。

这里给出启动和关闭的脚本...

启动实例脚本:

#!/usr/bin/env bash
DIR=`dirname $0`
cd $DIR
cd ..

export CATALINA_BASE="$PWD"
export CATALINA_HOME="/usr/local/server/tomcat8"
export CATALINA_PID="$CATALINA_BASE/logs/tomcat.pid"
export JAVA_OPTS="-server -Xmx1024m -Xms512m -Xmn512m -Djava.security.egd=file:/dev/./urandom"

rm -rf webapps/*

echo "exec $CATALINA_HOME/bin/startup.sh"
## start tomcat
$CATALINA_HOME/bin/startup.sh
复制代码

关闭实例脚本:

#!/usr/bin/env bash
DIR=`dirname $0`
cd $DIR
cd ..

DIR_PATH="$PWD"
PID=$(ps -ef|grep $DIR_PATH|grep tomcat|awk '{print $2}')
if [ "$PID" != "" ] ; then
        if [ "$PID" -gt 0 ]; then
                export JAVA_HOME=/usr/local/server/jdk1.8.0_144
                export CATALINA_BASE="$PWD"
                export CATALINA_PID="$CATALINA_BASE/logs/tomcat.pid"
                export CATALINA_HOME="/usr/local/server/tomcat8"
                echo "exec $CATALINA_HOME/shutdown.sh"
                $CATALINA_HOME/bin/shutdown.sh -force
        else
                echo "$DIR_PATH PID lt Zero"
        fi
else
        echo "$DIR_PATH do not run"
fi
复制代码

这里需要注意一下:上面的两个脚本里,CATALINA_HOMEJAVA_HOME需要替换成你本地的对于的目录。

另外,我们把tomcat的配置文件(conf/server.xml)简化一下,多实例端口的配置需要修改如下两个地方:

<?xml version="1.0" encoding="UTF-8"?>
<!--配置tomcat SHUTDOWN端口-->    
<Server port="6061" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


  <Service name="Catalina">
    
    <!--配置tomcat 启动的端口-->    
    <Connector port="6060" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
             <!--指定根目录war包地址 自动解压加载到webapps目录下-->
			 <Context docBase="/usr/local/server/deploy/comic-spilder/comic-spilder.war" path="" reloadable="false"/> 
      </Host>
    </Engine>
	
  </Service>
</Server>
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值