目录javascript
server.xml 是tomcat 的核心配置文件,位于./conf/ 下.具备server,connector
Hosts 等元素模块。接下来咱们看看吧。(导游介绍词)。本文内容基于tomcat 8.5 不一样版本配置或有差别性。
tomcat 8.5是基于Servlet 3.1和JavaServer Pages 2.3。css
tomcat 测试war包下载路径 测试war包html
server.xml 结构图(还有些其余元素没有加入)
java
server 是server.xml 的最外层元素,经常使用的属性有:web
属性 | 描述 | 示例 |
---|---|---|
className | 要使用的java 类名 | |
address | 服务器等待接收shutdown 命令的地址,默认localhost | |
port | 接收shutdown命令的端口,设置为-1 为禁用关闭端口,也就是你不能经过这种方式来关闭了,这样就会影响你使用脚本(catalina.sh 或者是shutdown.sh)来stop了,默认绑定8005端口 | port="8005" |
shutdown | 指定shutdown 命令的别名,默认值SHUTDOWN | shutdown="SHUTDOWN" |
service 是 server 的内层。能够将一个多个service 放在server 层里,
一个service 里面能够有多个 Connector 和一个Engine .正则表达式
service 的属性express
属性 | 描述 |
---|---|
className | 要使用的java类名,未指定的话就使用标准的实现 |
name | service显示的名称 |
官方文档连接
这个元素咱们在平时配置的过程当中用得比较少,它主要用于在多个connector 之间进行共享线程池。它的位置应该在 connector 以前,这样才能生效。apache
Executor 的属性 :tomcat
属性 | 描述 | 示例 |
---|---|---|
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 |
关于 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 配置说明(网上盗图,不提倡啊,哈哈)
Engine 结构示意图
Engine 的属性
属性 | 描述 |
---|---|
className | 要使用的实现的Java类名。 |
defaultHost | 默认的主机名 |
name | Engine 的名称,在一个server 中使用多个service元素时,必须给每一个Engine分配一个惟一的名称 |
startStopThreads | 启动Host 的线程数,默认为1 |
Engine 必须嵌套在service 中。
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/
|
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地址对请求进行过滤处理。限制条件可使用正则表达式,可是它和普通的正则语法有所不一样,它采用的是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"时才能够设置的 |
示例:
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
<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"时才能够设置的 |
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 元素定义的三种方式:
<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>
<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 的一些元素和属性,还有一些咱们没有列举的,咱们能够去官网文档查看。
tomcat 安装部署
jenkins 自动部署到tomcat 插件
tomcat-部署项目的三种方法
tomcat 日志详解
针对tomcat 的自问自答与总结
tomcat 的重复部署加载问题解决办法
tomcat 读取context 顺序
tomcat 更新部署的多种状况