3.3 Tomcat 主要配置文件 3.3 Tomcat 主要配置文件详解 Tomcat 作为一款流行的开源 Servlet 容器和 Java 应用服务器,其灵活性和可配置性是其核心优势之一。为了实现各种功能和满足不同环境的需求,Tomcat 提供了丰富的配置文件。理解并熟练配置这些文件,是掌握 Tomcat 的关键步骤。本章节将深入探讨 Tomcat 的主要配置文件,帮助您全面了解 Tomcat 的配置体系。 3.3.1 Tomcat 配置文件概述 Tomcat 的配置文件主要集中在 目录下(通常 与 相同,即 Tomcat 安装目录)。这些文件采用 XML 格式,结构清晰,易于阅读和修改。
Tomcat 作为一款流行的开源 Servlet 容器和 Java 应用服务器,其灵活性和可配置性是其核心优势之一。为了实现各种功能和满足不同环境的需求,Tomcat 提供了丰富的配置文件。理解并熟练配置这些文件,是掌握 Tomcat 的关键步骤。本章节将深入探讨 Tomcat 的主要配置文件,帮助您全面了解 Tomcat 的配置体系。
Tomcat 的配置文件主要集中在 $CATALINA_BASE/conf 目录下(通常 $CATALINA_BASE 与 $CATALINA_HOME 相同,即 Tomcat 安装目录)。这些文件采用 XML 格式,结构清晰,易于阅读和修改。主要的配置文件包括:
server.xml: Tomcat 的核心配置文件,用于配置 Tomcat 服务器实例的全局设置,包括端口、连接器(Connector)、引擎(Engine)、虚拟主机(Host)、Realm、Valve 等。它是最重要、也是最复杂的配置文件。
web.xml: 默认的 Web 应用程序部署描述符。它定义了应用于所有 Web 应用程序的默认 Servlet、Filter、Listener 等配置。每个 Web 应用程序也可以有自己的 web.xml 文件,位于 WEB-INF 目录下,用于覆盖或扩展全局 web.xml 的配置。
context.xml: 用于配置 Context(上下文),代表一个独立的 Web 应用程序。可以配置数据源、资源、会话管理器、安全设置等。Context 配置可以放在 $CATALINA_BASE/conf/context.xml (全局默认 Context),或者在 $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default (Host 默认 Context),或者在每个 Web 应用程序的 META-INF/context.xml 中(推荐方式)。
tomcat-users.xml: 用于配置 Tomcat 用户和角色信息,主要用于 Tomcat 自带的管理工具(如 Manager 应用和 Host Manager 应用)的身份验证。
logging.properties: 配置 Tomcat 的日志系统,包括日志级别、日志输出格式、日志文件位置等。Tomcat 使用 java.util.logging 包进行日志管理。
catalina.properties: Tomcat 的属性配置文件,可以定义 Tomcat 启动和运行时使用的各种属性,例如类加载器配置、JNDI 资源配置等。
jaspic-providers.xml 和 jaspic-modules.xml: 用于配置 Java Authentication Service Provider Interface for Containers (JASPIC),用于自定义身份验证模块。
以下 Mermaid 图表展示了这些配置文件之间的关系以及它们在 Tomcat 配置体系中的位置:
接下来,我们将逐个深入探讨这些主要配置文件。
server.xml - 核心配置文件详解server.xml 是 Tomcat 最核心的配置文件,它定义了 Tomcat 服务器的整体架构和运行参数。理解 server.xml 的结构和元素是配置 Tomcat 的基础。
server.xml 的基本结构
server.xml 的根元素是 <Server>,它代表整个 Tomcat 服务器实例。一个 <Server> 元素可以包含以下主要子元素:
<Service>: 代表一个或多个 Connector 和一个 Engine 的组合。一个 Tomcat 服务器可以有多个 Service,但通常至少有一个名为 "Catalina" 的 Service。
<Connector>: 定义 Tomcat 接收客户端请求的连接器。常见的 Connector 类型有 HTTP Connector (处理 HTTP 请求) 和 AJP Connector (用于与 Apache 等 Web 服务器集成)。
<Engine>: Servlet 引擎,负责处理 Connector 接收到的请求,并将请求分发到相应的虚拟主机(Host)和 Web 应用程序(Context)。
<Host>: 代表一个虚拟主机,用于托管一个或多个 Web 应用程序。可以配置域名、Web 应用程序部署目录等。
<Realm>: 用于配置用户身份验证和授权。Tomcat 提供了多种 Realm 实现,如 UserDatabaseRealm (基于 tomcat-users.xml)、JDBCRealm (基于数据库) 等。
<Valve>: 代表一个请求处理阀门,用于在请求处理管道中执行特定的操作,如日志记录、安全检查、会话管理等。
<Listener>: 定义在 Tomcat 生命周期事件发生时执行的操作,例如启动和停止事件。
以下 Mermaid 图表更清晰地展示了 <Server> 元素内部的主要结构:
代码实践与详解
下面我们通过代码示例和详细解释来深入了解 server.xml 中各个主要元素的配置。
1. <Server> 元素
<Server> 元素是 server.xml 的根元素,它代表整个 Tomcat 服务器实例。
<Server port="8005" shutdown="SHUTDOWN"> </Server>
port: 指定关闭服务器的端口。默认值是 8005。当 Tomcat 接收到发送到此端口的 "SHUTDOWN" 命令时,服务器将优雅地关闭。
shutdown: 指定关闭服务器的命令字符串。默认值是 "SHUTDOWN"。
2. <Service> 元素
<Service> 元素代表一个服务,通常包含一个 Engine 和一个或多个 Connector。默认的 Service 名称是 "Catalina"。
<Service name="Catalina"> </Service>
name: Service 的名称,用于标识不同的 Service。默认值为 "Catalina"。3. <Connector> 元素
<Connector> 元素定义了 Tomcat 接收客户端请求的连接器。最常用的 Connector 是 HTTP Connector 和 AJP Connector。
HTTP Connector (处理 HTTP 请求)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
port: 监听的 HTTP 端口。默认值是 8080。
protocol: 使用的协议。对于 HTTP Connector,通常设置为 HTTP/1.1 或 org.apache.coyote.http11.Http11NioProtocol (NIO 模式)。
connectionTimeout: 连接超时时间,单位是毫秒。默认值是 20000 毫秒 (20 秒)。
redirectPort: 如果需要使用 SSL/TLS,指定重定向到安全端口的端口号。通常设置为 HTTPS Connector 的端口 (例如 8443)。
HTTPS Connector (处理 HTTPS 请求)
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="${user.home}/.keystore" keystorePass="changeit" />
port: 监听的 HTTPS 端口。通常设置为 8443。
protocol: 通常使用 NIO 或 APR 协议,例如 org.apache.coyote.http11.Http11NioProtocol。
SSLEnabled: 启用 SSL/TLS 加密。设置为 true 启用 HTTPS。
scheme: 协议方案,设置为 https。
secure: 指示 Connector 是安全的。设置为 true。
clientAuth: 是否需要客户端身份验证。false 表示不需要,true 表示需要。
sslProtocol: 使用的 SSL/TLS 协议版本,例如 TLS、SSLv3 等。建议使用 TLS。
keystoreFile: 密钥库文件路径,存储服务器的证书和私钥。
keystorePass: 密钥库密码。
AJP Connector (与 Apache 集成)
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
port: 监听的 AJP 端口。默认值是 8009。
protocol: 设置为 AJP/1.3 或 org.apache.coyote.ajp.AjpNioProtocol (NIO 模式)。
redirectPort: 如果需要使用 SSL/TLS,指定重定向到安全端口的端口号。
4. <Engine> 元素
<Engine> 元素是 Servlet 引擎,负责处理请求并将请求路由到相应的虚拟主机。
<Engine name="Catalina" defaultHost="localhost"> </Engine>
name: Engine 的名称。默认值是 "Catalina"。
defaultHost: 默认虚拟主机的名称。当请求的 Host 头信息与任何配置的 <Host> 都不匹配时,请求将被路由到默认虚拟主机。默认值是 "localhost"。
jvmRoute: 在集群环境中,用于 Session Sticky 会话保持的 JVM 路由名称。
5. <Host> 元素
<Host> 元素代表一个虚拟主机,用于托管一个或多个 Web 应用程序。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host>
name: 虚拟主机的域名。例如 "localhost" 或 "www.example.com"。
appBase: Web 应用程序的部署目录。默认值是 "webapps",相对于 $CATALINA_BASE 目录。
unpackWARs: 是否自动解压 WAR 文件。设置为 true 表示自动解压,false 表示不解压。建议设置为 true。
autoDeploy: 是否自动部署 Web 应用程序。设置为 true 表示自动检测 appBase 目录下的 Web 应用程序并自动部署,false 表示不自动部署。建议在开发环境设置为 true,生产环境根据需要设置。
deployOnStartup: Tomcat 启动时是否部署 Web 应用程序。默认值为 true。
xmlValidation 和 xmlNamespaceAware: 用于控制 Context XML 文件的验证。通常保持默认值即可。
6. <Context> 元素 (在 server.xml 中嵌套)
虽然更推荐在单独的 context.xml 文件中配置 Context,但也可以在 <Host> 元素中直接嵌套 <Context> 元素来配置 Web 应用程序。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/myapp" docBase="myapp" reloadable="true"> </Context> </Host>
path: Web 应用程序的上下文路径。例如 "/myapp"。
docBase: Web 应用程序的文档根目录,可以是相对于 appBase 的路径,也可以是绝对路径。例如 "myapp"。
reloadable: 是否启用热部署。设置为 true 表示当 Web 应用程序的类或配置文件发生更改时,Tomcat 会自动重新加载应用程序。建议在开发环境设置为 true,生产环境设置为 false 以提高性能。
7. <Realm> 元素
<Realm> 元素用于配置用户身份验证和授权。常用的 Realm 实现包括 UserDatabaseRealm 和 JDBCRealm。
UserDatabaseRealm (基于 tomcat-users.xml)
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
className: Realm 实现的类名。对于 UserDatabaseRealm,设置为 org.apache.catalina.realm.UserDatabaseRealm。
resourceName: JNDI 资源名称,用于查找用户数据库资源。对于 UserDatabaseRealm,通常设置为 "UserDatabase",与 context.xml 中配置的 <Resource> 对应。
JDBCRealm (基于数据库)
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC" connectionName="username" connectionPassword="password" userTable="users" userNameCol="user_name" userCredCol="user_password" userRolesTable="user_roles" roleNameCol="role_name" roleUserCol="user_name"/>
className: Realm 实现的类名。对于 JDBCRealm,设置为 org.apache.catalina.realm.JDBCRealm。
driverName: 数据库驱动类名。
connectionURL: 数据库连接 URL。
connectionName: 数据库用户名。
connectionPassword: 数据库密码。
userTable: 用户表名。
userNameCol: 用户名列名。
userCredCol: 用户密码列名。
userRolesTable: 用户角色关联表名。
roleNameCol: 角色名列名。
roleUserCol: 用户角色关联表中的用户外键列名。
8. <Valve> 元素
<Valve> 元素代表请求处理阀门,用于在请求处理管道中执行特定的操作。
AccessLogValve (访问日志)
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" resolveHosts="false"/>
className: Valve 实现的类名。对于访问日志 Valve,设置为 org.apache.catalina.valves.AccessLogValve。
directory: 日志文件存放目录,相对于 $CATALINA_BASE 目录。默认值是 "logs"。
prefix: 日志文件名前缀。
suffix: 日志文件名后缀。
pattern: 日志格式模式。
resolveHosts: 是否解析主机名。false 表示不解析,使用 IP 地址,可以提高性能。
9. <Listener> 元素
<Listener> 元素定义在 Tomcat 生命周期事件发生时执行的操作。
AprLifecycleListener (APR 支持)
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
className: Listener 实现的类名。对于 APR 生命周期 Listener,设置为 org.apache.catalina.core.AprLifecycleListener。
SSLEngine: 是否启用 APR SSL 引擎。设置为 "on" 启用。
总结 server.xml
server.xml 是 Tomcat 最核心的配置文件,理解其结构和各个元素的作用至关重要。通过合理配置 server.xml,可以定制 Tomcat 服务器的各种行为,满足不同的应用场景需求。
web.xml - 默认 Web 应用程序部署描述符web.xml 文件是 Web 应用程序的部署描述符,用于配置 Servlet、Filter、Listener、欢迎页面、错误页面、安全约束等。Tomcat 提供了全局默认的 web.xml 文件,位于 $CATALINA_BASE/conf/web.xml。这个文件定义的配置会应用于所有部署在 Tomcat 上的 Web 应用程序,除非 Web 应用程序自身在 WEB-INF/web.xml 中覆盖了这些配置。
web.xml 的主要元素
<servlet>: 定义 Servlet。
<servlet-mapping>: 将 Servlet 映射到 URL 模式。
<filter>: 定义 Filter。
<filter-mapping>: 将 Filter 映射到 URL 模式或 Servlet。
<listener>: 定义 Listener。
<welcome-file-list>: 定义欢迎页面列表。
<error-page>: 定义错误页面。
<session-config>: 配置会话管理。
<security-constraint>: 定义安全约束。
<mime-mapping>: 定义 MIME 类型映射。
<jsp-config>: 配置 JSP 相关的设置。
代码实践与详解
以下是一个简单的默认 web.xml 文件示例,展示了一些常用的配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>Default Web Application Deployment Descriptor</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> <session-config> <session-timeout>30</session-timeout> <!-- 单位:分钟 --> </session-config> <mime-mapping> <extension>html</extension> <mime-type>text/html</mime-type> </mime-mapping> </web-app>
<display-name>: Web 应用程序的显示名称。
<welcome-file-list>: 定义欢迎文件列表。当用户访问 Web 应用程序的根目录时,Tomcat 会按照列表顺序查找欢迎文件,找到第一个存在的文件就返回给用户。
<error-page>: 定义错误页面。当发生指定的 HTTP 错误代码时,Tomcat 会将请求转发到指定的错误页面。
<session-config>: 配置会话管理。<session-timeout> 子元素定义会话超时时间,单位是分钟。
<mime-mapping>: 定义 MIME 类型映射。将文件扩展名映射到 MIME 类型,以便浏览器正确处理不同类型的文件。
web.xml 的作用
默认 web.xml 文件提供了一组全局的默认配置,可以简化 Web 应用程序的部署和配置。例如,通过在默认 web.xml 中配置常用的 Servlet 和 Filter,可以避免在每个 Web 应用程序的 web.xml 中重复配置。
context.xml - Context 上下文配置文件context.xml 文件用于配置 Tomcat 的 Context(上下文),代表一个独立的 Web 应用程序。Context 配置可以放在多个位置,优先级从低到高依次为:
$CATALINA_BASE/conf/context.xml: 全局默认 Context 配置,应用于所有 Web 应用程序。
$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default: Host 默认 Context 配置,应用于指定 Host 下的所有 Web 应用程序。
$CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml: 特定 Web 应用程序的 Context 配置,应用于指定的 Web 应用程序。文件名必须与 Web 应用程序的上下文路径或 WAR 文件名相同。
[webapp]/META-INF/context.xml: Web 应用程序自身的 Context 配置,推荐的配置方式。
context.xml 的主要元素
<Resource>: 定义 JNDI 资源,例如数据源 (DataSource)、邮件会话 (MailSession) 等。
<Realm>: 配置 Context 级别的安全 Realm,会覆盖 server.xml 中 Engine 级别的 Realm。
<Manager>: 配置会话管理器,例如持久化会话管理器。
<Loader>: 配置类加载器。
<Parameter>: 定义 Context 初始化参数。
<Environment>: 定义 Context 环境变量。
<Valve>: 配置 Context 级别的 Valve,仅应用于当前 Context。
<Listener>: 配置 Context 级别的 Listener,仅应用于当前 Context。
代码实践与详解
以下是一个 META-INF/context.xml 文件示例,展示了如何配置数据源:
<?xml version="1.0" encoding="UTF-8"?> <Context reloadable="true"> <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC" username="dbuser" password="dbpassword" maxActive="20" maxIdle="10" maxWait="-1"/> </Context>
<Context reloadable="true">: 根元素 <Context>,reloadable="true" 表示启用热部署。
<Resource>: 定义 JNDI 资源。
name: JNDI 资源名称,例如 "jdbc/mydb"。
auth: 身份验证类型,通常设置为 "Container"。
type: 资源类型,例如 "javax.sql.DataSource" 表示数据源。
driverClassName: 数据库驱动类名。
url: 数据库连接 URL。
**`