一 server.xml
server.xml 是tomcat 的核心配置文件,位于./conf/ 下.具有server,connector
Hosts 等元素模块。接下来我们看看吧。(导游介绍词)。本文内容基于tomcat 8.5 不同版本配置或有差异性。
tomcat 8.5是基于Servlet 3.1和JavaServer Pages 2.3。
tomcat 测试war包下载路径 测试war包
server.xml 结构图(还有些其他元素没有加入)
1.1 server 配置
server 是server.xml 的最外层元素,常用的属性有:
属性 | 描述 | 示例 |
---|---|---|
className | 要使用的java 类名 | |
address | 服务器等待接收shutdown 命令的地址,默认localhost | |
port | 接收shutdown命令的端口,设置为-1 为禁用关闭端口,也就是你不能通过这种方式来关闭了,这样就会影响你使用脚本(catalina.sh 或者是shutdown.sh)来stop了,默认绑定8005端口 | port="8005" |
shutdown | 指定shutdown 命令的别名,默认值SHUTDOWN | shutdown="SHUTDOWN" |
1.2 service 配置
service 是 server 的内层。可以将一个多个service 放在server 层里,
一个service 里面可以有多个 Connector 和一个Engine .
service 的属性
属性 | 描述 |
---|---|
className | 要使用的java类名,未指定的话就使用标准的实现 |
name | service显示的名称 |
1.3 Executor
官方文档链接
这个元素我们在平时配置的过程中用得比较少,它主要用于在多个connector 之间进行共享线程池。它的位置应该在 connector 之前,这样才能生效。
Executor 的属性 :
属性 | 描述 | 示例 |
---|---|---|
className | 要使用的java类名 | |
name | 用于在server.xml中的其他位置引用此池的名称。该名称是必需的,必须是唯一的。 | |
threadPriority | 执行程序中线程的优先级 ,默认为5 | |
daemon | 线程是否为守护线程,默认为 True | |
namePrefix | 每个线程的名称的前缀,单个线程的名称=namePrefix+threadNumber | |
maxThreads | 该线程池中最大的线程数,默认为200 | |
minSpareThreads | 最小线程数,就是在空闲时保持的最少线程数 ,默认为25 | |
maxIdleTime | 空闲线程关闭之前等待的时间,单位毫秒,默认是6000毫秒也就是一分钟 | |
maxQueueSize | 最大任务等待的数量,默认值是Integer.MAX_VALUE,也就是2147483647(java int整数的最大值) | |
prestartminSpareThreads | 是否应该在启动Executor时启动minSpareThreads,默认值为 false |
1.4 Connector 配置
关于 Connector 官网链接
当前以下所有的说明是针对 tomcat 8.5版本来说的,其他版本详情见官方文档。
参数 | 含义 | 示例 |
---|---|---|
port | 绑定的端口,如果设置为0,tomcat则随机获取一个空闲端口 | 默认 port="8080" |
protocol | 传输协议和版本 | 默认 protocol = "HTTP/1.1" |
connectionTimeout | 连接超时时间,单位毫秒 | 默认 connectionTimeout="20000" |
redirectPort | 接收到的ssl请求后重定向的端口 | 默认 redirectPort="8443" |
maxThreads | tomcat能创建来处理请求的最大线程数,也为最大并发数 超过则放入请求队列中进行排队,默认值为200;需要根据业务和系统性能进行调整 | maxThreads="1000" |
URIEncoding | url的字符编码,在tomcat8.5版本中,该值默认为UTF-8,除非在org.apache.catalina.STRICT_SERVLET_COMPLIANCE 将system property 设置为true才会使用ISO-8859-1 | URIEncoding="UTF-8" |
minProcessors | 启动时创建的线程数(最小线程数) | minProcessors="50" |
acceptCount | 指定当所有可以使用的处理请求的线程数都被使用时,可以放到队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接 默认值为100 | acceptcount="500" |
acceptorThreadCount | 可以用于接受连接的进程数,默认为1,但是在一些多核的的服务器上,我们会将它的值设置为2或者更大的数,来应对一些不活跃的连接。 | |
minSpareThreads | 最小空闲线程数,任何情况都会存活的线程数,即便超过了最大空闲时间,也不会被回收,默认值10; | minSpareThreads="25" |
maxSpareThreads | 最大空闲线程数,在最大空闲时间(maxIdleTime)内活跃过,此时空闲,当空闲时间大于maxIdleTime则被回收,小则继续存活,等待被调度,默认值50; | |
enableLookups | 调用request、getRemoteHost()执行DNS查询,以返回远程主机的主机名,如果设置为false,则直接返回IP地址 默认是禁用的,在请求过滤中的根据远程主机名过滤,需要将该参数设置为true | enableLookups="false" |
maxIdleTime | 最大空闲时间,超过这个空闲时间,且线程数大于minSpareThreads的,都会被回收,默认值1分钟(60000ms) | maxPostSize |
address | 对于一些具有多个ip的服务器,我们可以通过该参数指定绑定的ip,默认情况下监听所有的地址 | address="192.168.1.110" |
compressibleMimeType | 该值用来指定哪些文件类型的文件可以进行压缩,默认值为:text/html,text/xml,text/plain,text/css,text/javascript,application/javascript | |
compression | 开启gzip 压缩,可以接受的值是 "off"(禁用压缩),"on"(开启压缩),"force(强制压缩)","1-9"(等效于开启压缩,并且设定压缩等级),开启了压缩,也就意味着要占用更多的cpu资源 | compression |
compressionMinSize | 在compression 参数指定为on后,该参数用来指定压缩的阈值,只有大于该阈值才会被压缩,默认为 2048 | |
keepAliveTimeout | 指connector两个HTTP请求直接的等待时间,超过该时间没有接收到第二个HTTP请求就关闭连接,默认是使用connectionTimeout 的值,单位为毫秒 | |
maxConnections | 在一定时间内可以接受和处理的最大连接数,达到限制后,服务器接受但不处理该链接,但可以存放到acceptCount,该默认值因连接器类型而异。对于NIO和NIO2,默认值为10000。对于APR / native,默认为8192。 | |
maxCookieCount | 请求允许的最大cookie 数,值小于0表示无限制,默认值为 200 | |
disableUploadTimeout | 默认是true ,禁用数据上传超时 | |
connectionUploadTimeout | 设定数据上传的超时时间,只有在disableUploadTimeout设置为false才生效,单位毫秒 | connectionUploadTimeout="50000" |
processorCache | 进程缓冲器,默认值是maxThreads的值,使用好该值可以提升并发请求。 |
示例配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
acceptCount="300" <!--默认值为100-->
acceptorThreadCount="2" <!--默认值为1,在多核的情况下可设置该值-->
compression="on" <!-- 开启对响应数据的压缩传输-->
keepAliveTimeout="25000" <!-- 等待请求时间 默认值是使用为connectionTimeout属性设置的值 -->
maxConnections="5000" <!-- 服务器在给定时间接受和处理的最大连接数,对于NIO和NIO2,默认值为10000。对于APR / native,默认为8192。-->
maxThreads="400" <!-- 最大并发数,默认为200-->
minSpareThreads="25" <!-- 始终保持运行的最小连接数,默认值为10-->
/>
maxThreads 配置说明(网上盗图,不提倡啊,哈哈)
1.5 Engine
Engine 结构示意图
Engine 的属性
属性 | 描述 |
---|---|
className | 要使用的实现的Java类名。 |
defaultHost | 默认的主机名 |
name | Engine 的名称,在一个server 中使用多个service元素时,必须给每个Engine分配一个唯一的名称 |
startStopThreads | 启动Host 的线程数,默认为1 |
Engine 必须嵌套在service 中。
Host(官网文档链接)
host 元素表示一个虚拟主机,我们常将一个主机与一个应用程序相连接
host 元素嵌套在Engine 元素里面。我们可以将Context 元素嵌套在Host元素里面。
Host 的属性
属性 | 描述 |
---|---|
name | 域名名称,tomcat会将其全部转化为小写,如果你设置的是*.baidu.com,那么你将匹配www.baidu.com admin.baidu.com 等等以baidu.com 结尾的域名。那么只有是符合该域名的条件的请求才能接受。 |
appBase | 指的是虚拟主机的应用程序目录,可以是绝对路径,也可以是相对tomcat目录的相对路径,如果未指定将使用默认值"webapps" |
unpackWARs | 默认为true,如果设置为true 表示将web应用程序war包解压,false表示直接从war文件运行。注意点1:如果设置为true,tomcat解压了该应该程序的包,会向该解压缩的包里面添加一个文件(/Meta-INF/war-tracker),用于在tomcat未运行时检测war文件(注意是war文件而不是解压目录里面的文件)是否更改。如果war文件更改了,则会重新加载。是针对未启动的时候啊,如果是tomcat正常启动的话更改war包的话是会自动重新加载发布的。注意点2: 如果该属性设置为false的话将导致性能下降 |
autoDeploy | 指tomcat在运行时是否要定期检查有没有新的应用程序,如果true,tomcat会定期检查appBase 和xmlBase 目录,如果找到了会自动部署的web应用程序,默认为true |
xmlBase | 指包含该Host部署的应用程序的Context的xml文件路径。可以是绝对路径也可以是相对tomcat目录的相对路径。如果未指定将使用"conf/<engine_name>/<host_name>" |
createDirs | 指在tomcat启动的时候将创建appBase和xmlBase定义的目录,默认为true |
className | 要使用的实现的Java类名,如果没有指定,将使用标准值。 |
deployIgnore | 这个属性是相对appBase的,foo只能匹配文件或者目录foo,而不能匹配foo.war |
deployOnStartup | 指tomcat在启动时是否应该自动部署来自该Host的web应用程序,默认为true |
startStopThreads | 指Host用于启动Context的线程数,默认值为1 |
undeployOldVersions | 在自动部署的情况下,tomcat是否检查旧的未使用的web应用程序,如果找到,将其删除,在autoDeploy为true且本属性为true才生效,默认值为false |
deployXML | 如果你不想使用web应用程序的/Meta-INF/context.xml,你可以将该值设置为false,线上环境也建议设置为false, |
copyXML | 该属性的值如果设置为true,会在程序启动时(且xmlBase无该应用程序对应的xml文件)将位于应用程序的/Meta-INF/context.xml 的文件,复制到xmlBase下,如果有的话是不会复制的,后续是会以xmlBase里的xml的配置为主的,即使应用程序的/Meta-INF/context.xml更新了,也是不会生效的。默认为false. copyXML的属性要生效的话前提得deployXML 属性为true,否则不生效。 |
workDir | 指该Host 应用程序要使用的临时目录的路径名,如果在Context中也指定了workDir将替换掉这里的配置,如果未指定,默认为$CATALINA_BASE/work。 |
当autoDeploy 为true 时,tomcat 在启动后会监控部署的web应用程序的文件是否改变,根据具体的改变,web应用程序将重新加载或重新部署。重新部署的不会保留用户会话,重新加载的则会保留。
Context 中的docBase 的路径应该在appBase(Host)之外,否则可能会导致部署两次,属性deployIgnore可以避免这种情况。
如果在server.xml 中定义了Context 属性,则应该关闭deployIgnore,和自动部署应用程序。
日志记录(官网链接)
属性 | 描述 |
---|---|
buffered | 是否缓冲日志记录,默认为True,如果设置为false,则在每次请求后将写入访问日志记录 |
className | 要使用的实现的java类名 |
directory | 存放日志文件的目录的相对路径或者绝对路径,默认值为$ CATALINA_BASE/logs |
encoding | 用于写日志文件的字符集。空字符串表示使用系统默认字符集。默认值:使用系统默认字符集。 |
fileDateFormat | 设定访问日志文件切割时间,默认值为.yyyy-MM-dd,也就是每天切割一次,如果你希望每小时切割一次则设置为.yyyy-MM-dd.HH |
maxDays | 保留日志的最大天数,如果未指定的话,默认值为-1,意味着将永远不会删除旧文件 |
maxLogMessageBufferSize | 日志消息缓冲区大小,默认大小为256bytes,该值应该设置为大于常规日志的消息大小 |
prefix | 日志前缀,为每个日志文件名称的开头,如果未指定,则默认值为"access_log" |
renameOnRotate | 设置为true 时,当天的日志是不会带有时间戳的,过往日志是会带有的,设置为false当天的日志也带有时间戳的,默认为false |
rotatable | 用于设置日志是否切割的标准,默认为true,如果设置为false的话,则该文件永远不会被切割,且忽略参数fileDateFormat |
suffix | 日志文件的后缀名称,默认为"",表示不添加后缀 |
pattern | 是指日志格式,也就是我们日志输出的内容和格式具体配置见下文 |
pattern
%a - 远程IP地址
%A - 本地IP地址
%b - 发送的字节数,不包括HTTP标头,如果为零则为“ - ”
%B - 发送的字节数,不包括HTTP标头
%h - 远程主机名(如果enableLookups连接器为false,则为IP地址 )
%H - 请求协议
%l - 来自identd的远程逻辑用户名(始终返回' - ')
%m - 请求方法(GET,POST等)
%p - 收到此请求的本地端口。
%q - 查询字符串(前缀为'?',如果存在)
%r - 请求首行(方法和请求URI)
%s - 响应的HTTP状态代码
%S - 用户会话ID
%t - 日期和时间,采用通用日志格式
%u - 经过身份验证的远程用户(如果有),否则为“ - ”
%U - 请求的URL路径
%v - 本地服务器名称
%D - 处理请求所用的时间(以毫秒为单位)
%T - 处理请求所用的时间,以秒为单位
%F - 提交响应所用的时间,以毫秒为单位
%I - 当前请求线程名称
%X - 响应完成时的连接状态:
X =连接在响应完成之前中止。
+ =发送响应后,连接可以保持活动状态。
- =发送响应后将关闭连接。
pattern="common" 对应于'%h%l%u%t“%r”%s%b'定义的通用日志格式 。
pattern="combined" 将 每个双引号中的Referer和User-Agent标题的值附加到common模式。
默认访问日志配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
请求过滤器(基于请求ip 官网链接)
基于ip地址对请求进行过滤处理。限制条件可以使用正则表达式,但是它和普通的正则语法有所不同,它采用的是java.util.regex 包。可以用";" 来分割端口限制。
拒绝请求时的行为可以更改为不拒绝,而是设置无效的authentication 标头。这与context属性 preemptiveAuthentication="true" 结合使用。
在过滤带有ipv6地址的请求的时候,需要注意过滤器匹配的ip地址格式,详细见官网。
属性 | 描述 |
---|---|
className | 要使用的实现的Java类名 |
allow | ip地址,多个以逗号分隔如果指定了此属性,则远程地址必须匹配此请求才能被接受。如果未指定此属性,则将接受所有请求,除非远程IP与deny属性中的网络掩码匹配。 |
deny | ip地址,多个以逗号分隔如果指定了此属性,如果指定了此属性,则远程地址必须不匹配才能接受此请求。如果未指定此属性,则请求接受仅受accept 属性控制。 |
denyStatus | 拒绝请求时使用的HTTP响应状态代码。默认值为403。例如,它可以设置为值404。 |
addConnectorPort | 匹配请求的主机名和端口,设置为true 的话ip(deny的值)和端口(connector 端口)都符合要求的话才能接受请求,默认为false |
invalidAuthenticationWhenDeny | 当请求要被拒绝时,不要直接拒绝,采用设置无效的authentication标头,来拒绝,这是在context设置 preemptiveAuthentication="true"时才可以设置的 |
示例:
- 仅允许从localhost 连接
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
- 仅允许允许从localhost 连接,但其它客户端连接到8443的不受限制
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
addConnectorPort="true"
allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/>
3.允许任何客户端请求访问8009端口,其它端口要触发身份验证
<Context>
...
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
addConnectorPort="true"
invalidAuthenticationWhenDeny="true"
allow=".*;8009"/>
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
...
</Context>
请求过滤器(基于请求主机名 官网链接)
用于限制不符合条件的客户端,接收符合条件的客户端。
限制条件可以使用正则表达式,但是它和普通的正则语法有所不同,它采用的是java.util.regex 包。
拒绝请求时的行为可以更改为不拒绝,而是设置无效的authentication 标头。这与context属性 preemptiveAuthentication="true" 结合使用。
注意:此过滤器返回的值获取方法ServletRequest.getRemoteHost()需要获取正确的主机名。要允许该方法返回正确的主机名,您必须在 connector 上启用 enableLookups 参数。(因为该过滤器是基于主机名过滤,所以要开启获取主机名才能获取到主机名的值)
属性 | 描述 |
---|---|
className | 要使用的实现的java类名 |
allow | 请求的主机名和正则表达式进行比较,如果指定了该属性,必须要满足条件才能接受请求,如果未指定此属性,则除非请求主机名与deny 模式匹配,否则将接受所有请求。 |
deny | 满足该条件的请求被拒绝,如果未指定此属性,则请求接受仅受allow属性控制 |
denyStatus | 拒绝请求时使用的HTTP响应状态代码。默认值为403。例如,它可以设置为值404。 |
addConnectorPort | 匹配请求的主机名和端口,设置为true 的话 ip(deny的值)和端口(connector 端口)都符合要求的话才能接受请求,默认为false |
invalidAuthenticationWhenDeny | 当请求要被拒绝时,不要直接拒绝,采用设置无效的authentication标头,来拒绝,这是在context设置 preemptiveAuthentication="true"时才可以设置的 |
context 配置 (官网链接)
It is NOT recommended to place <Context> elements directly in the server.xml file.
建议我们不要将context 直接放在server.xml 文件里面,因为这样不太安全。放在conf/server.xml 下的话,如果不重新启动tomcat的话是无法加载里面的配置的。如果我们在其他位置也配置了context的话,是会覆盖server.xml 的配置的。如果我们仍要以server.xml 的文件为主的话,那么我们需要将context 的override 参数设置为true .
但我实际测试的话,发现不设置override为true,在server.xml 和conf/Catalina/localhost/djx.xml 配置相同的path 名称,不同的war包最后还是server.xml 生效了。
context 元素定义的三种方式:
- conf/server.xml (不建议)
示例
<Context path="/djx" docBase="/tmp/svnadmin.war"/>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License,Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,software
distributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
- conf/Catalina/localhost/djx.xml ,文件名为访问路径,示例:
<Context docBase="/tmp/sample.war" reloadable="false" />
注意点
除了server.xml 外,任何定义Context的文件只能定义一个context 元素
context 的属性
属性 | 描述 | 示例 |
---|---|---|
docBase | web应用程序的路径,如果使用了符号链接的话,那么更改了链接的话需要重新启动tomcat才能生效 | docBase="/tmp/svnadmin.war" |
override | 设置为true,则忽略全局中的设置,以现有的来覆盖之前的,默认为false | |
path | 匹配对应的web应用,与请求的url的开头匹配,如果指定为""的话,该应用接收未匹配的所有请求 | |
reloadable | 设置为true表示Catalina将监视 /WEB-INF/classes/和/WEB-INF/lib的文件,一旦发生更改将自动重新加载Web应用程序。它可以在在开发的时候使用,但需要消耗更多资源,官方文档写到不建议在生产环境上使用,所以它的默认值是false. | |
workDir | 设置临时文件和目录的路径,如果未指定,默认临时目录在在$CATALINA_BASE/work | |
preemptiveAuthentication | 默认为false,当设置为true,用户为不受安全约束保护的资源提供凭据,如果身份验证器支持抢占式身份验证,那么将处理用户的凭据,该参数和过滤请求中的属性invalidAuthenticationWhenDeny关联 |
Context 路径命名示例
WatchedResource 属性,用于监控war包后的解压文件,如果更改则自动重新加载
示例:
<WatchedResource>WEB-INF/web.xml</WatchedResource>
以上就是server.xml 的一些元素和属性,还有一些我们没有列举的,我们可以去官网文档查看。
其他tocmat 文章
tomcat 安装部署
jenkins 自动部署到tomcat 插件
tomcat-部署项目的三种方法
tomcat 日志详解
针对tomcat 的自问自答与总结
tomcat 的重复部署加载问题解决办法
tomcat 读取context 顺序
tomcat 更新部署的多种情况