一 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 的最外层元素,常用的属性有:
接收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 的属性
1.3 Executor
官方文档链接
这个元素我们在平时配置的过程中用得比较少,它主要用于在多个connector 之间进行共享线程池。它的位置应该在 connector 之前,这样才能生效。
Executor 的属性 :
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的值,使用好该值可以提升并发请求。
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 的属性
host 元素表示一个虚拟主机,我们常将一个主机与一个应用程序相连接
host 元素嵌套在Engine 元素里面。我们可以将Context 元素嵌套在Host元素里面。
Host 的属性
域名名称,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,和自动部署应用程序。
%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地址格式,详细见官网。
<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 参数。(因为该过滤器是基于主机名过滤,所以要开启获取主机名才能获取到主机名的值)
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"/>
webapps/appname/META-INF/context.xml,
示例: manager/META-INF/context.xml
<?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 的属性
WatchedResource 属性,用于监控war包后的解压文件,如果更改则自动重新加载
<WatchedResource>WEB-INF/web.xml</WatchedResource>
以上就是server.xml 的一些元素和属性,还有一些我们没有列举的,我们可以去官网文档查看。
其他tocmat 文章
tomcat 安装部署
jenkins 自动部署到tomcat 插件
tomcat-部署项目的三种方法
tomcat 日志详解
针对tomcat 的自问自答与总结
tomcat 的重复部署加载问题解决办法
tomcat 读取context 顺序
tomcat 更新部署的多种情况
本人承接各种项目维护和python项目开发, 如果觉得文章写得不错,或者帮助到您了,请点个赞,加个关注哦。运维学习交流群:544692191
本文版权归作者所有,欢迎转载,如果文章有写的不足的地方,或者是写得错误的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。