一台服务器跑两个Tomcat,核心就是复制一份Tomcat目录、改掉server.xml里三个端口、用不同的启动脚本分别拉起。 只要端口不冲突、环境变量不串味,两个Tomcat完全可以像两个独立小工厂一样并行干活,下面拆开讲具体怎么操作,以及生产环境和云服务器上要注意的细节。
同一台服务器跑两个Tomcat端口冲突怎么办
先搞懂哪三个端口必须改
Tomcat的默认配置文件在conf/server.xml里,一个实例会用到几个关键端口,两个Tomcat同时启动时,如果这些端口都保持默认,第二个实例会因为端口被占用直接启动失败。
- Server端口:默认
8005,用来接收关闭命令,两个实例都监听8005,第二个会报Address already in use。 - HTTP连接器端口:默认
8080,这是用户访问网页的入口,同一台服务器跑两个Tomcat端口冲突怎么办,多数情况指的就是8080被占了。 - AJP连接器端口:默认
8009,用于Apache或Nginx反向代理与Tomcat之间通信,Tomcat 8.5之后的版本默认把AJP注释掉了,但只要启用就必须错开。 - HTTPS重定向端口:默认
8443,如果没启用HTTPS,可以不改;如果两个实例都要开HTTPS,8443也必须错开。
Apache Tomcat官方文档中,server.xml里的每个<Connector>和<Server>标签都有独立port属性,改完重启即可生效,行业共识认为,多实例部署最稳妥的方式就是每个实例一套独立端口段,互不重叠。
端口修改对照示例
| 端口类型 | 第一个Tomcat | 第二个Tomcat |
|---|---|---|
| Server关闭端口 | 8005 | 8006 |
| HTTP访问端口 | 8080 | 8081 |
| AJP端口 | 8009 | 8010 |
| HTTPS重定向端口 | 8443 | 8444 |
上面只是示例,实际数字可以根据需求调整,修改时别只改8080,忘了8005,否则关闭第二个Tomcat时会向第一个Tomcat发关闭命令,容易误杀。
一台服务器怎么部署两个Tomcat:完整操作步骤
准备工作:复制目录而不是共用目录
很多新手会犯一个错误:只复制一份Tomcat,然后想用同一个目录启动两次,这行不通,因为Tomcat启动时会往logs、work、temp目录写文件,两个进程共用一套目录会产生日志互相覆盖、临时文件冲突、JSP编译混乱等问题。
正确的做法是复制出两个完整目录,
/opt/tomcat-a/opt/tomcat-b
复制命令示例:
cp -r /opt/apache-tomcat-9.0.98 /opt/tomcat-a cp -r /opt/apache-tomcat-9.0.98 /opt/tomcat-b
两个目录各自独立,日志、配置、webapps互不干扰。
修改第二个Tomcat的server.xml
打开第二个Tomcat的配置文件:
vim /opt/tomcat-b/conf/server.xml
把三个端口按上面的对照表改掉,重点修改以下位置:
<Server port="8005" shutdown="SHUTDOWN">改为port="8006"<Connector port="8080" protocol="HTTP/1.1"改为port="8081"- 如果开启了AJP,
<Connector port="8009" protocol="AJP/1.3"改为port="8010" - 如果有HTTPS配置,把
redirectPort="8443"改为redirectPort="8444"
保存退出后,第二个Tomcat就和第一个在端口层面切开了。
用setenv.sh隔离环境变量
如果两个Tomcat跑在同一个Linux用户下,最常见的坑是CATALINA_HOME和CATALINA_BASE互相干扰,比如你在命令行执行startup.sh,脚本会根据当前环境变量找Tomcat目录,结果两个实例都去读同一个目录。
解决办法是给每个Tomcat单独写一个bin/setenv.sh文件,这个文件会被catalina.sh自动加载。
/opt/tomcat-a/bin/setenv.sh
export CATALINA_HOME=/opt/tomcat-a export CATALINA_BASE=/opt/tomcat-a export JAVA_OPTS="-Xms512m -Xmx1024m"
/opt/tomcat-b/bin/setenv.sh
export CATALINA_HOME=/opt/tomcat-b export CATALINA_BASE=/opt/tomcat-b export JAVA_OPTS="-Xms512m -Xmx1024m"
这样无论从哪个目录执行启动脚本,都会先加载对应实例的环境变量,不会串味。
分别启动并验证
启动两个Tomcat:
/opt/tomcat-a/bin/startup.sh /opt/tomcat-b/bin/startup.sh
查看进程:
ps -ef | grep tomcat
正常情况下会看到两个独立的Java进程,参数里分别带-Dcatalina.home=/opt/tomcat-a和-Dcatalina.home=/opt/tomcat-b。
查看监听端口:
ss -lntp | grep java
应该能看到8080和8081同时处于LISTEN状态,再用curl测试:
curl -I http://127.0.0.1:8080 curl -I http://127.0.0.1:8081
都返回HTTP状态码200,说明两个Tomcat已经正常对外提供服务。
生产环境一台服务器多个Tomcat资源怎么分配
内存分配不能拍脑袋
一台服务器跑多个Tomcat,最大的隐形成本是内存,每个Tomcat都是一个独立JVM进程,每个JVM都要单独占一份堆内存和元空间,业内专家指出,多实例部署时最容易犯的错误是给每个实例都按单实例的标准配置内存,结果总占用超过物理内存,触发系统Swap,性能断崖式下降。
分配原则:
- 先看服务器物理内存总量,给操作系统和其他服务预留一部分。
- 再根据每个Tomcat上跑的应用大小分配
-Xms和-Xmx。 -Xms和-Xmx保持一致,避免JVM运行中频繁扩容。- 元空间
-XX:MaxMetaspaceSize也要单独限制,否则两个实例的元空间都可能无限增长。
示例:一台16GB内存的服务器,系统预留2GB,留下14GB给两个Tomcat,可以给A实例-Xms4g -Xmx4g,B实例-Xms4g -Xmx4g,剩余6GB作为系统缓冲和其他程序使用,实际数值要结合应用压测结果调整,不能直接照搬。
单实例多应用与多实例对比
不少团队会纠结:到底是在一个Tomcat里塞多个Web应用,还是开多个Tomcat实例?
- 单Tomcat多应用:省内存,但应用之间共享JVM和类加载器,一个应用内存泄漏或频繁Full GC,会把整个Tomcat拖垮,类库版本冲突也常见,比如一个应用要用旧版Jackson,另一个要用新版,容易互相打架。
- 多Tomcat实例:隔离性好,一个实例重启不影响另一个实例,适合生产环境里不同业务线、不同重要级别的应用分开跑,缺点是内存和端口消耗更多,管理成本略高。
对于生产环境,多数情况下更推荐多实例部署,内存和CPU充足时,隔离性带来的稳定性收益远大于多占的那点资源。
简米云服务器跑两个Tomcat安全组怎么设置
如果是在简米云ECS上跑两个Tomcat,除了服务器内部配置,还要注意云安全组,简米云安全组默认只放开22端口和3389端口,8080和8081默认是不通的。
操作路径:
- 登录简米云控制台,进入ECS实例详情页。
- 点击“安全组”,选择当前实例绑定的安全组。
- 点击“入方向”规则,手动添加入方向规则。
- 端口范围填写
8080/8080,授权对象填写0.0.0/0,协议类型选TCP。 - 再添加一条规则,端口范围填写
8081/8081,其余同上。
如果2026年你用的是新版安全组,界面会略有不同,但核心逻辑不变:入方向放行TCP协议的8080和8081端口,生产环境建议授权对象不要用0.0.0/0,改成公司出口IP或负载均衡的内网IP,减少暴露面。
酷番云、华为云的设置思路一样,都是控制台找到安全组,添加入方向TCP规则放行对应端口。
一台服务器跑两个Tomcat常见问题速答
一台服务器跑两个Tomcat需要改哪些端口?
最少改三个:Server关闭端口默认8005、HTTP访问端口默认8080、AJP端口默认8009,如果启用了HTTPS,还要改8443,第二个实例建议改成8006、8081、8010,避免与第一个实例冲突。
两个Tomcat可以共用一个JDK吗?
可以,同一台服务器上的多个Tomcat实例完全可以共用同一个JDK,只需要JAVA_HOME指向同一个JDK目录即可,不同Tomcat实例之间不会因为共用JDK而互相影响,只有在需要不同Java版本时才需要配置多个JDK。
一台服务器多个Tomcat会影响性能吗?
会有一定影响,主要体现在内存和CPU竞争上,每个Tomcat都是独立JVM进程,会各自占用内存和线程,如果服务器内存充足、CPU核心数够多,影响很小;如果内存紧张,会触发Swap导致性能下降,因此多实例部署前要合理规划JVM内存参数,并监控服务器整体资源使用情况。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/645801.html





