tomcat单机多实例的实现
1、前言
首先要回答一个问题,为什么要用单机多实例?
在不宕机的情况下,webapps里面存在多个项目,可能由于其中一个项目过度使用内存或者其他不确定的因素使得tomcat挂了,那么同一tomcat下的项目也会一同挂了;而使用不同的tomcat,同一台服务器下,每个tomcat的进程是不一样的额,一个项目出现问题tomcat挂了,那么由于是在不同进程,其他项目不会影响的。
还有一个问题就是不同tomcat使用了不同端口,最后域名只有一个怎么分配?
其实这个使用nginx的反向代理,根据请求的前缀,代理到相应的tomcat项目服务端口对应的nginxserver即可。
2、系统环境
系统:16.04.5LTS
JDK版本:openjdk1.8
tomcat版本:apache-tomcat-9.0.13
3、环境搭建
3.1、下载tomcat
安装jdk:
apt-getinstallopenjdk-8-jdk
访问官网:https://tomcat.apache.org/download-90.cgi
找到core,点击tar.gz带弹出下载连接复制下载地址。
然后使用命令下载tomcat
wgethttp://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.13/bin/apache-tomcat-9.0.13.tar.gz
解压tomcat:
tar-xzvfapache-tomcat-9.0.13.tar.gz
建一个程序目录:
##创建一个程序目录 mkdir/data ##移动解压文件到data目录下 mv./apache-tomcat-9.0.13/data/ cp/etc/profile/etc/profile.bak echo"exportCATALINA_HOME=/data/apache-tomcat-9.0.13">>/etc/profile echo"exportPATH=\$PATH:\$CATALINA_HOME/bin">>/etc/profile&&source/etc/profile ##创建sh文件 touchtomcat-start.shtomcat-stop.sh ##更改权限 chmod760/data/tomcat-start.sh/data/tomcat-stop.sh
备份profile,并写入tomcat的CATALINA_HOME到环境变量,激活环境变量。
创建tomcat-start.sh,内容如下:
#!/bin/bash
##这里的CATALINA_BASE,是当前脚本的的父目录,如果不在CATALINA_BASE的子目录的话,记得修改
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
echo$CATALINA_BASE
TOMCAT_ID=`psaux|grep"java"|grep"Dcatalina.base=$CATALINA_BASE"|grep-v"grep"|awk'{print$2}'`
if[-n"$TOMCAT_ID"];then
echo"tomcat($TOMCAT_ID)stillrunningnow,pleaseshutdownitfirst";
exit2;
fi
TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`
if["$?"="0"];then
echo"shellscript:$0"
echo"CATALINA_BASE:$CATALINA_BASE"
echo"tomcatthread:$TOMCAT_ID"
echo"startsucceed!!!"
else
echo"$0$CATALINA_BASEstartfailed"
echo$TOMCAT_START_LOG
fi
创建tomcat-stop.sh,内容如下:
#!/bin/bash
##这里的CATALINA_BASE,是当前脚本的的父目录,如果不在CATALINA_BASE的子目录的话,记得修改
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
echo$CATALINA_BASE
TOMCAT_ID=`psaux|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"Tomcatinstancenotfound:$CATALINA_BASE"
exit
fi
if["$?"="0"];then
echo"shellscript:$0"
echo"CATALINA_BASE:$CATALINA_BASE"
echo"stopsucceed!!!"
else
echo"$0$CATALINA_BASEstopfailed"
echo$TOMCAT_STOP_LOG
fi
复制两个tomcat:
##完成删除lib和bin文件夹内容,生成空的bin文件夹 cp-rapache-tomcat-9.0.13/data/apache-tomcat-test1&&cd/data/apache-tomcat-test1&&rm-rflib/bin/&&mkdirbin&&cd- ##复制启动和停止脚本到bin文件夹,带权限复制 cp-ptomcat-start.shtomcat-stop.sh/data/apache-tomcat-test1/bin/ ##一个同样的tomcat目录,带权限复制 cp-Rp/data/apache-tomcat-test1//data/apache-tomcat-test2/
配置server.xml端口
你知道的,同一个服务器部署不同Tomcat要设置不同的端口,不然会报端口冲突,所以我们只需要修改conf/server.xml中的其中前三个端口就行了。但它有四个分别是:
- ServerPort:该端口用于监听关闭tomcat的shutdown命令,默认为8005
- ConnectorHTTPPort:该端口用于监听HTTP的请求,默认为8080
- ConnectorAJPPort:该端口用于监听AJP(ApacheJServProtocol)协议上的请求,通常用于整合ApacheServer等其他HTTP服务器,默认为8009
- RedirectPort:重定向端口,出现在Connector配置中,如果该Connector仅支持非SSL的普通http请求,那么该端口会把https的请求转发到这个RedirectPort指定的端口,默认为8443;
去掉注释的版本:
tomcat-test1改为:
- ServerPort:9015
- ConnectorHTTPPort:9010
- ConnectorAJPPort:9019
tomcat-test2改为:
- ServerPort:9025
- ConnectorHTTPPort:9020
- ConnectorAJPPort:9029
修改标识:
echo"test1">/data/apache-tomcat-test1/webapps/ROOT/index.jsp echo"test2">/data/apache-tomcat-test2/webapps/ROOT/index.jsp
修改完成,接着启动tomcat:
/data/apache-tomcat-test1/bin/tomcat-start.sh /data/apache-tomcat-test2/bin/tomcat-start.sh
curl127.0.0.1:9010 curl127.0.0.1:9020
这里注意访问端口是ConnectorHTTPPort对应的端口
4、后记
其实搭起来不太难,经过参考文章的思路,就是公用一个tomcat的lib和bin,这样子升级的时候替换lib即可,bin都同一用CATALINA_HOME的脚本,其实CATALINA_HOME下的bin下的start和shutdown脚本统一调用了catalina.sh,而单机多实例的则是巧妙运用了catalina.sh是通过环境中的CATALINA_HOME和CATALINA_BASE变量启动tomcat的,通过改变CATALINA_BASE的路径达到同一条脚本启动tomcat在不同目录下。
5、问题
5.1、tomcat启动慢
修改一下启动脚本,添加了JAVA_OPTS的设置,能使用JAVA_OPTS,是因为catalina.sh会读出这个变量。
#!/bin/bash
##这里的CATALINA_BASE,是当前脚本的的父目录,如果不在CATALINA_BASE的子目录的话,记得修改
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
echo$CATALINA_BASE
TOMCAT_ID=`psaux|grep"java"|grep"Dcatalina.base=$CATALINA_BASE"|grep-v"grep"|awk'{print$2}'`
exportJAVA_OPTS="-Djava.security.egd=file:/dev/./urandom";
if[-n"$TOMCAT_ID"];then
echo"tomcat($TOMCAT_ID)stillrunningnow,pleaseshutdownitfirst";
exit2;
fi
TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`
if["$?"="0"];then
echo"shellscript:$0"
echo"CATALINA_BASE:$CATALINA_BASE"
echo"tomcatthread:$TOMCAT_ID"
echo"startsucceed!!!"
else
echo"$0$CATALINA_BASEstartfailed"
echo$TOMCAT_START_LOG
fi
5.2、远程ssh时,环境变量不生效问题
使用source命令刷新当前环境变量。
具体修改如下:
tomcat-start.sh:
#!/bin/bash
##这里的CATALINA_BASE,是当前脚本的的父目录,如果不在CATALINA_BASE的子目录的话,记得修政
source/etc/profile
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
exportJAVA_OPTS="-Djava.security.egd=file:/dev/./urandom";
TOMCAT_ID=`psaux|grep"java"|grep"Dcatalina.base=$CATALINA_BASE"|grep-v"grep"|awk'{print$2}'`
echo"----------------------------------"
echo"UsingCATALINA_BASE:$CATALINA_BASE"
echo"UsingCATALINA_HOME:$CATALINA_HOME"
echo"----------------------------------"
if[-n"$TOMCAT_ID"];then
echo"tomcat($TOMCAT_ID)stillrunningnow,pleaseshutdownitfirst";
exit2;
fi
TOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`
if["$?"="0"];then
echo"shellscript:$0"
echo"tomcatthread:$TOMCAT_ID"
echo"startsucceed!!!"
else
echo"$0$CATALINA_BASEstartfailed"
echo"CATALINA_BASE:$CATALINA_BASE"
echo$TOMCAT_START_LOG
fi
tomcat-stop.sh
#!/bin/bash
##这里的CATALINA_BASE,是当前脚本的的父目录,如果不在CATALINA_BASE的子目录的话,记得修政
source/etc/profile
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
TOMCAT_ID=`psaux|grep"java"|grep"[D]catalina.base=$CATALINA_BASE"|awk'{print$2}'`
echo"----------------------------------"
echo"UsingCATALINA_BASE:$CATALINA_BASE"
echo"UsingCATALINA_HOME:$CATALINA_HOME"
echo"----------------------------------"
if[-n"$TOMCAT_ID"];then
TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
else
echo"Tomcatinstancenotfound:$CATALINA_BASE"
exit
fi
if["$?"="0"];then
echo"shellscript:$0"
echo"stopsucceed!!!"
else
echo"$0$CATALINA_BASEstopfailed"
echo"CATALINA_BASE:$CATALINA_BASE"
echo$TOMCAT_STOP_LOG
fi
附上restart脚本:
tomcat-restart.sh:
#!/bin/bash
source/etc/profile
exportCATALINA_BASE=$(cd$(dirname$0);cd..;pwd)
GREEN_COLOR='\E[1;32m'#绿
RES='\E[0m'
TOMCAT_ID=`psaux|grep"java"|grep"Dcatalina.base=$CATALINA_BASE"|grep-v"grep"|awk'{print$2}'`
SLEEP_TIME=1
echo"----------------------------------"
echo"UsingCATALINA_BASE:$CATALINA_BASE"
echo"UsingCATALINA_HOME:$CATALINA_HOME"
echo"----------------------------------"
if[-n"$TOMCAT_ID"];then
echo-e"${GREEN_COLOR}foundtomcatinstanceinpid$TOMCAT_ID,shutdownnow!${RES}";
echo-e"${GREEN_COLOR}---------------startshutdown-------------------${RES}"
source$(dirname$0)/tomcat-stop.sh;
echo-e"${GREEN_COLOR}---------------endshutdown-------------------${RES}"
fi
while[-n"$TOMCAT_ID"]
do
sleep$SLEEP_TIME
echowait"$SLEEP_TIME"s
TOMCAT_ID=`psaux|grep"java"|grep"Dcatalina.base=$CATALINA_BASE"|grep-v"grep"|awk'{print$2}'`
done
echo-e"${GREEN_COLOR}---------------startstartup-------------------${RES}"
source$(dirname$0)/tomcat-start.sh
echo-e"${GREEN_COLOR}---------------endstartup-------------------${RES}"
参考博客:
聊聊Tomcat的单机多实例
SpringBoot应用首次启动慢的问题
到此这篇关于tomcat单机多实例的实现的文章就介绍到这了,更多相关tomcat单机多实例内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。