概述
Apache Tomcat 单机多实例部署方案是指在一台服务器上仅安装一套主应用程序,启动多个应用实例。采用这种方法主要由以下:
- 无需拷贝多套Tomcat主程序,减少磁盘占用
- 升级Tomcat版本时,仅需要升级一套实例程序
Tomcat 常见部署方案
- 单实例单应用:最常见的一种部署方案,只需要提供
war包丢到webapps目录即可。 - 单实例多应用:多个Web应用程序产出多个
war包,将这些war统统都丢到webapps目录即可。 - 多实例单应用:每个实例仅部署一个Web应用程序,每个实例端口号不同,可以采用这种方案配合Nginx实现负载均衡。
- 多实例多应用:每个实例最少部署一个应用程序。采用这种方案在服务器资源配置有限,或者服务器并发不高的情况下,可以实现多个应用程序部署在同一台服务器,实现资源的最大化使用。
Tomcat目录结构
- bin 运行脚本
- conf 配置文件
- lib 核心库文件
- logs 日志
- temp 临时目录
- webapps 应用程序目录
- work 运行时目录
bin和lib作为Tomcat主程序目录,多个实例可以共用同一个目录。每个实例必须包含conf、logs、temp、webapps、work目录。
多实例部署
要完成多实例部署方案,主要通过CATALINA_HOME和CATALINA_BASE来实现,具体含义:
- CATALINA_HOME:表示Tomcat安装目录,该目录包含bin和lib目录即可。
- CATALINA_BASE:表示Tomcat实例运行目录,该目录必须包含conf、logs、temp、webapps。
为什么使用CATALINA_BASE
默认情况下,CATALINA_HOME和CATALINA_BASE指向同一个目录。若您要运行多个Tomcat实例,主要通过CATALINA_BASE指向每个实例的目录来实现。
实例部署
- 下载Tomcat
$ wget -O /tomcat9.tar.gz https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz
- 解压并安装
$ mkdir /tomcat9
$ tar zxvf /tomcat9.tar.gz -C /tomcat9
- 安装守护进程
Tomcat在Linux平台使用公共守护程序中的jsvc工具作为守护进行运行。jsvc的源码包包含在Tomcat二进制文件中,需要编译。
在运行脚本之前,需要设置好Java的环境变量。或者,在调用脚本时,通过参数设置Java环境。例如JAVA_HOME./configure--with-java./configure --with-java=/usr/java
$ cd /tomcat9/bin
$ tar xvfz commons-daemon-native.tar.gz -C commons-daemon-native
$ cd commons-daemon-native commons-daemon-native
$ ./configure && make
$ cp jsvc ../..
- 安装APR(可选)
APR (Apache Portable Runtime)主要为上层应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
Tomcat可以使用APR为用户提供更好的性能,解决了Tomcat无法直接调用操作系统API。
必须环境:
- APR 1.2+ develoment headers(libapr1-dev package)
- OpenSSL 1.0.2+ development headers(libssl-dev package)
- JNI header from Java compatible JDK 1.4+
- GNU development environment(gcc, make)
$ yum install openssl -y
$ wget -O /apr.tar.gz https://mirrors.bfsu.edu.cn/apache//apr/apr-1.7.0.tar.gz
$ wget -O /apr-util.tar.gz https://mirrors.bfsu.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
$ wget -O /apr-iconv.tar.gz https://mirrors.bfsu.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gz
$ tar zxvf apr.tar.gz -C /apr
$ tar zxvf apr-util.tar.gz -C /apr-util
$ tar zxvf apr-iconv.tar.gz -C /apr-iconv
$ sh /apr/configure --prefix=/usr/local/apr && sh /apr/make && sh /apr/make install
$ sh /apr-iconv/configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr && sh /apr-iconv/make && sh /apr-iconv/make install
$ sh /apr-util/configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv && sh /apr-util/make && sh /apr-util/make install
$ tar /tomcat9/bin/tomcat-native.tar.gz -C /tomcat9/bin/tomcat-native
$ sh /tomcat9/bin/tomcat-native/native/configure && sh /tomcat9/bin/tomcat-native/native/make && sh /tomcat9/bin/tomcat-native/native/make install
启用APR,需要将server.xml文件中<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>的protocol修改为org.apache.coyote.http11.Http11AprProtocol
- 创建Tomcat实例
创建Tomcat实例,需要配合CATALINA_HOME和CATALINA_BASE环境变量来实现,为创建多个Tomcat实例,需要将conf、logs、temp、webapps、work这4个复制多次来实现,本次仅复制两个副本来实现。
$ mkdir -p /tomcat9/instances/tomcat9_1
$ mv /tomcat9/conf /tomcat9/webapps /tomcat9/logs /tomcat9/temp -t /tomcat9/instances/tomcat9_1
$ cp /tomcat9/instances/tomcat9_1 /tomcat9/instances/tomcat9_2
- 修改Tomcat实例端口
分别修改
/tomcat9/instances/tomcat9_1/conf/server.xml和/tomcat9/instances/tomcat9_2/conf/server.xml端口该为不同的,主要内容包括以下地方:
- Server 的 port
- Connector 的 port
- 编写Tomcat实例服务
编写系统服务脚本,并将系统服务脚本命名为tomcat9_1.service和tomcat9_2.service
tomcat9_1系统服务的CATALINA_BASE=/tomcat9/instances/tomcat9_1tomcat9_2系统服务的CATALINA_BASE=/tomcat9/instances/tomcat9_2
脚本需要存入/var/lib/systemd/system/文件下面,主要内容如下:
[Unit]
Description=Apache Tomcat 9 Web Service,AS Coding4fun Service
After=network.target
[Service]
Type=forking
ExecStart=/tomcat9/bin/jsvc \
-java-home /jdk1.8.0_261 \
-classpath /tomcat9/bin/bootstrap.jar:/tomcat9/bin/tomcat-juli.jar \
-outfile /var/logs/catalina9_1.out \
-errfile /var/logs/catalina9_1.err \
-pidfile /var/run/tomcat9_1.pid \
-Djava.library.path=/usr/local/apr/lib \ # APR可选
-Dcatalina.home=/tomcat9 \
-Dcatalina.base=/tomcat9/instances/tomcat9_1 \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
-Djava.util.logging.config.file=/tomcat9/instances/tomcat9_1/conf/logging.properties \
org.apache.catalina.startup.Bootstrap
ExecStop=/tomcat9/bin/jsvc \
-pidfile /var/run/tomcat9_1.pid \
-stop \
org.apache.catalina.startup.Bootstrap
[Install]
WantedBy=multi-user.target
注意
tomcat9_2实例需要替换以上脚本中所有的tomcat9_1为tomcat9_2。
- 创建系统服务
$ systemctl enable tomcat9_1.service
$ systemctl enable tomcat9_2.service
- 启动系统服务
$ systemctl start tomcat9_1
$ systemctl start tomcat9_2
- 检查系统服务是否启动成功
$ systemctl status tomcat9_1
$ systemctl status tomcat9_2
参考文章