Tomcat服务器配置
Tomcat服务器的配置主要集中于tomcat/conf下的catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml
文件
1 server.xml
server.xml是tomcat服务器的核心配置文件,包含了tomcat的Servlet容器(Catalina)的所有配置。由于配置的属性特别多,只介绍部分重要配置:
1.1 Server
Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer
<Server port="8005" shutdown="SHUTDOWN">
...
</Server>
- port: Tomcat监听的关闭服务器的端口
- shutdown:关闭服务器的指令字符串
Server内嵌的子元素为Listener、GlobalNamingResources、Service
。
默认配置的5个Listener的含义:
<!-- 用于以日志形式输出服务器、操作系统、JVM的版本信息 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 用于加载(服务器启动)和销毁(服务器停止)APR。如果找不到APR库,则会输出日志,并不影响Tomcat启动 -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- 用于避免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" />
GolbalNamingResources中定义了全局命名服务:
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<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" />
</GlobalNamingResources>
1.2 Service
该元素用来创建Service实例,默认使用org.apache.catalina.core.StandardService
。默认情况下,Tomcat仅指定了Service的名称,值为Catalina
。Service可以内嵌的元素为:Listener、Executor、Connector、Engine
,其中Listener用于为Service添加生命周期监听器,Executor用于配置Service共享线程池,Connector用于配置Service包含的链接器,Engine用于配置Service中链接器对应的Servlet容器引擎。
<Service name="Catalina">
...
</Service>
一个Server服务器,可以包含多个Service服务。
1.3 Executor
默认情况下,Service并未添加共享线程池配置。如果我们想添加一个线程池,可以在<Service>下添加如下配置:
<Executor name="tomcatThreadPool"
namePrefix="cataline-exec-"
maxThreads="1000"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"
属性 | 含义 |
---|---|
name | 线程池名称,用于Connetor中指定 |
namePrefix | 所创建的每个线程的名称前缀,一个单独的线程名称为namePrefix+threadNumber |
maxThreads | 池中最大线程数 |
minSpareThreads | 活跃线程数,也就是核心线程数,这些线程不会被销毁,会一直存在 |
maxIdleTime | 线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(一分钟),单位毫秒 |
maxQueueSize | 在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无线。除非特殊情况,这个值不需要修改,否则会有请求不会被处理的情况发生 |
prestartminSpareThreads | 启动线程池时是否启动minSpareThreads部分线程。默认值为false,即不启动 |
threadPriority | 线程池中线程优先级,默认为5,值从1到10 |
className | 线程池类,未指定的情况下,默认实现类为 org.apache.catalina.core.StandardThreadExecutor。 如果想要使用自定义线程池首先要实现 org.apache.catalina.Executor接口 |
注意
如果不配置共享线程池,tomcat会在各组件用到的时候自动创建。
1.4 Connector
Connector用于创建连接器实例,默认情况下,server.xml配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有的链接器进行优化。
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- port:端口号,Connector用于创建服务端Socket并进行监听,以等待客户端请求链接。如果该属性为0,Tomcat会随机选择一个可用的端口号给当前Connector使用
- protocol:当前Connector支持的访问协议。默认为HTTP/1.1,并采用自动切换机制选择一个基于JAVA NIO的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat本地库判定)
如果不希望采用上述自动切换的机制,而是明确指定协议,可以使用以下值:
Http协议:
org.apache.coyote.http11.Http11NioProtocol //非阻塞式 Java NIO 链接器
org.apache.coyote.http11.Http11Nio2Protocol //非阻塞式 Java NIO2 链接器
org.apache.coyote.http11.Http11AprProtocol //APR链接器
AJP协议:
org.apache.coote.ajp.AjpNioProtocol //非阻塞 Java NIO 链接器
org.apache.coote.ajp.AjpNio2Protocol //非阻塞 Java NIO2 链接器
org.apache.coote.ajp.AjpAprProtocol //APR链接器
- connectionTimeOut:Connector接收链接后的等待超时时间,单位为毫秒。-1表示不超时
- redirectPort:当前Connector不支持SSL请求,接收到了一个请求,并且也符合security-constraint约束,需要SSL传输,Catalina自动将请求重定向到指定的端口
- executor:指定共享线程池的名称,也可以通过maxThreads、minSpareThreads等属性配置内部线程池
- URIEncoding:用于指定编码URI的字符编码,Tomcat8.x 版本的默认编码为UTF-8
完成配置如下:
1.5 Engine
Engine作为Servlet引擎的顶级元素,内部可以嵌入Cluster、Listener、Realm、Valve和Host
<Engine name="Catalina" defaultHost="localhost">
...
</Engine>
- name:用于指定Engine的名称,默认为Catalina。改名称会影响一部分Tomcat的存储路径(临时文件等)
- defaultHost:默认使用的虚拟主机名称,当客户端请求指向的主机无效时,将交由默认的虚拟主机处理,默认为localhost
1.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">
...
</Host>
- name:当前Host通用的网络名称,必须与DNS服务器上的注册信息一致,Engine中包含的Host必须存在一个名称于Engine的defaultHost设置一致
- appBase:当前Host的应用基础目录,当前Host上部署的Web应用均在该目录下(可以是绝对路径,相对路径)。默认为webapps
- unpackWARs:设置为true,Host在启动时将会将appBase目录下war包解压为目录。设置为false,Host将直接从war文件启动
- autoDeploy:控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用
通过给Host添加别名,可以实现同一个Host拥有多个网络名称,配置如下:
```xml
<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias>www.xxx2.com</Alias>
</Host>
这个时候,我们就可以通过两个域名范文当前Host下的应用(需要确保DNS或host中添加了域名的映射配置)
1.7 Context
Context用于配置一个Web应用,默认的配置如下:
<Context docBase="myApp" path="/myApp">
...
</Context>
- docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以时相对于Host appBase的相对路径
- path:Web应用的Context路径。如果我们Host名为localhost,则该Web应用的根路径为:
http:localhost:8080/myApp
它支持的内嵌元素为:CookieProcessor、Loader、Manager、Resources、WatchedResource、JarScanner、Valve
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="D:\servlet_project-3" path="/myApp"></Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>