核心概念:CATALINA_HOME 与 CATALINA_BASE
要理解多实例部署,首先必须清晰地区分两个核心环境变量:CATALINA_HOME
和 CATALINA_BASE
。
CATALINA_HOME:指向Tomcat的安装根目录,其中包含了所有实例共享的核心文件和库,如
bin
和lib
目录,对于所有从同一个Tomcat版本派生出的实例,它们的CATALINA_HOME
都指向同一个路径,这极大地节省了磁盘空间。CATALINA_BASE:指向一个特定Tomcat实例的独立运行目录,每个实例都必须拥有自己独立的
CATALINA_BASE
,该目录包含了该实例专属的配置文件、日志、部署的应用程序以及临时工作文件,通常包括conf
,logs
,webapps
,temp
, 和work
这五个子目录。
通过这种模式,我们只需安装一份Tomcat作为 CATALINA_HOME
,然后为每个需要运行的实例创建一个独立的 CATALINA_BASE
目录即可。
部署步骤详解
以下是创建并运行两个Tomcat实例(tomcat1 和 tomcat2)的完整流程。
安装Java与Tomcat
确保系统已安装Java环境,下载并解压Tomcat,将其作为共享的 CATALINA_HOME
。
# 创建通用目录 sudo mkdir -p /opt/tomcat cd /opt/tomcat # 下载并解压Tomcat (以Tomcat 9为例) sudo wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz sudo tar -zxvf apache-tomcat-9.0.85.tar.gz sudo rm apache-tomcat-9.0.85.tar.gz # 将解压后的目录重命名为一个通用名称,方便未来升级 sudo mv apache-tomcat-9.0.85 CATALINA_HOME
创建实例目录结构
为每个实例创建独立的目录,并从 CATALINA_HOME
中复制必要的模板目录。
# 创建所有实例的父目录 sudo mkdir -p /opt/tomcat-instances # 创建第一个实例 tomcat1 的目录结构 sudo mkdir -p /opt/tomcat-instances/tomcat1 cd /opt/tomcat-instances/tomcat1 sudo mkdir conf logs temp work webapps # 从 CATALINA_HOME 复制默认配置文件 sudo cp -r /opt/tomcat/CATALINA_HOME/conf/* ./conf/ # 创建第二个实例 tomcat2 的目录结构 sudo mkdir -p /opt/tomcat-instances/tomcat2 cd /opt/tomcat-instances/tomcat2 sudo mkdir conf logs temp work webapps sudo cp -r /opt/tomcat/CATALINA_HOME/conf/* ./conf/
配置实例端口
这是避免冲突的关键一步,需要为每个实例修改其 conf/server.xml
文件中的三个主要端口。
- Server Port (关闭端口): 默认为
8005
。 - Connector Port (HTTP端口): 默认为
8080
。 - AJP Connector Port: 默认为
8009
。
我们可以为两个实例规划如下端口分配:
实例名称 | HTTP端口 | AJP端口 | 关闭端口 |
---|---|---|---|
tomcat1 | 8080 | 8009 | 8005 |
tomcat2 | 8081 | 8010 | 8006 |
编辑 /opt/tomcat-instances/tomcat2/conf/server.xml
,将上述端口修改为对应的值。
<!-- tomcat2/conf/server.xml --> <Server port="8006" shutdown="SHUTDOWN"> ... <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ... <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> ... </Server>
创建Systemd服务单元
为了方便管理,我们为每个实例创建一个独立的 systemd
服务文件。
创建 /etc/systemd/system/tomcat@.service
文件,注意,这里的 符号表示这是一个模板服务,我们可以通过它来启动不同的实例。
[Unit] Description=Apache Tomcat %i Web Application Container After=syslog.target network.target [Service] Type=forking User=tomcat Group=tomcat Environment="CATALINA_HOME=/opt/tomcat/CATALINA_HOME" Environment="CATALINA_BASE=/opt/tomcat-instances/%i" Environment="CATALINA_PID=/opt/tomcat-instances/%i/tomcat.pid" Environment="JAVA_OPTS=-Xms512M -Xmx1024M -Djava.security.egd=file:/dev/./urandom" ExecStart=/opt/tomcat/CATALINA_HOME/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID ExecStop=/opt/tomcat/CATALINA_HOME/bin/shutdown.sh SuccessExitStatus=143 [Install] WantedBy=multi-user.target
注意:上述配置中使用了 User=tomcat
,你需要创建一个 tomcat
用户并赋予相关目录权限,以确保安全。
# 创建tomcat用户 sudo useradd -r -s /bin/false tomcat # 授权目录 sudo chown -R tomcat:tomcat /opt/tomcat sudo chown -R tomcat:tomcat /opt/tomcat-instances
服务管理
可以使用 systemctl
来管理我们的Tomcat实例了,实例名由 符号后的部分指定。
# 重新加载systemd配置 sudo systemctl daemon-reload # 启动 tomcat1 实例 sudo systemctl start tomcat@tomcat1 # 启动 tomcat2 实例 sudo systemctl start tomcat@tomcat2 # 设置开机自启 sudo systemctl enable tomcat@tomcat1 sudo systemctl enable tomcat@tomcat2 # 查看实例状态 sudo systemctl status tomcat@tomcat1 sudo systemctl status tomcat@tomcat2
你可以通过浏览器访问 http://<服务器IP>:8080
和 http://<服务器IP>:8081
来验证两个实例是否都已成功运行。
相关问答FAQs
Q1: 为什么不直接复制整个Tomcat目录来创建多个实例,而是要使用CATALINA_BASE的方式?
A: 直接复制整个目录虽然简单,但存在明显弊端,它会成倍占用磁盘空间,因为每个实例都包含了一份完全相同的 bin
和 lib
文件,当需要升级Tomcat版本时,你不得不对每个复制的目录都进行一次操作,既繁琐又容易出错,而采用 CATALINA_HOME
和 CATALINA_BASE
分离的方式,所有实例共享一份核心程序,升级时只需替换 CATALINA_HOME
指向的目录即可,所有实例便会使用新版本,极大地提升了维护效率和资源利用率。
Q2: 如何快速确认服务器上哪个Tomcat实例正在使用哪个端口?
A: 在CentOS 7中,可以使用 ss
或 netstat
命令结合 grep
来查看,推荐使用 ss
命令,因为它更高效,执行以下命令:
sudo ss -tulpn | grep java
或者使用传统的 netstat
:
sudo netstat -tulpn | grep java
命令的输出会列出所有由Java进程(Tomcat是Java程序)监听的端口,输出结果会清晰地显示端口号、协议以及对应的进程ID(PID),你可以通过 ps -fp <PID>
命令进一步查看该进程的详细信息,从而确定它属于哪个Tomcat实例。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复