在Linux环境中,Apache Tomcat作为一款广泛应用的Java Web应用服务器,其强大的虚拟主机功能允许在单个服务器实例上托管多个独立的网站或应用,这不仅极大地提高了资源利用率,也简化了多项目的管理与部署,理解并熟练配置Tomcat的虚拟主机,是后端工程师和系统管理员必备的技能之一,其核心配置工作主要围绕着server.xml文件展开,该文件是Tomcat的“大脑”,定义了整个服务器的结构、组件和行为。

核心配置文件:server.xml
Tomcat的所有核心配置都位于其安装目录下的conf文件夹中,其中server.xml是最为关键的文件,要配置虚拟主机,我们需要编辑此文件,虚拟主机的定义嵌套在<Engine>元素内部,而<Engine>本身又位于<Service>元素之中,其基本层级结构如下:
<Server>
<Service>
<Connector ... />
<Engine ...>
<Host ... />
<Host ... />
...
</Engine>
</Service>
</Server>
<Engine>元素代表处理所有请求的引擎容器,它有一个非常重要的属性defaultHost,该属性指定了当请求的Host名称无法匹配任何已定义的<Host>时,默认由哪个虚拟主机来处理,确保defaultHost的值与其中一个<Host>的name属性相匹配至关重要。
<Host>元素详解
<Host>元素是虚拟主机配置的核心,每一个<Host>实例就代表一个独立的虚拟主机(即一个域名或网站),它包含了多个关键属性,用于定义该主机的行为。
name:这是最核心的属性,用于指定虚拟主机的域名,例如www.example.com,Tomcat会根据HTTP请求头中的Host字段与该值进行匹配。appBase:指定该虚拟主机下的Web应用程序存放目录,这个路径可以是相对于$CATALINA_BASE(Tomcat实例根目录)的相对路径,也可以是绝对路径。webapps是默认值,如果为每个虚拟主机指定独立目录,可以写sitea。unpackWARs:布尔值属性,决定Tomcat是否会自动将部署的WAR文件解压成目录结构,设置为true便于调试,设置为false则直接运行WAR包,节省磁盘空间。autoDeploy:布尔值属性,决定Tomcat是否在运行时自动监控appBase目录,并部署新的或更新后的应用程序,在开发环境建议设为true,生产环境则可能根据需要关闭以实现更严格的部署控制。
<Host>元素还可以包含子元素,如<Alias>用于为该主机添加域名别名,<Context>用于定义具体的应用上下文,以及<Valve>用于配置访问日志等。
实战配置示例
假设我们需要在一台Tomcat服务器上同时托管两个网站:www.sitea.com和www.siteb.com。
第一步:准备应用目录和文件
在Tomcat的$CATALINA_BASE目录下创建两个独立的应用目录:

mkdir sitea mkdir siteb
将sitea.war和siteb.war分别放入对应目录,并重命名为ROOT.war,Tomcat默认会将ROOT应用作为该Host的根应用。
$CATALINA_BASE/
├── conf/
├── sitea/
│ └── ROOT.war
├── siteb/
│ └── ROOT.war
└── ...
第二步:修改server.xml
编辑$CATALINA_BASE/conf/server.xml,在<Engine name="Catalina" ...>元素内添加两个<Host>配置。
<Engine name="Catalina" defaultHost="www.sitea.com">
<!-- 虚拟主机 A -->
<Host name="www.sitea.com" appBase="sitea" unpackWARs="true" autoDeploy="true">
<!-- 可选:添加域名别名,使sitea.com也能访问 -->
<Alias>sitea.com</Alias>
<!-- 配置访问日志 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="sitea_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<!-- 虚拟主机 B -->
<Host name="www.siteb.com" appBase="siteb" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="siteb_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
第三步:本地测试与DNS解析
在本地测试时,可以通过修改/etc/hosts文件(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)来模拟DNS解析:
0.0.1 www.sitea.com
127.0.0.1 www.siteb.com
保存文件后,重启Tomcat服务,即可在浏览器中通过这两个域名访问对应的应用。
<Host>元素关键属性小编总结
| 属性名 | 描述 | 示例值 |
|---|---|---|
name |
虚拟主机的主机名(域名) | www.example.com |
appBase |
Web应用的存放基础目录 | webapps, /var/tomcat/app1 |
unpackWARs |
是否自动解压WAR文件 | true, false |
autoDeploy |
是否自动部署新应用 | true, false |
deployOnStartup |
Tomcat启动时是否自动部署appBase下的应用 |
true, false |
相关问答FAQs
Q1:我已经修改了server.xml文件并重启了Tomcat,但为什么我的新虚拟主机无法访问,或者访问的却是另一个网站?

A1: 这个问题通常由以下几个原因造成,请检查server.xml的XML语法是否正确,任何标签闭合错误或拼写错误都可能导致配置失败,可以查看Tomcat的启动日志($CATALINA_BASE/logs/catalina.out),里面通常会详细列出配置错误,确认<Engine>的defaultHost属性设置是否正确,如果请求的域名没有匹配到任何<Host>的name属性,Tomcat会将其路由至defaultHost指定的主机,请确保你的DNS解析或本地hosts文件配置无误,并且请求的域名与<Host>的name属性完全一致。
Q2:我希望example.com和www.example.com都指向同一个Web应用,应该如何配置?
A2: 这是在虚拟主机配置中非常常见的需求,最佳实践是使用<Alias>子元素,在你对应的<Host>配置内部,添加一个或多个<Alias>标签即可。
<Host name="www.example.com" appBase="example-app" ...> <Alias>example.com</Alias> <!-- 其他配置 --> </Host>
这样配置后,无论是用户访问www.example.com还是example.com,Tomcat都会将请求交由这个名为www.example.com的虚拟主机处理,从而访问到同一个appBase下的应用,这种方法比配置两个独立的<Host>指向同一个appBase更加简洁和高效。