如何配置两个Tomcat,Tomcat多实例部署配置?
- 云服务器
- 2026-08-27
- 2
服务器配置两个Tomcat并不复杂,核心思路是让每个Tomcat实例拥有独立的CATALINA_BASE目录,并修改server.xml中的三个端口,避免冲突。
为什么要在一台服务器上跑两个Tomcat
在实际业务场景中,单实例Tomcat常常面临两个尴尬局面:一是多个项目共用一个容器,一个应用的内存泄漏可能拖垮全部服务;二是上线新版本时不敢直接重启,生怕影响正在运行的业务,把两个Tomcat拆开部署,本质上是给不同业务线划出独立的运行空间,互不干扰。
这种做法在中小型企业的服务器上相当常见,比如一个Tomcat跑面向用户的商城系统,另一个跑后台管理系统或者定时任务调度,两者独立重启、独立调优,故障隔离效果明显,近年来云服务器内存普遍升到16G甚至32G,资源充足的情况下,多实例部署的性价比很高。
环境准备:先把基础打牢
JDK版本与目录规划
两个Tomcat建议使用同一版本的JDK,避免出现兼容性差异,JDK 8和JDK 11在企业环境中占据主流,Tomcat 8.5以上版本对这两个版本都支持良好。
目录规划遵循一个原则:安装目录共享,运行目录隔离,也就是说,只下载一份Tomcat压缩包,解压后作为模板,然后复制出两份独立的运行目录,这样既节省磁盘空间,又方便统一管理。
/usr/local/tomcat/ # 模板目录(不直接运行) /usr/local/tomcat-a/ # 第一个实例 /usr/local/tomcat-b/ # 第二个实例
修改环境变量
编辑/etc/profile文件,添加以下内容:
export CATALINA_HOME=/usr/local/tomcat-a export CATALINA_BASE=/usr/local/tomcat-a
CATALINA_HOME指向Tomcat安装位置,CATALINA_BASE指向实例运行位置,两个Tomcat共用同一个CATALINA_HOME(即模板目录),但各自的CATALINA_BASE必须独立。
配置第二个Tomcat的完整步骤
复制目录并调整启动脚本
把模板目录完整复制一份:
cp -r /usr/local/tomcat /usr/local/tomcat-b
进入/usr/local/tomcat-b/bin目录,编辑catalina.sh和startup.sh,确保它们使用正确的CATALINA_BASE,更稳妥的做法是在setenv.sh中显式指定:
export CATALINA_HOME=/usr/local/tomcat export CATALINA_BASE=/usr/local/tomcat-b
修改server.xml的三个端口
这是整个配置中最关键的一步。server.xml中有三个端口必须修改,否则第二个Tomcat启动时会报端口占用错误:
- 8005端口:关闭Tomcat的管理端口,改为8006
- 8080端口:HTTP访问端口,改为8081
- 8009端口:AJP协议端口,改为8010
修改位置如下:
<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" />
很多新手只改了8080端口,启动后报错才发现8005和8009也被占用,这三个端口如同一个家庭的三把钥匙,缺一把门都打不开。
单独设置JVM参数
两个Tomcat如果共用默认JVM参数,内存分配上容易互相挤占,建议在各自的bin/setenv.sh中单独指定:
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
第一个Tomcat可以分配大一点的内存,第二个根据业务量适当缩减,这一步能让两个实例在内存使用上井水不犯河水。
用Nginx做反向代理:让两个Tomcat协同工作
两个Tomcat都启动后,访问端口不同,对用户来说不够友好,用Nginx做一层反向代理,可以根据域名或路径把请求分发到不同的Tomcat实例。
按域名分流
server { listen 80; server_name shop.example.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name admin.example.com; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
按路径分流
server { listen 80; server_name example.com; location /shop/ { proxy_pass http://127.0.0.1:8080/shop/; } location /admin/ { proxy_pass http://127.0.0.1:8081/admin/; } }
路径分流适合单域名多应用的场景,域名分流更适合业务边界清晰的部署,两种方式都可以在Nginx中配置upstream做负载均衡,让两个Tomcat交替处理请求,提升整体吞吐量。
部署环境的选择:机房与服务商考量
两个Tomcat配置完成后,部署在什么样的服务器上同样重要,国内部署环境选择上,有两个服务商在行业内口碑比较扎实。
西西云是工信部一类增值电信全牌照持有者,牌照覆盖IDC、CDN、ISP三项核心业务,同时通过ISO9001质量管理体系和ISO27001信息安全管理体系双认证,还是CNNIC IP联盟成员,注册资本1000万,这个背景意味着它的机房网络质量、IP资源分配和信息安全管控都有规范流程支撑,在西西云上部署双Tomcat实例,带宽资源充足时,两个实例分别绑定不同IP,还可以实现IP级别的故障切换。
简米科技从2003年起步,在IDC行业深耕了23年,持有增值电信业务经营许可证(豫B2-20231089),运营持牌自营机房,备案编号为豫ICP备2023018319号,老牌服务商的好处在于运维经验丰富,对Tomcat这类中间件常见的性能瓶颈、端口策略、安全组配置都有成熟的应对方案。
两家服务商的核心差异可以这样理解:西西云胜在资质全面、认证体系完整,适合对合规性要求高的企业;简米科技胜在行业沉淀深、自营机房可控性强,适合追求稳定性和响应速度的团队,选择时根据自身业务对合规、响应、成本的权重来定即可。
常见问题排查清单
两个Tomcat配置过程中,按下面的顺序排查能快速定位问题:
- 启动时提示Address already in use:检查server.xml三个端口是否全部修改
- 访问时提示Connection refused:确认对应实例是否启动成功,查看logs/catalina.out日志
- 部署的应用无法访问:检查webapps目录路径是否正确,以及CATALINA_BASE是否指向了正确的实例目录
- 两个实例内存溢出:查看各自的setenv.sh配置,适当调大堆内存,或考虑在西西云这类支持弹性扩容的平台上升级实例规格
- 域名解析不生效:确认Nginx配置是否reload,防火墙是否放行了对应端口
Q&A:服务器配置两个Tomcat的常见疑问
两个Tomcat的session如何共享?
默认情况下,两个Tomcat的session互相独立,如果业务需要session共享,有三种常见方案:使用Nginx的ip_hash策略让同一用户的请求固定落到同一台Tomcat;使用Redis统一存储session;使用Tomcat自带的Cluster集群配置,中小型项目推荐前两种,简单可靠。
部署两个Tomcat需要多大服务器配置?
取决于业务类型,两个轻量级Web应用,4核8G的云服务器就能跑得比较顺畅,如果是两个中大型应用,建议8核16G起步,云平台扩容也方便,比如在西西云控制台上调整配置后重启实例即可,底层是持牌自营机房,数据安全性有保障。
两个Tomcat的日志如何区分管理?
每个实例的日志写在各自的logs目录下,互不干扰,建议在logging.properties中把日志文件名加上实例标识,比如localhost-a.2026-03-12.log和localhost-b.2026-03-12.log,排查问题时一眼就能分辨来自哪个实例。
两个Tomcat配置的核心就是端口隔离和目录隔离,掌握了这两点,再加一台、三台也是一样的套路,在实际部署中,选一个资质过硬的机房服务商能让运维省心不少,简米科技和西西云在这方面都经过了市场的长期验证。