0%

Tomcat多实例部署

同一个tomcat下部署多个项目,重启会影响到其他项目的正常运行,为了使各项目独立,一般会使用安装多个tomcat,这样很耗费系统资源;创建tomcat多实例,有效的解决这一问题;

常见部署方式

单实例单应用:比较常用的一种方式,只需要把你打好的 war 包丢在 webapps目录下,执行启动 Tomcat 的脚本就行了。
单实例多应用:有两个不同的 Web 项目 war 包,还是只需要丢在webapps目录下,执行启动 Tomcat 的脚本,访问不同项目加上不同的虚拟目录。这种方式要慎用在生产环境,因为重启或挂掉 Tomcat 后会影响另外一个应用的访问。
多实例单应用:多个 Tomcat 部署同一个项目,端口号不同,可以利用 Nginx 这么做负载均衡,当然意义不大。
多实例多应用:多个 Tomcat 部署多个不同的项目。这种模式在服务器资源有限,或者对服务器要求并不是很高的情况下,可以实现多个不同项目部署在同一台服务器上的需求,来实现资源使用的最大化。

目录作用

bin 主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本
conf 主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml
lib 主要存放tomcat运行所依赖的包
logs 主要存放运行时产生的日志文件,例如catalina.{date}.log等
temp 存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件
webapps 部署web应用程序的默认目录
work 主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件)

CATALINA_HOME:即指向Tomcat安装路径的系统变量
CATALINA_BASE:即指向活跃配置路径的系统变量
通过设置这两个变量,就可以将tomcat的安装目录和工作目录分离,从而实现tomcat多实例的部署。

tomcat
将tomcat复制为以下目录结构
tomcat

修改$CATALINA_HOME/conf/server.xml

在server.xml中配置了四个监听端口,分别是:
Server Port: 该端口用于监听关闭tomcat的shutdown命令,默认为8005
Connector Port: 该端口用于监听HTTP的请求,默认为8080
AJP Port: 该端口用于监听AJP( Apache JServ Protocol )协议上的请求,通常用于整合Apache Server等其他HTTP服务器,默认为8009
Redirect Port: 重定向端口,出现在Connector配置中,如果该Connector仅支持非SSL的普通http请求,那么该端口会把https的请求转发到这个Redirect Port指定的端口,默认为8443

修改第22行Server Port (三个tomcat依次修改为8005,8006,8007)

1
<Server port="8007" shutdown="SHUTDOWN">

修改第71行Connector Port(三个tomcat依次修改为8080,8081,8082)

1
<Connector port="8082" protocol="HTTP/1.1"

修改第93行AJP Port (三个tomcat依次修改为8009,8019,8029)

1
<Connector port="8029" protocol="AJP/1.3" redirectPort="8443" />

虚拟主机配置
name: 虚拟主机的名称,一台主机表示了完全限定的域名或IP地址,默认为localhost,同时也是唯一的host,进入tomcat的所有http请求都会映射到该主机上
appBase: web应用程序目录的路径,可以是CATALINA_HOME的相对路径,也可以写成绝对路径,默认情况下为$CATALINA_HOME/webapps
unpackWARs: 表示是否自动解压war包
autoDeploy: 所谓的热部署,即在tomcat正在运行的情况下,如果有新的war加入,则会立即执行部署操作
deployOnStartup: 表示tomcat启动时是否自动部署appBase目录下所有的Web应用程序,默认为true。这个属性和autoDeploy会产生两次部署的“副作用”:一次是tomcat启动时就开始部署,第二次就是autoDeploy引起的热部署。因此最好将autoDeploy置为false

修改第125-127行虚拟主机配置 (三个tomcat参考以下内容依次修改)

1
2
3
<Host name="c.com"  appBase="/data/tomcat/c.com/"
unpackWARs="true" autoDeploy="false">
<Context path="/hello" docBase="/data/tomcat/c.com/hello.war" />

启动&关闭脚本

脚本放在CATALINA_BASE(如:/opt/tomcat1/)下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/sh
# description: 启动tomcat多实例.
. /etc/init.d/functions
RETVAL=$?
# tomcat实例目录
export CATALINA_BASE="$PWD"
# tomcat安装目录
export CATALINA_HOME="/opt/"
case "$1" in
start)
if [ -f $CATALINA_HOME/bin/startup.sh ];then
echo $"Start Tomcat"
$CATALINA_HOME/bin/startup.sh
fi
;;
stop)
if [ -f $CATALINA_HOME/bin/shutdown.sh ];then
echo $"Stop Tomcat"
$CATALINA_HOME/bin/shutdown.sh
fi
;;
*)
echo $"Usage: $0 {start|stop}"
exit 1
;;
esac
exit $RETVAL

因为启动脚本中有获取当前路径的操作,一定需要cd到tomcat.sh的当前目录下执行才可以

1
2
3
4
5
6
cd /opt/tomcat1
./tomcat.sh start|stop
cd /opt/tomcat2
./tomcat.sh start|stop
cd /opt/tomcat3
./tomcat.sh start|stop

访问8080,8081,8082端口验证

参考地址:
http://www.jianshu.com/p/0b549d00ecc2
http://www.ttlsa.com/tomcat/config-multi-tomcat-instance/