一、Tomcat的目录结构(以8.5版本为例)
-
bin目录。bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。
很多环境变量的设置都在此处,
例如可以设置JDK路径、tomcat路径
startup 用来启动tomcat
shutdown 用来关闭tomcat
修改catalina可以设置tomcat的内存
-
conf目录。
conf目录主要是用来存放tomcat的一些配置文件。
server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码 。
web.xml可以设置tomcat支持的文件类型。
context.xml可以用来配置数据源之类的 。
tomcat-users.xml用来配置管理tomcat的用户与权限 。
-
lib目录。
lib目录主要用来存放tomcat运行需要加载的jar包。
-
logs目录。
顾名思义,这是存放日志文件的目录。
logs目录用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志。(清空不会对tomcat运行带来影响)。
其中在windows环境中,控制台的输出日志在catalina.
–
-*.log文件中 。在linux环境中,控制台的输出日志在catalina.out文件中。
-
temp目录。
temp目录用户存放tomcat在运行过程中产生的临时文件。
清空不会对tomcat运行带来影响。
-
webapps目录。
webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用。 你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行
-
work目录。
work目录用来存放tomcat在运行时的编译后文件。 清空work目录,然后重启tomcat,可以达到清除缓存的作用。
二、修改tomcat使用的JVM的内存
2.1、设置Tomcat使用的JVM的内存(8.5之前版本)
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入
JAVA_OPTS="-Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入
set JAVA_OPTS=-Xms512m -Xmx1024m
2.2、设置Tomcat使用的JVM的内存(8.5)
apache-tomcat-8.5.15与之前的版本存在些许差异,配置方式有所改变,并且针对JVM一些参数不再支持。故本文档主要简介一下如何在apache-tomcat-8.5.15容器上配置JVM内存参数。
windows
在%TOMCAT_HOME%\bin\目录下创建文件setenv.bat,
文件内容如下所示:
SET JAVA_OPTS=-server -Xms4g -Xmx4g
或者内容为:
SET "JAVA_OPTS=-server -Xms4g -Xmx4g"
例如-server –Xms256m –Xmx1024m
linux
Tomcat并不建议直接在catalina.sh里配置变量,而是写在与catalina同级目录(bin目录)下的setenv.sh里。
那么我们就需要修改setenv.sh文件(如果没有就新建一个setenv.sh),写入(大小根据自己情况修改):
export CATALINA_OPTS="$CATALINA_OPTS -Xms1000m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx6000m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"
三、server.xml文件配置
3.1、几个常见配置修改
<Server port="8005" shutdown="SHUTDOWN">
是tomcat 监听的关闭端口
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
protocol: http协议详细介绍一下:
使用的网络协议,表示tomcat使用何种方式来接受和处理client端请求,“HTTP/1.1″是默认值,等效于”org.apache.coyote.http11.Http11Protocol”;还有熟悉的”AJP/1.3″
在Tomcat 6.0之后,还提供了NIO的方式,可以有效的提升性能,特别是在大量长连接/数据上传+下载等web应用中.此时portocal=“org.apache.coyote.http11.Http11NioProtocol”.
tomcat目前支持:BIO、NIO、NIO2、APR四种IO模型,默认为BIO。对于互联网应用,我们应该在NIO、NIO2之间做选择,因为它能够有效的提升性能(主要是并发能力),其中NIO2即为AIO,需要JDK 1.7+、Linux 2.6+才能支持。
BIO:JDK 1.5+,tomcat 5.x+
NIO:JDK 1.6+,tomcat 6.x+
NIO2:JDK 1.7+,tomcat 7.x+
其他字段:
connectionTimeout: 连接超时时间;
port:监听浏览器发送请求,该端口设置为80后在访问的时候就可以省略端口(http://localhost);
redirectPort:重定向端口,当用户用http请求某个资源,而该资源本身又被设置了必须要https方式访问,
此时Tomcat会自动重 定向到这个redirectPort设置的https端口,即处理https请求的端口。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
这个是接受其他服务转发过来的请求。
3.2、常见的参数配置表
参数 | 解释 |
---|---|
minProcessors | 最小空闲连接线程数,用于提高系统处理性能,默认值为 10 |
maxProcessors | 最大连接线程数,即:并发处理的最大请求数,默认值为 75 |
acceptCount | 允许的最大连接数,应大于等于 maxProcessors ,默认值为 100 |
enableLookups | 是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false |
disableUploadTimeout | 网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是 1000 个左右。 |
maxThreads | 客户请求最大线程数 |
minSpareThreads | Tomcat初始化时创建的 socket 线程数 |
maxSpareThreads | Tomcat连接器的最大空闲 socket 线程数 |
enableLookups | 若设为true, 则支持域名解析,可把 ip 地址解析为主机名 |
redirectPort | 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 |
acceptAccount | 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads) |
connectionTimeout | 连接超时 |
minProcessors | 服务器创建时的最小处理线程数 |
maxProcessors | 服务器同时最大处理线程数 |
URIEncoding | URL统一编码 |
3.3、配置demo
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
maxHeaderCount="64"
maxParameterCount="64"
maxHttpHeaderSize="8192"
URIEncoding="UTF-8"
useBodyEncodingForURI="false"
maxThreads="128"
minSpareThreads="12"
acceptCount="1024"
connectionLinger="-1"
keepAliveTimeout="60"
maxKeepAliveRequests="32"
maxConnections="10000"
acceptorThreadCount="1"
pollerThreadCount="2"
selectorTimeout="1000"
useSendfile="true"
selectorPool.maxSelectors="128"
redirectPort="8443" />
四、Tomcat并发优化
4.1、Tomcat并发参数
maxThreads:最大的并发请求数,当cpu利用率高的时候,不宜增加线程的个数,当cpu利用率不高,大部分是io阻塞类的操作时,可以适当增加该值。
maxSpareThreads:Tomcat连接器的最大空闲 socket 线程数
acceptCount:当处理任务的线程数达到最大时,接受排队的请求个数
connectionTimeout:网络连接超时,单位毫秒
enableLookups:若为false则不进行DNS查询,提高业务能力应设置为false
connectionTimeout:若为true则禁用上传超时
4.2、Tomcat并发配置
在conf下的server.xml文件中节点进行配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="30000"
redirectPort="8443"
maxThreads="400"
minSpareThreads="50"
maxSpareThreads="200"
acceptCount="400"
enableLookups="false"
disableUploadTimeout="true" />
4.3、Tomcat内存配置
tomcat一般都有默认的内存大小,其默认值对整个物理内存来说非常小,如果不配置tomcat的内存,会大大浪费服务器的资源,验证影响系统的性能,所以对tomcat的内存配置对用户量比较大的系统尤为重要。
具体见上面
4.4、Tomcat垃圾回收
垃圾回收(gc)机制非常重要,有时系统会因为内存没有及时回收导致内存溢出,或是内存饱和出现无法响应用户请求的情况,这就要要求我们对空闲内存进行清理,以确保系统正常运行,tomcat GC的最佳配置是确保系统正常运行的关键。
4.4.1、JVM中对象的划分及管理
JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。
Young Generation(年轻代):用于存放“早逝”对象(即瞬时对象)。例如:在创建对象时或者调用方法时使用的临时对象或局部变量。
Tenured Generation(年老代):用于存放“驻留”对象(即较长时间被引用的对象)。往往体现为一个大型程序中的全局对象或长时间被使用的对象。
Perm Generation(永久保存区域):用于存放“永久”对象。这些对象管理着运行于JVM中的类和方法。
4.4.2、jvm垃圾搜集参数
-verbose:gc:显示垃圾收集信息(在虚拟机发生内存回收时在输出设备显示信息)
UseConcMarkSweepGC:开启此参数使用ParNew & CMS(serial old为替补)搜集器
MaxTenuringThreshold:晋升老年代的最大年龄。默认为15,比如设为10,则对象在10次普通GC后将会被放入年老代。
-XX:+ExplicitGCInvokesConcurrent:System.gc()可以与应用程序并发执行。
GCTimeRatio:设置系统的吞吐量。比如设为99,则GC时间比为1/1+99=1%,也就是要求吞吐量为99%。若无法满足会缩小新生代大小。
CMSInitiatingOccupancyFraction:触发CMS收集器的内存比例。比如60%的意思就是说,当内存达到60%,就会开始进行CMS并发收集。
CMSFullGCsBeforeCompaction:设置在几次CMS垃圾收集后,触发一次内存整理。
-Xnoclassgc:禁用类垃圾回收,性能会高一点;
-XX:SoftRefLRUPolicyMSPerMB=N:Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=来控制,这可以指定每兆堆空闲空间的 soft reference 保持存活(一旦它不强可达了)的毫秒数,这意味着每兆堆中的空闲空间中的 soft reference 会(在最后一个强引用被回收之后)存活1秒钟。注意,这是一个近似的值,因为 soft reference 只会在垃圾回收时才会被清除,而垃圾回收并不总在发生。系统默认为一秒。
以上是一些基本的参数配置,通过JVM内存管理——垃圾搜集器参数精解查看更详细的配置,通过Tomcat中Java垃圾收集调优查看原理
4.4.3、 Tomcat垃圾搜集配置
tomcat的垃圾搜集是和内存设置一起配置的,内存和gc的设置也不是越大越好,良好的比例可以使你的系统性能提升一般甚至更多,下面是tomcat7 ,服务器物理内存16g的标准配置
在bin下的catalina.bat文件中echo Using CATALINA_BASE: “%CATALINA_BASE%”的前一行加入如下代码。
set JAVA_OPTS=%JAVA_OPTS%
-server -Xms8192m -Xmx8192m -Xmn1890m -verbose:gc
-XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=5 -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70 - XX:CMSFullGCsBeforeCompaction=0 -Xnoclassgc -XX:SoftRefLRUPolicyMSPerMB=0
举一些例子:
如果服务器只运行一个 Tomcat
机子内存如果是 8G,一般 PermSize 配置是主要保证系统能稳定起来就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms6144m -Xmx6144m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
机子内存如果是 16G,一般 PermSize 配置是主要保证系统能稳定起来就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms13312m -Xmx13312m -XX:NewSize=3072m -XX:MaxNewSize=4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
机子内存如果是 32G,一般 PermSize 配置是主要保证系统能稳定起来就行:
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms29696m -Xmx29696m -XX:NewSize=6144m -XX:MaxNewSize=9216m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"
如果是开发机
-Xms550m -Xmx1250m -XX:PermSize=550m -XX:MaxPermSize=1250m
参数 | 说明 |
---|---|
-Dfile.encoding | 默认文件编码 |
-server | 表示这是应用于服务器的配置,JVM 内部会有特殊处理的 |
-Xmx1024m | 设置JVM最大可用内存为1024MB |
-Xms1024m | 设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 |
-XX:NewSize | 设置年轻代大小 |
-XX:MaxNewSize | 设置最大的年轻代大小 |
-XX:PermSize | 设置永久代大小 |
-XX:MaxPermSize | 设置最大永久代大小 |
-XX:NewRatio=4 | 设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5 |
-XX:MaxTenuringThreshold=10 | 设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。 如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 |
-XX:+DisableExplicitGC | 这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC |
4.5、一个配置的demo
应用程序安全&关闭自动部署
默认值:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
修改为:
<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="false" reloadable="false">
maxThreads 连接数限制修改配置
默认值:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
修改为:
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="30"
maxIdleTime="60000"
prestartminSpareThreads = "true"
maxQueueSize = "100"
/>
参数解释:
maxThreads:最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断
minSpareThreads:Tomcat 初始化时创建的线程数,默认设置 25
maxIdleTime:如果当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。
prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize:最大的等待队列数,超过则拒绝请求
Connector 参数优化配置
默认值:
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
修改为:
<Connector
executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="60000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
maxHttpHeaderSize="8192"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
URIEncoding="utf-8"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"
server="Server Version 11.0"
/>
参数解释:
protocol:Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
protocol:Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
protocol:Tomcat 8 设置 APR 性能飞快:org.apache.coyote.http11.Http11AprProtocol
connectionTimeout:Connector接受一个连接后等待的时间(milliseconds),默认值是60000。
maxConnections:这个值表示最多可以有多少个socket连接到tomcat上
enableLookups:禁用DNS查询
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100。
maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求。
maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
disableUploadTimeout:这个标志允许servlet容器使用一个不同的,通常长在数据上传连接超时。 如果不指定,这个属性被设置为true,表示禁用该时间超时。
compressionMinSize:当超过最小数据大小才进行压缩
acceptorThreadCount:用于接受连接的线程数量。增加这个值在多CPU的机器上,尽管你永远不会真正需要超过2。 也有很多非维持连接,您可能希望增加这个值。默认值是1。
compressableMimeType:配置想压缩的数据类型
URIEncoding:网站一般采用UTF-8作为默认编码。
processorCache:协议处理器缓存的处理器对象来提高性能。 该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。 如果不使用Servlet 3.0异步处理,默认是使用一样的maxThreads设置。 如果使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。
tcpNoDelay:如果设置为true,TCP_NO_DELAY选项将被设置在服务器套接字,而在大多数情况下提高性能。这是默认设置为true。
connectionLinger:秒数在这个连接器将持续使用的套接字时关闭。默认值是 -1,禁用socket 延迟时间。
server:隐藏Tomcat版本信息,首先隐藏HTTP头中的版本信息
隐藏或修改 Tomcat 版本号
# cd /usr/local/tomcat/lib/
# unzip catalina.jar
# cd org/apache/catalina/util
# vim ServerInfo.properties
server.info=Apache Tomcat/8.5.16
server.number=8.5.16.0
server.built=Jun 21 2017 17:01:09 UTC
将以上去掉或修改版本号即可。
删除禁用默认管理页面以及相关配置文件
# rm -rf /usr/local/tomcat/webapps/*
# rm -rf /usr/local/tomcat/conf/tomcat-users.xml