在服务器上配置两个Tomcat并不复杂,核心在于修改端口和独立设置环境变量,确保两个实例互不干扰地运行。
一台服务器部署两个tomcat的核心步骤
很多场景下,我们需要在一台物理机或云服务器上同时运行两个Tomcat实例,比如开发环境隔离不同项目、测试阶段模拟集群、或者将多个应用部署到同一台服务器以节省成本,行业共识认为,这种多实例配置比单实例更灵活,但需要做好端口与路径的隔离。参考2
环境准备与下载
确保你已经安装了JDK,并设置了JAVA_HOME,接着准备两个Tomcat压缩包,或者通过复制一个已解压的Tomcat目录来创建第二个实例,建议使用不同的目录名称,比如tomcat_instance1和tomcat_instance2。
- 下载Tomcat (推荐9或10版本,根据应用需求选择)
- 解压到两个不同目录,例如
/usr/local/tomcat1和/usr/local/tomcat2
配置第一个Tomcat实例
第一个实例可以直接使用默认配置,但建议先确认默认端口(如8080、8005、8009)未被占用,如果你需要修改,可以编辑server.xml中的三个关键端口:
- shutdown端口(默认8005):用于关闭Tomcat的监听端口。
- HTTP连接器端口(默认8080):浏览器访问的端口。
- AJP连接器端口(默认8009):用于与Apache等前端服务器集成。
配置第二个Tomcat实例的关键端口修改
第二个实例必须修改默认端口,否则会与第一个冲突,这是整个“服务器配置两个tomcat”过程中最容易被忽略的环节,你需要将第二个实例的server.xml中所有端口偏移一个固定值,比如加1000。
- 修改
为<Server port="8005" shutdown="SHUTDOWN">
<Server port="8006" shutdown="SHUTDOWN"> - 修改
<Connector port="8080" protocol="HTTP/1.1"为<Connector port="8081" protocol="HTTP/1.1" - 修改
<Connector port="8009" protocol="AJP/1.3"为<Connector port="8010" protocol="AJP/1.3"
这样第二个实例的HTTP访问端口就是8081,启动时不会与第一个实例的8080冲突。
设置独立的环境变量
两个Tomcat实例需要拥有各自的CATALINA_HOME和CATALINA_BASE。CATALINA_HOME指向Tomcat的安装目录,CATALINA_BASE则指向实例的工作目录(存放日志、临时文件、部署的应用等),对于多实例,建议将CATALINA_BASE设置为每个实例的独立目录,而CATALINA_HOME可以共用同一个Tomcat软件包。
- 在启动脚本中(如
startup.sh)显式设置CATALINA_HOME和CATALINA_BASE,或者通过setenv.sh(Linux)或setenv.bat(Windows)来配置。 - 在第二个实例的
bin/setenv.sh中添加:export CATALINA_HOME=/usr/local/tomcat2 export CATALINA_BASE=/usr/local/tomcat2如果两个实例共用同一个Tomcat软件包,则
CATALINA_HOME指向同一个目录,但CATALINA_BASE必须不同。参考2
双tomcat配置如何避免端口冲突?
端口冲突是最常见的错误,除了修改第二个实例的Connector端口,还需要注意其他Tomcat内部使用或预留的端口,比如jmxremote、rmi等,如果实例间需要通信,请确保没有端口重复。
使用偏移量批量修改端口
一个简单的方法是将第二个实例的所有端口都增加一个偏移量,比如1000,这样很多隐藏端口也能自动避开,但如果你手动修改,记得检查
server.xml中所有数字。
- shutdown端口:8005 → 18005
- HTTP端口:8080 → 18080
- AJP端口:8009 → 18009
- 重定向端口(在Connector中配置的redirectPort):8443 → 18443
验证端口是否被占用
启动第二个实例前,使用netstat -tlnp | grep 端口号检查端口是否已被其他进程占用,如果占用,需要再调整或停止冲突的进程。
配置双tomcat后如何管理服务
启动和停止两个实例需要分别调用各自的startup.sh和shutdown.sh,为了方便,可以编写两个独立的系统服务(systemd)或使用脚本统一管理。
创建独立的启动脚本
在Linux下,可以为每个实例创建一个systemd单元文件,例如tomcat1.service和tomcat2.service,指定不同的CATALINA_BASE和CATALINA_HOME,这样可以用systemctl start tomcat1和systemctl start tomcat2分别控制。
使用catalina.sh脚本
直接调用catalina.sh start和catalina.sh stop,但需要确保当前环境变量指向正确的实例,建议在脚本中硬编码:
export CATALINA_HOME=/usr/local/tomcat1
export CATALINA_BASE=/usr/local/tomcat1
/usr/local/tomcat1/bin/catalina.sh start
常见问题与解决
第二个Tomcat无法启动
检查日志文件catalina.out或catalina.log,常见原因包括:参考2
- 端口冲突:修改不彻底,遗漏了某个端口。
- 权限问题:确保
CATALINA_BASE目录可写。 - 环境变量错误:
CATALINA_HOME或JAVA_HOME设置不正确。
应用部署后无法访问
确认应用部署到了正确的webapps目录下,如果使用CATALINA_BASE,部署目录应在$CATALINA_BASE/webapps,如果两个实例共用同一个webapps,会导致应用冲突。
内存溢出
多实例会消耗双倍内存,根据服务器物理内存大小,调整每个实例的JAVA_OPTS,例如在setenv.sh中设置-Xms512m -Xmx1024m,如果服务器内存有限,可以减少堆内存或增加物理内存。
服务器配置两个tomcat的常见疑问
一台服务器配置两个tomcat和安装两个tomcat软件包有什么区别?
本质上是一样的,多实例意味着在同一套Tomcat软件基础上运行多个独立进程,但也可以完全复制两份Tomcat软件,前者更节省磁盘空间,后者更易于隔离,大多数情况下,使用同一个Tomcat软件包配合不同的CATALINA_BASE即可。
配置双tomcat后,如何同时访问两个应用?
通过不同端口访问,例如第一个实例用http://服务器IP:8080/应用名,第二个实例用http://服务器IP:8081/应用名,如果想让它们共用80端口,需要在前面加一层反向代理(如Nginx),根据域名或路径转发。
云服务器配置双tomcat需要注意什么?
云服务器通常有安全组规则,需要开放对应的端口(如8080、8081),如果实例数量多,建议监控内存和CPU使用情况,避免资源耗尽,价格方面,双tomcat比双服务器便宜很多,适合中小型项目。
配置两个Tomcat实例的关键就是端口隔离和环境变量独立,按照上述步骤操作,基本不会出现问题,尝试在测试环境中先跑通,再迁移到生产环境,可以避免很多坑。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/532682.html



