最稳妥的方式是为每个项目单独配一个tomcat实例,实现进程级隔离;需复制实例、修改shutdown/http/ajp三端口、独立启停,并确保日志、临时目录、jvm参数及服务管理均分离。

最稳妥的方式是为每个项目单独配一个 Tomcat 实例,而不是塞进同一个 Tomcat 里。这样能真正实现进程级隔离,避免日志混杂、内存泄漏传染、配置冲突和重启牵连等问题。
推荐方案:多 Tomcat 实例(一项目一实例)
这是企业测试/预发布环境的主流做法,核心就三点:复制、改端口、独立启停。
- 从官方下载 zip 包解压出多个 Tomcat 目录,例如
tomcat-oa、tomcat-report、tomcat-api - 进每个实例的
conf/server.xml,修改三处端口:-
SHUTDOWN 端口:如
<server port="8015"></server>(原 8005) -
HTTP 服务端口:如
<connector port="8090"></connector>(原 8080) -
AJP 端口:如
<connector port="8019"></connector>(原 8009),不用可直接注释掉
-
SHUTDOWN 端口:如
- 把 WAR 包或解压后的应用目录放到对应实例的
webapps/下,启动各自bin/startup.sh(Linux)或startup.bat(Windows)
替代方案:单 Tomcat + Context 配置(仅限轻量、低风险场景)
如果资源极其紧张且项目完全可信、无依赖冲突,可在同一 Tomcat 的 conf/server.xml 的 <host></host> 标签下手动添加多个 <context></context>:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 例如:
<context docbase="/opt/apps/erp" path="/erp" reloadable="false"></context> -
docBase可用绝对路径,绕过webapps限制;path定义访问路径前缀 - 注意:所有项目共用 JVM、线程池、日志输出和类加载器,一旦某个项目触发 OOM 或 ClassLoader 泄漏,整个 Tomcat 就会卡死
关键隔离保障点
光改端口不够,还得关注这些细节才能真隔离:
-
日志分离:每个 Tomcat 实例的
logs/目录独立,不共享catalina.out -
临时文件隔离:修改各实例
conf/catalina.properties中的catalina.base和java.io.tmpdir,指向不同路径 -
JVM 参数独立设置:在各实例的
bin/setenv.sh(Linux)或setenv.bat(Windows)中配置专属堆内存、GC 策略等 -
服务化管理(Linux 推荐):为每个实例写 systemd
.service文件,用systemctl start tomcat-oa独立控制,支持开机自启和状态监控
为什么不建议 webapps 下放多个 WAR?
看似简单,实则隐患密集:
- 所有项目共用
lib/和common.loader,JAR 版本冲突极易引发NoClassDefFoundError或静态方法覆盖 - 一个项目调用
System.exit()或触发 full GC 飙升,会影响其他项目响应 - 无法单独重启某个项目——必须整机 reload,影响面不可控
- 健康检查、监控指标(如线程数、内存占用)只能看到整体,定位问题困难










