Tomcat 9.0 多端口部署实战:3步配置 server.xml 启动 2 个独立 Web 应用

在企业级Java Web应用部署中,经常需要在一台服务器上运行多个独立应用。传统做法是部署多个Tomcat实例,但这会带来资源浪费和管理复杂度。本文将介绍如何通过 单Tomcat多Service配置 实现高效部署,既能节省服务器资源,又能保持应用隔离性。

1. 理解Tomcat核心架构

Tomcat的核心配置文件 server.xml 采用组件化设计,每个XML元素对应一个功能模块。要实现多应用独立部署,我们需要重点关注三个核心组件:

  • Service :服务单元,包含一组Connector和一个Engine
  • Connector :网络连接器,定义监听端口和协议
  • Engine :请求处理引擎,包含虚拟主机(Host)定义
<Server>
  <Service>
    <Connector port="8080"/>
    <Engine>
      <Host appBase="webapps"/>
    </Engine>
  </Service>
</Server>

表:Tomcat核心组件关系简表

组件 数量关系 关键属性 作用
Service 1-n个 name 封装一组Connector和一个Engine
Connector 1-n个 port, protocol 定义网络连接端口和协议
Engine 1个/Service defaultHost 请求处理管道
Host 1-n个/Engine appBase 虚拟主机定义

2. 多Service配置实战

下面我们通过具体配置实现两个Web应用分别通过8022和8023端口独立访问。

2.1 准备应用目录

首先为每个应用创建独立的部署目录:

cd $CATALINA_BASE
cp -r webapps webapps_app1  # 应用1目录
cp -r webapps webapps_app2  # 应用2目录

提示:生产环境中建议将目录放在Tomcat安装目录之外,便于升级维护

2.2 修改server.xml配置

打开 conf/server.xml ,在原有Service下方添加新Service配置:

<!-- 默认Service -->
<Service name="Catalina">
  <Connector port="8022" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
  <Engine name="Catalina" defaultHost="localhost">
    <Host name="localhost" appBase="webapps_app1"
          unpackWARs="true" autoDeploy="true">
    </Host>
  </Engine>
</Service>

<!-- 新增Service -->
<Service name="Catalina_app2">
  <Connector port="8023" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8444" />  
  <Engine name="Catalina_app2" defaultHost="localhost">
    <Host name="localhost" appBase="webapps_app2"
          unpackWARs="true" autoDeploy="true">
    </Host>
  </Engine>
</Service>

关键配置说明:

  1. Service name :必须唯一,第二个Service我们命名为"Catalina_app2"
  2. Connector port :8022和8023不能冲突,redirectPort也需不同
  3. Engine name :需与Service name保持一致
  4. appBase :指向各自的应用目录

2.3 部署WAR包

将两个应用分别打包成WAR文件,放置到对应目录:

# 应用1
cp app1.war $CATALINA_BASE/webapps_app1/

# 应用2 
cp app2.war $CATALINA_BASE/webapps_app2/

启动Tomcat后,两个应用将自动解压部署:

http://服务器IP:8022/app1
http://服务器IP:8023/app2 

3. 高级配置与优化

3.1 上下文路径定制

如果希望直接通过端口访问应用(不带应用名),可在Host中添加Context配置:

<Host name="localhost" appBase="webapps_app1"...>
  <Context path="" docBase="app1" reloadable="false"/>
</Host>

3.2 线程池优化

对于生产环境,建议为每个Service配置独立线程池:

<Service name="Catalina">
  <Executor name="tomcatThreadPool1" 
           maxThreads="200"
           minSpareThreads="25"/>
           
  <Connector executor="tomcatThreadPool1"
             port="8022".../>
</Service>

3.3 日志分离

为方便排查问题,应为不同Service配置独立日志:

<Engine name="Catalina"...>
  <Host...>
    <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs_app1"
           prefix="app1_access" 
           suffix=".log"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Host>
</Engine>

4. 常见问题解决方案

在实际部署中可能会遇到以下问题:

  1. 端口冲突

    • 使用 netstat -tlnp 检查端口占用
    • 确保不同Service的Connector端口和redirectPort都不重复
  2. 应用无法访问

    • 检查WAR包是否完整
    • 查看 logs/catalina.out 启动日志
    • 确认防火墙放行了对应端口
  3. Session串号

    • 确保不同Engine使用不同的jvmRoute
    <Engine name="Catalina" jvmRoute="node1">
    
  4. 内存配置

    • bin/setenv.sh 中为多Service增加内存分配:
    export JAVA_OPTS="-Xms512m -Xmx1024m"
    

这种部署方式特别适合以下场景:

  • 测试环境需要同时运行多个版本应用
  • 资源有限的中小型服务器
  • 需要隔离但又有资源共享需求的应用

相比多实例部署,单Tomcat多Service方案能节省30%-50%的内存占用,同时降低运维复杂度。根据实际压力测试,合理配置下单个Tomcat实例可以轻松支撑5-8个中型Web应用。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐