一个实例支持不了那么多的并发量,在nginx帮助下进行负载均衡的话部署出来多实例就可以简单的增加并发量。参考了两位大佬的文章简单的学习一下做一个记录

首先需要linux环境下安装tomcat和jdk 然后能够找到这两个安装目录(逃...)

然后我要先搬过来大佬的科普(因为我自己记不住,防止忘记)

简单介绍一下各个文件夹及文件:

                                             多实例部署最大作用就是最大化利用服务器资源

 

 

  • bin:主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本
  • conf:主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml
  • lib:主要存放tomcat运行所依赖的包
  • LICENSE:版权许可证,软件版权信息及使用范围等信息
  • logs:主要存放运行时产生的日志文件,例如catalina.out(曾经掉过一个大坑)、catalina.{date}.log等
  • NOTICE:通知信息,一些软件的所属信息和地址什么的
  • RELEASE-NOTES:发布说明,包含一些版本升级功能点
  • RUNNING.txt:运行说明,必需的运行环境等信息
  • temp:存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件
  • webapps:部署web应用程序的默认目录,也就是 war 包所在默认目录
  • work:主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件)
  • 通常,我们在同一台服务器上对 Tomcat 部署需求可以分为以下几种:单实例单应用,单实例多应用,多实例单应用,多实例多应用。实例的概念可以理解为上面说的一个 Tomcat 目录。

  • 单实例单应用:比较常用的一种方式,只需要把你打好的 war 包丢在 webapps目录下,执行启动 Tomcat 的脚本就行了。
  • 单实例多应用:有两个不同的 Web 项目 war 包,还是只需要丢在webapps目录下,执行启动 Tomcat 的脚本,访问不同项目加上不同的虚拟目录。这种方式要慎用在生产环境,因为重启或挂掉 Tomcat 后会影响另外一个应用的访问。
  • 多实例单应用:多个 Tomcat 部署同一个项目,端口号不同,可以利用 Nginx 这么做负载均衡,当然意义不大。
  • 多实例多应用:多个 Tomcat 部署多个不同的项目。这种模式在服务器资源有限,或者对服务器要求并不是很高的情况下,可以实现多个不同项目部署在同一台服务器上的需求,来实现资源使用的最大化。-
  • 多实例tomcat的更新维护,例如对tomcat进行升级等操作,我们需要考虑如何能“优雅”地对所有实例进行升级
  • 尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装目录隔离
    • 对于单应用来说,如果将war包分别置于各个tomcat的webapps目录,那么在发布新版本的war时,可能会出现某个实例更新失败,导致用户在访问时可能会访问到不同版本的web app,因此,比较好的方式就是所有tomcat实例都统一指向同一个应用程序

上面是tomcat里面各个文件夹以及文件的作用 下面就要开始进行对tomcat多实例化了

 先看一下官方的多实例化操作建议图解

Tomcat官方文档指出,CATALINA_HOME路径的路径下只需要包含bin和lib目录,这也就是支持tomcat软件运行的目录,而CATALINA_BASE设置的路径可以包括上述所有目录,不过其中bin和lib目录并不是必需的,缺省时会使用CATALINA_HOME中的bin和conf。如此,我们就可以使用一个tomcat安装目录部署多个tomcat实例,这样的好处在于方便升级,就可以在不影响tomcat实例的前提下,替换掉CATALINA_HOME指定的tomcat安装目录。

上面建议表示CATALINA_HOME意思是Tomcat的安装路径,CATALINA_BASE是指实例所在的位置

安装路径下只需要有bin和lib目录就可以了 对各个实例进行集中的管理记录  CATALINA_BASE只用来存放每个实例需要独自存有的conf自己的配置文件 webapps自己的应用 logs日志之类的 这样的话如果升级的话不需要挨个升级只需要升级一个主HOME的安装文件就可以了,而各自实例可以单独配置适合自己配置(操作linux命令自行搜索)

首先呢就是先要整出两个实例 在tomcat安装路径 同级目录下哦 名字定义为tomcat-1 tomcat-2

然后将HOME中的conf、webapps、temp、logs、work剪切到tomcat-1 和tomcat-2中 HOME只作为调配使用 我当时怕自己整错所以我是整的复制,这样主HOME也是可以使用的。

放到这里之后呢就完成了简单的实例的创建 然后就是对实例的配置了,因为端口号如果一样的话是启动不开的

端口号配置在各个实例的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-1和tomcat-2的端口号改为8081和8082  下面修改端口号方式这样能够仅凭端口号就可以知道是那个实例

我将其注释部分和不重要的部分均省略了 所以不要以为就只有这些
<Server port="8015" shutdown="SHUTDOWN"> tomcat-1修改为了 8015 tomcat-2修改为了 8025
  .....很多字符
<Service name="Catalina">

<Connector port="8081" protocol="HTTP/1.1"    
               connectionTimeout="20000"
               redirectPort="8443" />    tomcat-1修改为了 8081 tomcat-2修改为了 8082 

<Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />  tomcat-1修改为了 8019 tomcat-2修改为了 8029

 修改完后我们再写对应的启动关闭脚本就好了,这边我找到两个大佬的不同的脚本编写 相对于第二个简单点 但是我都写了就当是shell理解吧

先说第一个 上面图中我还建了一个tomcat-shell 这个文件夹存放了tomcat-start.sh和tomcat-stop.sh用来对tomcat特定实例的启动和关闭 重启可以参考另一个写 另一个有重启、开启和关闭

先来tomcat-start.sh

#!/bin/bash  这个是注释哦

#这行表示预指定Tomcat的主实例也就是放bin和lib那个文件夹所在目录 是全路径哦

export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.5.34

#这行表示正则 是从右边删掉第一个/后面的 
export CATALINA_BASE=${1%/}

#表示打印出CATALINA_BASE的代表路径 

echo $CATALINA_BASE

#这行意思是获取该tomcat的进程号

TOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`

#这行表示查看这个tomcat进程是否正在运行如果正在运行则会输出这个tomcat(进程号)正在运行请先停止
if [ -n "$TOMCAT_ID" ] ; then
echo "tomcat(${TOMCAT_ITOMCAT_ID}) still running now , please shutdown it firest";
    exit 2;
fi 

#否则 则会启动执行 主HOME下的startup.sh

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

#!/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}'`

#获取到进程号如果该进程有则执行shutdown.sh命令

if [ -n "$TOMCAT_ID" ] ; then
TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
else

#否则输出这个tomcat的实例找不到
    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

这个是第一种方法写脚本一共两个然后给他们赋予权限 chmod 777 start_tomcat.sh stop_tomcat.sh

然后启动

/usr/local/tomcat/tomcat-shell/start_tomcat.sh /usr/local/tomcat/tomcat-1

/usr/local/tomcat/tomcat-shell/start_tomcat.sh /usr/local/tomcat/tomcat-2

关闭就将start换成stop即可

 这样就启动成功了使用netstat -tunlp 查看linux里进程端口号

下面介绍另一种脚本前再搬运一些另一个大佬的配置讲解

 

 

 然后下面是制作启动停止和重启一体的脚本

启动停止重启一体的脚本 这里命名为tomcat.sh

#!/bin/sh
 #这个应该是读取存储路径
CUR_DIR=`dirname $BASH_SOURCE`

#JDK安装路径
export JAVA_HOME="/usr/java/jdk1.8.0_11"

#实例路径
export CATALINA_BASE=`readlink -f $CUR_DIR`

#主HOME路径
export CATALINA_HOME="/usr/local/tomcat/apache-tomcat-8.5.34"
 #表示读入的是start还是stop还是restart 则对应执行不同的命令 
case $1 in
 start)
[ -f $CATALINA_HOME/bin/startup.sh ] && $CATALINA_HOME/bin/startup.sh
;;
 stop)
 [ -f $CATALINA_HOME/bin/shutdown.sh ] && $CATALINA_HOME/bin/shutdown.sh
 ;;
 restart)
 [ -f $CATALINA_HOME/bin/startup.sh ] && $CATALINA_HOME/bin/startup.sh && \
 [ -f $CATALINA_HOME/bin/shutdown.sh ] && $CATALINA_HOME/bin/shutdown.sh
 ;;
 *)
 echo "usage : $0 { start | stop | restart }"
 return 1;
 ;;
esac
 
return 0 

 

然后我们将这个脚本保存到tomcat-1和tomcat-2中 

最后执行命令 . tomcat-1/tomcat.sh start(stop/restart) . tomcat-1/tomcat.sh start(stop/restart)

netstat -tunlp

然后执行上面的命令就可以查看各个实例是否在运行了

 

然后我们可以访问我是直接访问的默认的tomcat页面

最后如果想让多实例单应用真正发挥作用使用Nginx进行负载均衡配置就好了 这个就不讲Nginx了 

下面附上大佬的链接

简书:fullstackyang

博客园:Mafly