单机多实例

单机多实例,第1张

tomcat单机多实例的实现

本文主要介绍tomcat单机多实例的实现,通过示例代码非常详细的介绍,对大家的学习或者工作有一定的参考价值。有需要的朋友下面和边肖一起学习。

1。前言

首先回答一个问题,为什么要用单机多实例?
没有宕机,webapps里的项目很多。tomcat可能会因为其中一个项目占用内存过多或者其他不确定因素而挂起,所以同一个tomcat下的项目会一起挂起;在使用不同的tomcat时,在同一个服务器下,每个tomcat的进程是不同的。如果一个项目出现问题,tomcat挂了,其他项目不会受到影响,因为它在不同的进程中。
另一个问题是不同的tomcat使用不同的端口,最后如何只分配一个域名?
其实这个使用nginx的反向代理可以根据请求的前缀代理到对应tomcat项目服务端口对应的nginx服务器。

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


找到核心,点击d出下载链接的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

备份概要文件,并将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

复制两只雄猫:

##完成删除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中的前三个端口,但它有四个不同之处:

  • Server:该端口用于监听关闭tomcat的shutdown命令,默认值为8005。
  • ConnectorPort:这个端口用于监听HTTP请求,默认值是8080。
  • 连接器AJP端口:该端口用于监听AJP(ApacheJServ协议)协议上的请求,通常用于集成其他HTTP服务器,如ApacheServer。默认值为8009。
  • 重定向端口:重定向端口,出现在连接器配置中。如果连接器只支持SSL以外的普通http请求,端口会将https请求转发到这个重定向端口指定的端口,默认值为8443;
  • 未注释的版本:

    <?xmlversion="1.0"encoding="UTF-8"?> <Serverport="8005"shutdown="SHUTDOWN"> <ListenerclassName="org.apache.catalina.startup.VersionLoggerListener"/> <ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on"/> <ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <ListenerclassName="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> <GlobalNamingResources> <Resourcename="UserDatabase"auth="Container" type="org.apache.catalina.UserDatabase" description="Userdatabasethatcanbeupdatedandsaved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/> </GlobalNamingResources> <Servicename="Catalina"> <Connectorport="8080"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/> <Enginename="Catalina"defaultHost="localhost"> <RealmclassName="org.apache.catalina.realm.LockOutRealm"> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Hostname="localhost"appBase="webapps" unpackWARs="true"autoDeploy="true"> <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs" prefix="localhost_access_log"suffix=".txt" pattern="%h%l%u%t&quot;%r&quot;%s%b"/> </Host> </Engine> </Service> </Server>

    Tomcat-test1更改为:

  • 服务器端口:9015
  • 连接器HTTP端口:9010
  • 连接器AJP端口:9019
  • Tomcat-test2更改为:

  • 服务器端口:9025
  • 连接器HTTP端口:9020
  • 连接器AJP端口: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


    Curl慢是因为还没开始。开始之后,就好了。

    curl127.0.0.1:9010 curl127.0.0.1:9020

    这里注意,访问端口是对应于连接器HTTP端口的端口。

    4。附言

    其实设置起来也不是太难。参考文章的思路后,就是共享一个tomcat的lib和bin,这样你升级的时候就可以替换lib了。bin都使用相同的CATALINA_HOME脚本。其实CATALINA_HOME下bin下的启动和关机脚本都统一调用catalina.sh,然而单机多实例系统巧妙的使用了catalina.sh。它通过环境中的CATALINA_HOME和CATALINA_BASE变量启动tomcat,通过将CATALINA_BASE的路径改为同一个脚本,在不同的目录下启动tomcat。

    5。问题

    5.1。tomcat启动缓慢

      

    可以看到生成sessionID用了1分06秒,太长了,应用部署的整体时间大大增加。这个问题是可以解决的。可以增加jvm参数-djava.security.egd=file:/dev/。/urandom。但是,应用随机数的能力减弱,或者随机性不够均匀,这可能会对经常使用加密的应用程序产生安全隐患。
    修改启动脚本,增加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

    附加重启脚本:
    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单机多实例的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774371.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存