Tomcat中的大多数配置都会在server.xml文件中,server.xml的地位就好像nginx中的nginx.conf文件,因此我们想要学习配置tomcat的各类参数,最先开始学习的配置就是server.xml文件。
1、server.xml整体架构
首先我们需要知道server.xml中的xml代码块分类,tomcat官网将其主要分为四类:
- Top Level Elements:server块是整个配置文件的根元素,而service块代表与引擎关联的一组连接器(connector)。
- Connectors :表示外部客户端向特定服务发送请求和接收响应的接口(比如我们之前提到的coyote连接器以及对应的NIO等IO模式都是整个范畴内的概念)。
- Containers:容器(Container)负责处理传入的请求并创建相应的响应。Engine处理对Service的所有请求,Host处理对特定virtual host的所有请求,而Context处理对特定Web应用程序的所有请求。
- Nested Components:表示可以嵌套在Container元素内的元素。 注意一些元素可以嵌套在任何Container中,而另一些元素只能嵌套在Context中。
2、Top Level Elements
2.1 Server块
Server块代表的是整个catalina servlet容器。因此,它必须是conf/server.xml配置文件中最外面的单个元素。它的属性代表了整个servlet容器的特征。Tomcat9中默认的配置文件中Server块内嵌的子元素为 Listener、GlobalNamingResources、Service(可以嵌套多个)。具体的每个属性参数我们可以查询官网,下面解释默认的参数配置。
<Server port="8005" shutdown="SHUTDOWN">
<!--
port : Tomcat监听的关闭服务器的端口
shutdown : 关闭服务器的指令字符串
-->
<!-- 以日志形式输出服务器、操作系统、JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 启动和停止APR。如果找不到APR库会输出日志但并不影响tomcat正常启动 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<!--
注意这里的SSLEngine默认是打开的(on)
如果启用了apr作为连接器的协议
但是只配置了http而没有配置https
则会报错
-->
<!-- 用于避免JRE内存泄漏问题 -->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<!-- 用户加载(服务器启动)和销毁(服务器停止)全局命名服务 -->
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<!-- 用于在Context停止时重建Executor池中的线程, 以避免ThreadLocal相关的内
存泄漏 -->
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- GlobalNamingResources中定义了全局命名服务: -->
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<!--这里定义的文件就是我们前面配置manager和host manager的用户的文件-->
</GlobalNamingResources>
<Service>
...
</Service>
</Server>
2.2 Service块
Service元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。 默认情况下,Tomcat9中默认仅指定了Service的名称为Catalina。
<Service name="Catalina">
...
</Service>
Service 可以内嵌的元素为 : Listener、Executor、Connector、Engine ,详细的参数可以点击这里查看官网
- Listener 用于为Service 添加生命周期监听器
- Executor 用于配置Service 共享线程池
- Connector 用于配置 Service 包含的链接器
- Engine 用于配置Service中连接器(connector)对应的Servlet 容器引擎
2.3 Executor
executor表示可组件之间Tomcat中共享的线程池。默认情况下,Service并未添加共享线程池配置。executor实现了tomcat中的org.apache.catalina.Executor接口。 如果不配置共享线程池,那么Catalina 各组件在用到线程池时会独立创建。由于executor是Service元素的嵌套元素。为了使它能够被Connector使用,Executor元素必须出现在server.xml中的Connector元素之前。下面展示的是一个简单的executor的配置,具体的配置参数可以点这里查看官网:
<Executor name="tomcatThreadPool"
namePrefix="catalina‐exec‐"
maxThreads="200"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>
2.4 Connector
Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支 持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置, 只是根据需要对已有链接器进行优化。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-
port为监听的端口,如果设置为0,Tomcat将会随机选择一个可用的端口号给当前Connector 使用
-
protocol为Connector的协议,这里默认的是HTTP和AJP两种协议,后面可以指定对应协议的不同版本,默认情况下会检测本机是否配置了APR库,如果有并且 useAprConnector设置为true则会默认使用APR模式的IO协议,如果无则会使用NIO模式
-
connectionTimeOut :Connector 接收链接后的等待超时时间,单位为毫秒。 -1表示永不超时
-
redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合 security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口
-
executor : 指定前面提到的共享线程池的名称,也可以通过maxThreads、minSpareThreads 等属性对该connector进行单独配置对应的内部线程池
-
URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x和Tomcat9.x版本默认的编码为 UTF-8 , Tomcat7.x版本默认为ISO-8859-1
2.5 Engine
Engine 作为Servlet 引擎的顶级元素,内部可以嵌入: Cluster、Listener、Realm、 Valve和Host。
<Engine name="Catalina" defaultHost="localhost">
……
</Engine>
- name:用于指定Engine 的名称, 默认为Catalina
- defaultHost:默认使用的虚拟主机名称,当客户端请求访问的host无效时,会跳转到默认的host来处理请求
2.6 Host
Host 元素用于配置一个虚拟主机,它支持以下嵌入元素:Alias、Cluster、Listener、 Valve、Realm、Context
如果在Engine下配置Realm,那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm ,则在当前Host下的所有Context 中共享
Context中的Realm优先级 > Host的Realm优先级 > Engine中的Realm优先级
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Alias>www.example.com</Alias>
<Alias>www.example2.com</Alias>
</Host>
上面这一段Host的配置文件中还额外添加了Valve配置来实现自定义的日志记录。其中一些参数的详细信息和配置方式可以查看官网的说明
-
name: 当前Host通用的网络名称,也就是常用的域名,如果有多个域名对应同一个Host的应用,我们可以设置一个或多个Alias来实现访问
-
appBase:当前Host应用对应的目录,当前Host上部署的Web应用均在该目录下(相对路径和绝对路径均可),默认为webapps
-
unpackWARs:设置为true,Host在启动时会将appBase目录下war包解压为目 录。设置为false,Host将直接从war文件启动
-
autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用
2.7 Context
Context 用于配置一个Web应用,默认的配置如下。它支持的内嵌元素为:CookieProcessor,Loader,Manager,Realm,Resources,WatchedResource,JarScanner,Valve。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="myAppDeploy" path="/myApp">
....
</Context>
</Host>
- docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于该Context所属的Host中的appBase的相对路径。
- path:Web应用的Context的访问路径。
假设tomcat的安装目录为/home/tomcat9,Host为默认的localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp, 对应的部署文件所存放的路径为:/home/tomcat9/webapps/myAppDeploy。
原创文章,转载请注明出处:http://b.nwumba.cn/article/120/