在公司做运维,会遇到在linux机器安装一些中间件,比较常见的是安装tomcat、nginx。为了运维工作的标准化,也为了防止不同人安装习惯不一样导致的安装目录乱七八糟,所以一般会实现个自动化安装脚本,这里用python实现个自动化安装。在编写脚本前,先熟悉多实例tomcat的原理。
一、多实例tomcat原理
多实例tomcat:这里是指在单机上安装多个tomcat实例。
应用场景:在生产环境,当然一般都是单机只有一个tomcat实例,但在测试环境,这样就太浪费了,所以一般都会安装多个实例,给不同的业务使用。
有种最简单的方法:就是复制多份tomcat安装文件。不过,这种的缺点也是很明显:占空间,升级麻烦。当存在多个实例时,升级时又得重新复制多份,也容易导致多个实例的tomcat版本不一致。
所以,最常用的方法是:tomcat核心文件只一份,复制多份配置文件,即可实现多实例。
1、tomcat各目录的作用
- bin:存放脚本文件,例如启停脚本 startup.sh shutdown.sh
- conf:存放配置文件,最主要的是server.xml 和 web.xml
- lib:存放各种依赖jar包
- logs:存放日志文件
- temp:存放tomcat运行时产生的临时文件
- webapps:应用部署目录
- work:主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件)
2、部署过程
创建实例目录 servers,然后每个实例主目录以其实例名命名
例如,新建实例 tm_adidas,tm_nike,其结构如下:
servers
├── tm_adidas
└── tm_nike复制必要的配置文件
这里把官方安装包里的 conf、logs、temp、webapps、work目录复制到每个实例。
修改server.xml配置文件
主要修改监听端口、关闭端口、应用部署目录:
监控端口:默认是8080,因为是多实例,所以各个实例的端口都不能一样,并且不能被其它程序占用,这里选用30086
关闭端口:默认是8005,这里选用40086
应用部署目录:修改appbase参数,默认是webapps
<Server port="40086" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
<!--Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /-->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
<GlobalNamingResources>
<!-- Used by Manager webapp -->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="30086" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" minSpareThreads="25"
enableLookups="false" redirectPort="8443" acceptCount="200"
connectionTimeout="40000"
disableUploadTimeout="false"/>
<!-- This is here for compatibility only, not required -->
<!-- <Connector port="59009" protocol="AJP/1.3" /> -->
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase" />
<Host name="localhost" appBase="/home/admin/app/servers/tm_adidas/webapps" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" rotatable="true"
directory="logs" prefix="access.log"
pattern="%h %{X-FORWARDED-FOR}i %l %u %t %r %s %b %q %{User-Agent}i %T %D" resolveHosts="false"/>
</Host>
</Engine>
</Service>
最终的目录结构
tomcat目录:放置官方安装文件,并且把oracle jdk也放入其中,一般都是使用oracle jdk,不选用开源jdk;
severs目录:放置所有实例。
实例启停
思路:设置每个实例的环境变量,然后调用官方安装包bin下的脚本启停。
最重要的三个参数:
JAVA_HOME:jdk的根目录
CATALINA_HOME、 CATALINA_BASE:
Tomcat官方文档指出,CATALINA_HOME路径的路径下只需要包含bin和lib目录,这也就是支持tomcat软件运行的目录,而CATALINA_BASE设置的路径可以包括上述所有目录,不过其中bin和lib目录并不是必需的,缺省时会使用CATALINA_HOME中的bin和lib。
#!/bin/bash
##设置实例启停的环境变量
export JAVA_HOME = /home/admin/app/tomcat/jdk1.8.0_162
export CATALINA_HOME = /home/admin/app/tomcat/apache-tomcat-8.0.50
export CATALINA_BASE = /home/admin/app/servers/tm_adidas
export CATALINA_TMPDIR = $CATALINA_BASE/temp
export CATALINA_PID = $CATALINA_BASE/tm_adidas.pid
export JAVA_OPTS = "-Xms2048m -Xmx2048m -XX:MaxNewSize=128m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xloggc:$CATALINA_BASE/logs/gc.log -Dtomcat.name=tm_adidas"
##启动
sh $CATALINA_HOME/bin/startup.sh
##停止
sh $CATALINA_HOME/bin/stop.sh
二、自动部署
会用python实现个自动部署脚本,并且统一实例启停脚本,方便管理:
##根据实例名即可实现不同实例的启停
python serverctl.py tm_adidas start ##启动实例tm_adidas
python serverctl.py tm_adidas stop ##关闭实例tm_adidas
请自下一节分析
python多实例tomcat自动安装(二)
tomcat多实例原理参考: