广告位联系
返回顶部
分享到

Tomcat Host组件深度介绍

Tomcat 来源:互联网 作者:佚名 发布时间:2026-09-25 18:06:53 人浏览
摘要

第1章:Tomcat容器体系概览 Tomcat作为Java EE规范下的轻量级Servlet容器,其架构设计高度模块化,核心思想是基于Container接口体系构建的分层组件模型。理解Tomcat的容器体系对于深入分析Host组件至

第1章:Tomcat容器体系概览

Tomcat作为Java EE规范下的轻量级Servlet容器,其架构设计高度模块化,核心思想是基于Container接口体系构建的分层组件模型。理解Tomcat的容器体系对于深入分析Host组件至关重要。

1.1 容器层级结构

Tomcat的核心容器体系包含四个主要接口:

层级 接口 描述
Engine Engine 服务器顶层容器,负责管理虚拟主机(Host),通常绑定一个端口
Host Host 虚拟主机容器,管理一个域名下的多个Web应用(Context)
Context Context 单个Web应用容器,负责Servlet、Filter、Listener的生命周期
Wrapper Wrapper 最底层Servlet容器,包装单个Servlet实例,处理请求调用

图示:Tomcat容器层级关系

1

2

3

4

5

6

Engine

├── Host (虚拟主机)

│   ├── Context (Web应用)

│   │   └── Wrapper (单个Servlet)

│   └── Context ...

└── Host ...

每个容器都实现了Container接口,提供生命周期管理、子容器管理及请求分发能力。Pipeline和Valve机制则提供可插拔的请求处理链。

1.2 Pipeline & Valve

每个Container都可绑定一个Pipeline对象,Pipeline中串联多个Valve组件:

  • Valve:类似拦截器,可以在请求到达实际Servlet前执行逻辑,如安全认证、访问日志记录、流量统计等。

  • Pipeline:负责管理多个Valve的执行顺序,并最终调用底层子容器处理请求。

    1

    2

    3

    4

    5

    // 请求处理流程示意

    public void invoke(Request request, Response response) {

        pipeline.getFirst().invoke(request, response); // 依次触发Valve链

        wrapper.invoke(request, response);            // 最终到达Servlet

    }

1.3 Engine与Host的角色

  • Engine:绑定端口(如8080),是Tomcat实例的入口,负责域名路由和虚拟主机选择。

  • Host:虚拟主机容器,每个Host可绑定一个或多个域名,实现多域名隔离、JSP编译配置及Host级安全控制。

1.4 Request路由概览

当HTTP请求进入Tomcat时,流程如下:

  • Connector接收Socket请求,将其封装为Request对象。

  • Engine根据请求的Host头匹配对应的Host容器。

  • Host根据请求路径选择Context(Web应用)。

  • Context根据请求路径匹配对应的Wrapper(Servlet)。

  • 请求沿Pipeline链执行各级Valve逻辑,最终到达目标Servlet。

这一分层设计保证了Tomcat高可扩展性,也为Host组件提供了灵活的虚拟主机管理能力。

第2章:Host组件核心功能详解

在Tomcat容器体系中,Host是虚拟主机管理容器,负责承载一个域名下的多个Web应用(Context)。理解Host的设计对多虚拟主机部署、请求分发和Host级安全策略配置至关重要。

2.1 Host的定位与职责

Host接口定义在org.apache.catalina.Host中,核心职责包括:

  • 虚拟主机管理Host可以绑定一个或多个域名,实现多域名隔离。例如:

    • www.example.com → Host A

    • admin.example.com → Host B

  • Web应用管理Host容器下可部署多个Context,每个Context对应一个Web应用。

  • 请求路由当Engine匹配到Host后,Host负责进一步根据请求路径路由到具体Context,然后最终到Wrapper(Servlet)。

  • Host级生命周期管理Host可以独立启动、停止和销毁,为每个Host提供独立的配置隔离。

  • Host级资源绑定Host可绑定JNDI资源、Realm安全策略,提供Web应用共享或隔离的资源访问环境。

2.2 StandardHost类概览

Tomcat中StandardHost是Host接口的主要实现类,位于org.apache.catalina.core.StandardHost(Tomcat 9.0.x):

1

2

3

4

5

6

7

8

9

public class StandardHost extends ContainerBase implements Host {

    // #L120 属性定义

    protected String name;       // Host名

    protected boolean autoDeploy;

    protected boolean deployOnStartup;

    protected Mapper mapper;     // 请求映射器

    protected HostConfig config; // Host配置器

    ...

}

2.2.1 主要属性解析

属性 作用
name Host名称,对应server.xml中的<Host name="...">
autoDeploy 是否启用自动部署Context
deployOnStartup 是否在Host启动时部署所有应用
mapper Host级Mapper,用于请求URL到Context的匹配
config HostConfig对象,负责部署Context和监听Host变化

2.2.2 StandardHost核心方法

  • startInternal():启动Host,初始化Mapper、HostConfig并加载Context(源码分析见2.3)

  • addChild(Container child):添加Context子容器

  • map(String uri):通过Mapper匹配请求到具体Context/Wrapper

  • findMapper(String protocol):获取Host的请求映射器

2.3 Host启动流程:startInternal方法分析

StandardHost.startInternal()方法是Host启动的核心入口(源码:StandardHost.java#L876),执行流程如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

@Override

protected synchronized void startInternal() throws LifecycleException {

    // L878 初始化基础

    super.startInternal();

    if (mapper == null) {

        mapper = createMapper(); // 初始化Host级Mapper

        mapper.setContainer(this);

    }

 

    // L888 启动HostConfig组件

    if (config == null) {

        config = createHostConfig();

        config.setHost(this);

        config.lifecycleStart();

    }

 

    // L897 部署应用

    if (deployOnStartup) {

        config.deployApps();

    }

 

    // L904 设置Host状态为STARTED

    setState(LifecycleState.STARTED);

}

2.3.1 流程解析

  • 基础初始化调用父类ContainerBase.startInternal(),初始化子容器列表和Pipeline。

  • Mapper初始化Mapper是Host级请求路由核心,负责将请求URI映射到Context/Wrapper。

  • HostConfig启动HostConfig监听conf/Catalina/<host>目录的变化,支持应用的热部署和自动重载。

  • 应用部署如果deployOnStartup=true,则调用HostConfig.deployApps()扫描appBase目录,部署所有Web应用。

  • 状态更新最后将Host状态标记为STARTED,Tomcat才能正常处理请求。

2.4 Mapper组件与Host的请求路由

Mapper是Host处理请求的关键组件,它通过Host名和URI路径确定请求目标Context。核心方法:

1

2

3

4

5

6

7

@Override

public Container map(Request request, boolean update) {

    String hostName = request.getServerName();

    Host host = (Host) container;

    Context context = host.findChild(getContextName(hostName, request.getRequestURI()));

    return context;

}

2.4.1 匹配逻辑

  • 域名匹配Mapper根据Host绑定的域名匹配请求头中的Host字段。

  • Context路径匹配根据请求URI选择最合适的Context。

  • Wrapper分派最终Context再将请求交给Wrapper(Servlet实例)处理。

通过这种分层匹配,Tomcat支持多虚拟主机与多Web应用的共存。

2.5 HostConfig部署机制概览

HostConfig是Host的部署管理器,主要职责:

  • 扫描appBase目录自动发现WAR文件或Context目录。

  • 部署Context调用Host.addChild()将Context注册到Host。

  • 监听文件变更实现热部署和自动重载。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    // 部署应用示意

    public void deployApps() {

        File appBaseDir = new File(host.getAppBase());

        for (File app : appBaseDir.listFiles()) {

            if (app.isDirectory() || app.getName().endsWith(".war")) {

                deploy(app);

            }

        }

    }

2.6 Host级Pipeline与Valve

Host可以绑定Valve实现Host级请求拦截:

1

2

3

Host host = ...;

host.getPipeline().addValve(new AccessLogValve());

host.getPipeline().addValve(new SecurityValve());

  • 作用范围:拦截所有通过该Host的请求

  • 典型用途:访问日志、IP白名单、认证校验

  • 与Context Valve的关系:Host Valve先执行,Context Valve后执行,形成分层链路。

2.7 Host与JNDI资源绑定

Host可以绑定JNDI资源,供其下所有Context共享:

1

2

3

4

5

6

<Host name="example.com" appBase="webapps">

    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"

              driverClassName="com.mysql.cj.jdbc.Driver"

              url="jdbc:mysql://localhost:3306/testdb"

              username="root" password="1234" maxTotal="20"/>

</Host>

  • 通过InitialContext获取资源:

    1

    2

    Context ctx = new InitialContext();

    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");

2.8 小结

  • Host是Tomcat虚拟主机核心容器,负责Context管理、请求分发、Host级资源绑定。

  • StandardHost类通过startInternal()方法实现启动初始化,并配合Mapper完成请求路由。

  • HostConfig负责应用部署和自动重载,是Host自动化运维能力的核心。

  • Host级Pipeline与Valve提供了请求拦截能力,为日志、认证、限流提供统一入口。

第3章:Host生命周期管理

Tomcat的Host不仅负责虚拟主机和Web应用管理,同时也是独立生命周期的容器单元。深入理解Host的生命周期对于部署监控、故障排查和性能优化至关重要。

3.1 生命周期概述

Host的生命周期由Lifecycle接口管理,核心阶段包括:

生命周期状态 描述
NEW 容器创建,尚未初始化
INITIALIZING 初始化配置,如Mapper、Pipeline、Valve等
STARTING 启动Host及其子容器(Context/Wrapper)
STARTED Host完全启动,可处理请求
STOPPING 停止请求处理,准备销毁资源
STOPPED 完全停止,资源释放完成
DESTROYING Host被销毁,不再可用

Host的生命周期严格遵循Tomcat Lifecycle接口定义,所有状态变化都会触发LifecycleEvent事件,供监听器(如HostConfig)处理。

3.2 Host启动流程(startInternal)

StandardHost.startInternal()是启动入口(源码:StandardHost.java#L876)。流程细化如下:

1

2

3

4

5

6

7

8

9

10

protected synchronized void startInternal() throws LifecycleException {

    super.startInternal(); // L878 初始化基础容器

    initMapper();          // L881 初始化Mapper

    initPipeline();        // L885 初始化Pipeline

    initHostConfig();      // L888 初始化HostConfig

    if (deployOnStartup) {

        config.deployApps(); // L897 部署应用

    }

    setState(LifecycleState.STARTED); // L904 设置状态

}

3.2.1 初始化Mapper

  • Mapper负责Host级请求路由:

    • 匹配Host名 → Context路径 → Wrapper

    • 支持多协议(HTTP/HTTPS)

  • 典型源码:

    1

    2

    3

    4

    5

    6

    protected Mapper createMapper() {

        Mapper mapper = new Mapper();

        mapper.setContainer(this);

        mapper.setProtocol("http");

        return mapper;

    }

3.2.2 Pipeline初始化

  • Host可绑定多级Valve:

    • Host级Valve先执行 → Context级Valve → Wrapper级Valve

  • 管道顺序确保Host全局策略优先,例如安全认证、访问日志。

3.2.3 HostConfig初始化与应用部署

  • HostConfig监听appBase目录,管理Context自动部署:

    1

    2

    3

    HostConfig config = new HostConfig();

    config.setHost(this);

    config.lifecycleStart();

     

  • deployApps()扫描WAR包或目录:

    检查web.xml和Context配置

    创建Context实例(StandardContext)

    调用Host.addChild()注册到Host

3.3 Context子容器生命周期交互

Host启动不仅仅是自身状态切换,还需要管理所有Context子容器的生命周期:

  • 启动阶段:

    • Host启动后,会逐个启动子Context

    • 调用Context.startInternal(),初始化Servlet、Filter和Listener

  • 停止阶段:

    • Host停止时,先停止子Context

    • 调用Context.stopInternal(),销毁Servlet实例并释放资源

  • 异常处理:

    • 如果子Context启动失败,不影响Host其他Context

    • 通过日志记录失败信息,便于排查部署问题

      1

      2

      3

      4

      5

      6

      7

      for (Container child : findChildren()) {

          try {

              child.start();

          } catch (LifecycleException e) {

              log.error("Context启动失败: " + child.getName(), e);

          }

      }

3.4 Host停止与销毁流程

3.4.1 stopInternal方法

StandardHost.stopInternal()负责Host停止:

1

2

3

4

5

6

7

8

9

10

protected synchronized void stopInternal() throws LifecycleException {

    setState(LifecycleState.STOPPING); // L950

    for (Container child : findChildren()) {

        child.stop(); // 停止所有Context

    }

    if (config != null) {

        config.lifecycleStop(); // 停止HostConfig

    }

    setState(LifecycleState.STOPPED); // L962

}

  • 顺序重要:

    先停止子容器 → 确保Servlet不再接收请求

    停止HostConfig → 释放监控和自动部署资源

    更新Host状态 → 防止请求路由到已停止Host

3.4.2 destroyInternal方法

destroyInternal()用于彻底销毁Host:

1

2

3

4

5

6

protected synchronized void destroyInternal() throws LifecycleException {

    for (Container child : findChildren()) {

        child.destroy(); // 销毁Context

    }

    super.destroyInternal(); // 销毁Pipeline、Mapper等

}

  • 释放Host级JNDI资源、线程池和Pipeline

  • Host销毁后,所有Context、Wrapper也随之销毁,确保内存和资源完全回收

3.5 生命周期事件与监听

Tomcat使用事件驱动机制:

  • LifecycleListener:监听Host状态变化

  • 典型用途:

    • 自动部署

    • JMX监控

    • 灰度发布(动态启停Context)

      1

      2

      3

      4

      5

      6

      7

      host.addLifecycleListener(new LifecycleListener() {

          public void lifecycleEvent(LifecycleEvent event) {

              if (Lifecycle.START_EVENT.equals(event.getType())) {

                  log.info("Host启动完成: " + host.getName());

              }

          }

      });

3.6 Host启动失败排查

Host启动失败常见原因:

错误类型 排查方法
配置错误 检查server.xml中Host节点的name/appBase是否正确
Context启动失败 查看logs/catalina.out,定位Context报错(如web.xml配置错误)
Mapper异常 确认Host绑定的域名与请求Host头匹配
HostConfig未启动 检查HostConfig组件是否正常加载,日志中有LifecycleException

3.7 Host热部署与自动重载

  • HostConfig可监控appBase目录

  • WAR包或目录新增、修改时,Host可自动部署或重载Context

  • autoDeploy=true 配合 deployOnStartup 可实现自动化运维

    1

    2

    3

    <Host name="example.com" appBase="webapps"

          autoDeploy="true" deployOnStartup="true">

    </Host>

  • 注意:热部署涉及ClassLoader隔离,Host级别的JVM共享机制保证多个Context不会相互干扰

第4章:虚拟主机实现原理

Tomcat通过Host组件实现**虚拟主机(Virtual Host)**功能,即在同一Tomcat实例上运行多个域名对应的Web应用。理解虚拟主机原理对于高可用架构、域名隔离部署及灰度发布至关重要。

4.1 虚拟主机概念

虚拟主机是指:

  • 多个域名指向同一Tomcat实例

  • 每个域名对应独立的Host

  • 每个Host可包含多个Context(Web应用)

在Tomcat中,层级关系如下:

1

2

3

4

5

6

7

Engine

 ├─ Host (虚拟主机)

 │   ├─ Context (Web应用)

 │   │   └─ Wrapper (Servlet)

 │   └─ Context

 └─ Host

     └─ Context

特点:

  • 隔离性:不同Host之间Context独立

  • JSP编译隔离:每个Host独立生成JSP类

  • 资源绑定独立:JNDI、Realm等资源可在Host级别独立配置

4.2 Host与域名匹配机制

Tomcat使用Mapper组件进行Host匹配(源码:StandardHost.java#L912):

1

2

3

4

5

6

7

public Container map(String uri, String hostName) {

    Container host = findChild(hostName); // 精确匹配

    if (host == null) {

        host = findDefaultHost(); // 默认Host fallback

    }

    return host.map(uri); // 继续Context/Wrapper匹配

}

4.2.1 精确匹配

  • Host节点的name属性必须与HTTP请求头Host一致

  • 匹配顺序:

    精确匹配子域名

    使用通配符(如*.example.com)

    fallback到defaultHost

4.2.2 多协议支持

  • Mapper支持HTTP和HTTPS协议

  • 可在server.xml配置多个Connector,每个Connector对应不同协议,映射到同一个Host或不同Host

    1

    2

    <Connector port="8080" protocol="HTTP/1.1"/>

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"/>

4.3 多虚拟主机配置示例

server.xml 配置

1

2

3

4

5

6

7

8

9

10

11

12

13

<Engine name="Catalina" defaultHost="www.example.com">

 

    <Host name="www.example.com" appBase="webapps/example"

          autoDeploy="true" deployOnStartup="true">

        <Alias>example.com</Alias>

    </Host>

 

    <Host name="shop.example.com" appBase="webapps/shop"

          autoDeploy="true" deployOnStartup="true">

        <Alias>shop.com</Alias>

    </Host>

 

</Engine>

说明:

  • Alias 支持额外域名绑定

  • 每个Host独立appBase目录,实现Web应用物理隔离

  • Host可独立配置Valve、Realm等组件

4.4 Host级JSP编译隔离

每个Host有独立的work目录,Tomcat在StandardHost.java#L1023初始化Host时设置:

1

2

3

if (workDir == null) {

    workDir = new File(catalinaBase, "work/" + getName());

}

  • 确保不同Host之间JSP类不会冲突

  • 支持灰度发布和多域名版本隔离

4.5 Host级Pipeline与Valve

Host的Pipeline位于请求分发前端,处理全局策略:

  • HostValve → ContextValve → WrapperValve

  • 常见HostValve功能:

    • IP黑名单/白名单

    • 访问日志记录

    • 安全认证

自定义HostValve示例

1

2

3

4

5

6

7

8

9

@ManagedBean(description="Host级自定义访问日志Valve")

public class HostAccessValve extends ValveBase {

 

    @Override

    public void invoke(Request request, Response response) throws IOException, ServletException {

        log.info("Host访问: " + request.getRequestURI());

        getNext().invoke(request, response);

    }

}

在server.xml中绑定:

1

2

3

<Host name="www.example.com" appBase="webapps">

    <Valve className="com.example.HostAccessValve"/>

</Host>

4.6 Host请求路由流程

  • 请求到达Connector

  • Mapper选择Host

    • HTTP头Host → 精确匹配Host.name或Alias

    • 如果无匹配 → 默认Host

  • Host管道处理

    • 执行Host级Valve

  • Mapper选择Context

    • URI路径匹配Context.path

  • Context管道处理

    • 执行Context级Valve

  • Wrapper处理Servlet

    • 找到对应Servlet,执行service()方法

流程保证多域名请求隔离,每个Host独立处理日志、认证和资源加载。

4.7 多域名绑定注意事项

场景 配置建议
同一域名指向不同Host 使用Alias + DNS轮询或反向代理(Apache/Nginx)
HTTPS多域名 每个Host可配置独立SSL证书或使用通配符证书
灰度发布 新版本部署到单独Host,通过负载均衡/Proxy切换流量

Apache反向代理示例

1

2

3

4

5

6

7

8

9

10

11

<VirtualHost *:80>

    ServerName www.example.com

    ProxyPass / http://localhost:8080/

    ProxyPassReverse / http://localhost:8080/

</VirtualHost>

 

<VirtualHost *:80>

    ServerName shop.example.com

    ProxyPass / http://localhost:8080/

    ProxyPassReverse / http://localhost:8080/

</VirtualHost>

  • Apache负责多域名路由

  • Tomcat内部依然通过Host精确匹配处理请求

4.8 Host安全与Realm交互

  • Host可配置Realm,实现域名级安全策略

  • 每个Host可以独立绑定:

    • JDBCRealm

    • MemoryRealm

    • JNDIRealm

      1

      2

      3

      <Host name="www.example.com">

          <Realm className="org.apache.catalina.realm.MemoryRealm"/>

      </Host>

  • Host启动时Realm初始化,所有子Context继承或覆盖安全策略

  • 请求认证在HostValve阶段即可生效,提高安全隔离

第5章:HostConfig部署机制

在Tomcat中,HostConfig是Host的部署管理组件,负责自动发现、部署和管理Web应用,包括WAR包、上下文配置、目录结构及生命周期管理。理解HostConfig机制对于自动化部署、热部署及灰度发布非常关键。

5.1 HostConfig概述

  • HostConfig位于org.apache.catalina.startup.HostConfig

  • 绑定到StandardHost实例,通过LifecycleListener方式监听Host生命周期

  • 核心职责:

    部署应用:扫描appBase目录下WAR包和Context XML文件

    更新应用:检测文件变化,自动重新部署

    卸载应用:清理过期或删除的应用

HostConfig与Host的关系

1

2

3

4

StandardHost

 ├─ Pipeline (Valves)

 ├─ Children (Contexts)

 └─ HostConfig (LifecycleListener)

  • HostConfig通过监听Host的start/stop事件,控制Context的部署和销毁

5.2 HostConfig部署流程源码解析

5.2.1 部署入口

HostConfig在Host启动时自动触发:

1

2

3

4

5

public void lifecycleEvent(LifecycleEvent event) {

    if (Lifecycle.START_EVENT.equals(event.getType())) {

        deployApps();

    }

}

5.2.2 deployApps方法核心逻辑

源码位置:HostConfig.java#L350

1

2

3

4

5

6

7

8

9

10

11

12

protected void deployApps() {

    File appBase = new File(host.getAppBaseFile());

    if (!appBase.isDirectory()) return;

 

    // 扫描WAR包和目录

    File[] files = appBase.listFiles();

    for (File f : files) {

        if (f.isDirectory() || f.getName().endsWith(".war")) {

            deploy(f);

        }

    }

}

  • 扫描appBase目录

  • 区分WAR包与目录

  • 调用deploy(File f)方法进行部署

5.2.3 deploy(File f)方法实现

源码位置:HostConfig.java#L400

1

2

3

4

5

6

7

8

9

10

11

12

protected void deploy(File app) {

    String contextPath = "/" + app.getName();

    if (contextPath.endsWith(".war")) {

        contextPath = "/" + app.getName().substring(0, app.getName().length() - 4);

    }

 

    Context context = host.createContext(contextPath, app.getAbsolutePath());

    context.setReloadable(host.getAutoDeploy());

 

    host.addChild(context); // 将Context加入Host

    context.start();        // 启动Context

}

关键点:

  • Context路径生成:WAR包名 → Context path

  • Context创建:使用StandardContext实例

  • Host管理:通过addChild加入Host容器

  • 生命周期管理:调用start启动Context

5.3 自动部署机制

5.3.1 定时扫描

  • HostConfig使用定时任务(默认10秒)扫描appBase目录

  • 检测新增/删除/修改的Web应用

  • 自动执行deploy或undeploy

5.3.2 deployXML机制

  • HostConfig还会扫描$CATALINA_BASE/conf/[enginename]/[hostname]/目录下的*.xml文件

  • XML文件可自定义Context配置,例如:

    1

    2

    3

    4

    5

    6

    7

    8

    <Context docBase="webapps/demo" path="/demo" reloadable="true">

        <Resource name="jdbc/demoDB" auth="Container"

                  type="javax.sql.DataSource"

                  driverClassName="com.mysql.cj.jdbc.Driver"

                  url="jdbc:mysql://localhost:3306/demo"

                  username="root" password="123456"

                  maxActive="20" maxIdle="10"/>

    </Context>

  • 自动生成Context对象并加入Host

5.4 HostConfig与JNDI资源绑定

  • Context创建时,可通过HostConfig加载Host级别的JNDI资源

  • 源码位置:HostConfig.java#L512

    1

    context.getNamingResources().addResource(resource);

  • HostConfig确保所有部署的Context能够访问Host定义的全局资源

  • 例如数据库连接池、邮件服务等

5.5 热部署与灰度发布

5.5.1 热部署流程

  • HostConfig检测到appBase目录下新WAR包

  • 创建新的Context实例

  • 启动Context

  • 如果Context启动成功,旧版本可选择卸载

  • 实现无缝切换,支持零停机部署

5.5.2 灰度发布示例

  • 新版本部署到独立Host(如gray.example.com)

  • Apache/Nginx按比例转发流量

  • 部署完成后,将流量逐步切换至新Host

  • HostConfig自动管理Context生命周期

5.6 HostConfig与Pipeline交互

  • 部署Context时,HostConfig确保Context继承Host的Pipeline(Valve链)

  • 示例:

    1

    2

    3

    Context ctx = host.createContext("/app", appBasePath);

    ctx.getPipeline().addValve(new AccessLogValve());

    host.addChild(ctx);

  • 所有请求经过HostValve → ContextValve → WrapperValve,保证Host策略生效

5.7 HostConfig配置示例

server.xml片段

1

2

3

4

<Host name="www.example.com" appBase="webapps"

      autoDeploy="true" deployOnStartup="true">

    <Alias>example.com</Alias>

</Host>

  • autoDeploy="true":启用自动部署

  • deployOnStartup="true":Host启动时部署现有应用

  • HostConfig监听Host的Lifecycle事件,执行部署逻辑

自定义Host部署器示例

1

2

3

4

5

6

7

8

public class CustomHostConfig extends HostConfig {

 

    @Override

    protected void deploy(File app) {

        System.out.println("自定义部署: " + app.getName());

        super.deploy(app); // 保留原有部署逻辑

    }

}

  • 可以在server.xml中替换默认HostConfig

  • 用于灰度策略、日志增强或定制化WAR部署

5.8 部署故障排查技巧

问题 排查方法
Context未启动 查看catalina.out日志,检查deploy异常
WAR包冲突 确认Context path是否重复,检查appBase目录
自动部署失败 检查autoDeploy和deployOnStartup属性
JNDI资源未绑定 确认Context XML中Resource配置正确,且HostConfig已加载

5.9 小结

  • HostConfig是Host容器的部署管理核心

  • deployApps方法扫描appBase目录并创建Context

  • 支持WAR包、目录和XML配置方式

  • 与HostPipeline、JNDI资源及Realm紧密结合

  • 提供自动部署、热部署和灰度发布能力

  • 支持自定义Host部署器,增强工程化部署能力


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计