这篇文章主要借鉴自mafly大神的文章:聊聊 Tomcat 的单机多实例
首先什么是代理服务:代理服务是一个软件,运行于某台计算机上,使用代理服务器的计算机与internet交互信息的过程是先将信息发送给代理服务器,再有代理服务器与internet交互,代理服务器接收到返回信息再发给计算机。主要是出于安全或局域网internet出口有限的问题;
反向代理服务器:运行有反向代理程序的计算机,通过反向代理,可以绕开端口限制,将一个URL转发到另一个URL,解决80端口问题等。目前比较成熟的开放的反向代理应用有nginx和nat123。ngnix是单纯的反向代理,可以利用nginx自行搭建反向代理服务,不少运营商甚至拿来包装成自己的界面,来运营。nat123是综合了NAT和反向代理,一般用户可以直接用nat123提供的反向代理服务,无需自己再搭建。
好,我们来谈谈tomcat的单机多例模式,也就是要实现一台服务器上部署多个项目,但每次维护只是针对单个项目进行维护,避免影响其他项目的运行以及增加项目维护的效率;
简单介绍一下各个文件夹及文件
bin:主要存放运行脚本,如启动服务,停止服务等
logs:主要存放日志,像我们在服务器上看日志就是在这里启动catalina.out
conf:这个里面作主要文件的就是server.xml和web.xml
webapps:项目部署的默认路径,也就是war包默认的存放路径
work:主要是项目的jsp生成servlet文件存放目录(java文件以及最终生成的class文件目录)
lib:存放tomcat运行所需jar包
temp:主要存放项目运行时所生成的临时文件,例如开启hibernate缓存服务的程序,就会生成一些文件在该目录下
LISENCE:版权许可证,软件信息及适用范围
NOTICE:通知信息,一些软件的所属信息和地址什么的
RELEASE-NOTES:发布说明,包含一些版本升级功能点
RUNNING.txt:运行说明,必需的运行环境等信息
Tomacat的几种部署方式
单实例单应用:webapps目录下一个war包,直接运行
单实例多应用:一个tomcat下多个项目war包,访问时同一端口,根据项目包名的不同进行区分
多实例单应用:多个tomcat,部署同一项目,端口不同,一般只用于nugix负载均衡的部署测试,实际意义不大
多实例多应用:就是本篇的重点,服务器上有多个tomcat部署多个不同项目,主要用于服务器资源有限,项目对服务器要求不高的情况下的服务器资源最优化
看官方建议,把tomcat下目录全部复制过去就太low了
上图中的 CATALINA_HOME 指Tomcat安装路径,CATALINA_BASE 指实例所在位置。
CATALINA_HOME 路径下只需要包含 bin 和 lib 目录,而 CATALINA_BASE 只存放 conf、webapps、logs 等这些文件,这样部署的好处在于升级方便,配置及安装文件间互不影响,在不影响 Tomcat 实例的前提下,替换掉 CATALINA_HOME 中的安装文件。
流程清楚了,接下来才是真正的撸起袖子加油干了。
快来实践一下吧
你看到了这里肯定已经安装了 Tomcat 了,我现在演示用的是最新的 8.5.11 版本。
1.复制出两个 Tomcat 实例
在 Tomcat 安装路径的同一级目录下,新建两个tomcat-1、tomcat-2文件夹,先把安装路径下的 conf、webapps、temp、logs、work 这五个文件移动到tomcat-1实例中:
命令:
mkdir tomcat-1 tomcat-2
cd apache-tomcat-8.5.11
mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat-1
接着把tomcat-1下的这几个文件再复制到tomcat-2中,直接命令:
cp tomcat-1/* tomcat-2
2.新建 Tomcat 启动、停止脚本
依然是在 Tomcat 安装路径的同一级目录下,新建两个tomcat-shell文件夹,用于存放启动和停止脚本,同时赋予文件全部权限。
命令:
cd tomcat-shell/
vim start_tomcat.sh
vim stop_tomcat.sh
chmod 777 start_tomcat.sh stop_tomcat.sh
tomcat-start.sh:
tomcat-start.sh
#!/bin/bash
export CATALINA_HOME=/software/apache-tomcat-8.5.11
export CATALINA_BASE=${1%/}
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 ${1%/} start succeed"
else
echo "$0 ${1%/} start failed"
echo $TOMCAT_START_LOG
fi
tomcat-stop.sh:
tomcat-stop.sh
#!/bin/bash
export CATALINA_HOME=/software/apache-tomcat-8.5.11
export CATALINA_BASE=${1%/}
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 : ${1%/}"
exit
fi
if [ "$?" = "0" ]; then
echo "$0 ${1%/} stop succeed"
else
echo "$0 ${1%/} stop failed"
echo $TOMCAT_STOP_LOG
fi
这两个就是简单的脚本,其中传入了要启动的 Tomcat 实例所在的路径,当然,你也可以写一个重启的脚本,其实就是先停止再启动,还可以加入不同的 JVM 参数配置等等操作。
到这里,其实全部基础工作已经做好了。接下来我们看一眼整个多实例的目录结构:
3.配置 server.xml 端口
你知道的,同一个服务器部署不同 Tomcat 要设置不同的端口,不然会报端口冲突,所以我们只需要修改conf/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;
我这里把 tomcat-2 实例的 Connector Port 改为了 8081 ,并分别在 tomcat-1、tomcat-2 的 webapps/ROOT 目录下放入了一个页面文件,内容如下:
<html>
<title>Tomcat-1</title>
<body>
Hello Mafly! from Tomcat-1.
</body>
</html>
4.启动
直接通过执行我们刚写的脚本,传入某一个 Tomcat 实例路径即可来启动对应的 Tomcat。
命令:
/software/tomcat-shell/start_tomcat.sh /software/tomcat-1
/software/tomcat-shell/start_tomcat.sh /software/tomcat-2
去浏览器看一眼:
哈哈,可以了。接下来,停止或者重启什么的都一样,你可以根据需要来在单个服务器上创建更多的 Tomcat 实例,一切都看你喜欢。