Tomcat 常见的几种部署场景
通常,我们在同一台服务器上对 Tomcat 部署需求可以分为以下几种:单实例单应用,单实例多应用,多实例单应用,多实例多应用。实例的概念可以理解为上面说的一个 Tomcat 目录。
- 单实例单应用:比较常用的一种方式,只需要把你打好的 war 包丢在
webapps
目录下,执行启动 Tomcat 的脚本就行了。 - 单实例多应用:有两个不同的 Web 项目 war 包,还是只需要丢在
webapps
目录下,执行启动 Tomcat 的脚本,访问不同项目加上不同的虚拟目录。这种方式要慎用在生产环境,因为重启或挂掉 Tomcat 后会影响另外一个应用的访问。 - 多实例单应用:多个 Tomcat 部署同一个项目,端口号不同,可以利用 Nginx 这么做负载均衡,当然意义不大。
- 多实例多应用:多个 Tomcat 部署多个不同的项目。这种模式在服务器资源有限,或者对服务器要求并不是很高的情况下,可以实现多个不同项目部署在同一台服务器上的需求,来实现资源使用的最大化。
这次实验也是做一个多实例多应用,单应用做负载均衡的话不需要考虑webapps目录,多个实例共用一个发布目录即可。
首先在tomcat安装目录创建三个目录用来分别存放3个不同的实例。
cd /usr/local/tomcat && mkdir test{1..3}
把安装路径下的 conf、webapps、temp、logs、work
这五个文件移动到tomcat-1
实例中
mv conf/ webapps/ temp/ logs/ work/ -t test1/
再把这几个目录拷贝到实例2和3中
cp -r test1/* test2/ && cp -r test1/* test3/
可以查看一下目录结构
tree -d -L 2 /usr/local/tomcat/
在每一个实例目录下新建一个启动脚本
cd test1 && vim start.sh
#!/bin/bash
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat/test1
echo $CATALINA_BASE
TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`
if [ -n "$TOMCAT_ID" ] ; then
echo "tomcat(${TOMCAT_ITOMCAT_ID}) still running now , please shutdown it firest";
exit 2;
fi
TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`
if [ "$?" = "0" ]; then
echo "$0 启动成功"
else
echo "$0 启动失败"
echo $TOMCAT_START_LOG
fi
CATALINA_HOME:即指向Tomcat安装路径的系统变量
CATALINA_BASE:即指向活跃配置路径的系统变量通过设置这两个变量,就可以将tomcat的安装目录和工作目录分离,从而实现tomcat多实例的部署。
Tomcat官方文档指出,CATALINA_HOME路径的路径下只需要包含bin和lib目录,这也就是支持tomcat软件运行的目录,而CATALINA_BASE设置的路径可以包括上述所有目录,不过其中bin和lib目录并不是必需的,缺省时会使用CATALINA_HOME中的bin和conf。如此,我们就可以使用一个tomcat安装目录部署多个tomcat实例,这样的好处在于方便升级,就可以在不影响tomcat实例的前提下,替换掉CATALINA_HOME指定的tomcat安装目录。
然后是关闭脚本
vim stop.sh
#!/bin/bash
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat/test1
echo $CATALINA_BASE
TOMCAT_ID=`ps aux |grep "java"|grep "[D]catalina.base=$CATALINA_BASE "|awk '{ print $2}'`
if [ -n "$TOMCAT_ID" ] ; then
TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
else
echo "Tomcat instance not found : usr/local/tomcat/test1"
exit
fi
if [ "$?" = "0" ]; then
echo "$0 Tomcat1已停止运行"
else
echo "$0 Tomcat1关闭失败"
echo $TOMCAT_STOP_LOG
fi
赋予脚本执行权限
chmod a+x start.sh
chmod a+x stop.sh
将脚本拷贝到另外两个实例
cp start.sh stop.sh /usr/local/tomcat/test2 && cp start.sh stop.sh /usr/local/tomcat/test3
将拷贝过去的脚本里的路径和提示都修改成对应的实例2、3
之后就是修改配置文件,更改多个实例的端口
vim /usr/local/tomcat/test1/conf/server.xml
vim /usr/local/tomcat/test2/conf/server.xml
vim /usr/local/tomcat/test3/conf/server.xml
第一个修改点:<Server port="8015" shutdown="SHUTDOWN"> 修改为8015,8025,8035.......
第二个修改点:<Connector port="8081" protocol="HTTP/1.1" 修改为8081,8082,8083...........
第三个修改点:<Connector port="8019" protocol="AJP/1.3" redirectPort="8443" /> 修改为8019,8029,8039........
<Server port="****" 管理实例端口
<Connector port="****" protocol="HTTP/1.1 提供web服务端口
<Connector port="****" protocol="AJP/1.3" 用于前端如Apache通过AJP方式连接tomcat的端口
分别在3个实例的 webapps/ROOT 目录下放入了一个页面文件,内容可以自己更改:(注意,这个页面文件必须叫 index.html )
<html>
<title>Tomcat1</title>
<body>
Hello,Tomcat1.
</body>
</html>
分别启动三个实例
/usr/local/tomcat/test1/start.sh
/usr/local/tomcat/test2/start.sh
/usr/local/tomcat/test3/start.sh
最后通过网页访问,以端口区分
完成