标签:情况下 dep 应该 ima 除了 ext style 批量创建 run
通常,我们对tomcat部署需求可以分为几种:单实例单应用,单实例多应用,多实例单应用,多实例多应用。
一般来说,多实例部署tomcat,可以充分利用系统资源,不过这种方式,也有几个方面需要考虑:
本文重点阐述多实例应用的部署方案,但是为了解决上述几个问题,我们需要先来了解一下tomcat的一些基本情况。
首先来看一下tomcat的目录结构,一个刚解压出来的tomcat打包文件应该有以下几个目录
目录 | 作用 |
---|---|
bin | 主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本 |
conf | 主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml |
lib | 主要存放tomcat运行所依赖的包 |
logs | 主要存放运行时产生的日志文件,例如catalina.{date}.log等 |
temp | 存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件 |
webapps | 部署web应用程序的默认目录 |
work | 主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件) |
再介绍两个tomcat中比较重要的概念(通常也是两个系统变量)——CATALINA_HOME和CATALINA_BASE:
Tomcat官方文档指出,CATALINA_HOME路径的路径下只需要包含bin和lib目录,这也就是支持tomcat软件运行的目录,而CATALINA_BASE设置的路径可以包括上述所有目录,不过其中bin和lib目录并不是必需的,缺省时会使用CATALINA_HOME中的bin和conf。如此,我们就可以使用一个tomcat安装目录部署多个tomcat实例,这样的好处在于方便升级,就可以在不影响tomcat实例的前提下,替换掉CATALINA_HOME指定的tomcat安装目录。
这里不详细分析server.xml中每一个配置项,网上也有很多这方面的文档。下面主要说明监听端口和Host的配置内容。
在server.xml中配置了四个监听端口,分别是:
可见,如果不是使用AJP协议连接tomcat,只需要保证多实例中的Server Port和Connect Port不同即可。
再来说Host配置,Host就是所谓的虚拟主机,对应包含了一个或者多个web应用程序,默认的Host配置如下
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
其中:
在部署多实例单应用的时候,默认的$CATALINA/webapps会因为tomcat安装目录升级产生不必要的麻烦,我们考虑将appBase的目录统一到另外的路径下。
最后再说明一下Context的配置,它出现在Host配置内,一个Context的配置就代表了一个web应用程序,如果配置多应用程序,就需要在Host下配置多个Context,一个简单的Context配置如下
<Context path="/some" docBase="someapp.war" >
其中:
通过配置Host的appBase和Context的docBase两个属性,可以将应用程序的文件和tomcat相关的目录进行分离,这样webapps目录也就没有作用了。
最终我们可以得到多实例单应用部署方案的整体框架:
现在假设我们有一台已经配置好Java环境的服务器:
# export JAVA_HOME=/application/jdk # export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH # export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar # java -version java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
另外假设一个完好的可以运行的web应用程序已经打包成some.war,放在/data/www目录下,其中包含一个简单的index.jsp
<html> <body> <h2>Hello World!</h2> </body> </html>
# cd /usr/local # wget -q http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.72/bin/apache-tomcat-7.0.72.tar.gz # tar zxf apache-tomcat-7.0.72.tar.gz # ls apache-tomcat-7.0.72 bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
可以用一小段脚本来完成批量创建的工作
for ((i=1;i<=3;i++)) do mkdir /application/tomcat7-$i/{work,temp,conf,logs} -p cp -a /application/tomcat7-$i/application/tomcat7-$i && sed -i 22s@8005@80${i}5@ /application/tomcat7-$i/conf/server.xml // 修改tomcat关闭端口 sed -i 71s@8080@808${i}@ /application/tomcat7-$i/conf/server.xml // 修改Http监听端口 sed -i 93s@8009@80${i}9@ /application/tomcat7-$i/conf/server.xml // 修改AJP端口 sed -i ‘125s@appBase="webapps"@appBase="/data/www"@‘ /application/tomcat7-$i/conf/server.xml //统一web应用程序的路径 sed -i ‘126s@autoDeploy="true"@autoDeploy="false"@‘ /application/tomcat7-$i/conf/server.xml //关闭自动部署 sed -i ‘126a <Context path="" docBase="/data/www/some.war" />‘ /application/tomcat7-$i/conf/server.xml //配置Context信息,指向some.war的路径 done
#!/bin/sh CUR_DIR=`dirname $BASH_SOURCE` export JAVA_HOME="/application/jdk" export CATALINA_BASE=`readlink -f $CUR_DIR` export CATALINA_HOME="/usr/local/apache-tomcat-7.0.72" 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/shutdown.sh ] && $CATALINA_HOME/bin/shutdown.sh && [ -f $CATALINA_HOME/bin/startup.sh ] && $CATALINA_HOME/bin/startup.sh ;; *) echo "usage : $0 { start | stop | restart }" return 1; ;; esac return 0
把该脚本放在tomcat7-1,tomcat7-2和tomcat7-3目录下
现在我们的目录结构如下
# ls tomcat7-1 tomcat7-2 tomcat7-3 tomcat7-1: conf logs temp tomcat.sh work tomcat7-2: conf logs temp tomcat.sh work tomcat7-3: conf logs temp tomcat.sh work
# cd /application # . tomcat7-1/tomcat.sh start # . tomcat7-2/tomcat.sh start # . tomcat7-3/tomcat.sh start # netstat -tunlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 25757/sshd tcp 0 0 :::8029 :::* LISTEN 21225/java tcp 0 0 ::ffff:127.0.0.1:8035 :::* LISTEN 21186/java tcp 0 0 :::8039 :::* LISTEN 21186/java tcp 0 0 ::ffff:127.0.0.1:8015 :::* LISTEN 21002/java tcp 0 0 :::8081 :::* LISTEN 21002/java tcp 0 0 :::8082 :::* LISTEN 21225/java tcp 0 0 :::8083 :::* LISTEN 21186/java tcp 0 0 :::8019 :::* LISTEN 21002/java tcp 0 0 :::22 :::* LISTEN 25757/sshd tcp 0 0 ::ffff:127.0.0.1:8025 :::* LISTEN 21225/java
可以看到8081,8082,8083等其他端口都已经启动,现在可以使用curl命令进行访问
# curl localhost:8081 <html> <body> <h2>Hello World!</h2> </body> </html> # curl localhost:8082 <html> <body> <h2>Hello World!</h2> </body> </html> # curl localhost:8083 <html> <body> <h2>Hello World!</h2> </body> </html>
完成!
转自:https://www.jianshu.com/p/0b549d00ecc2
标签:情况下 dep 应该 ima 除了 ext style 批量创建 run
原文地址:https://www.cnblogs.com/guanbin-529/p/12797829.html