Tomcat参数化配置v1.0.0

一、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客户请求最大线程数
minSpareThreadsTomcat初始化时创建的 socket 线程数
maxSpareThreadsTomcat连接器的最大空闲 socket 线程数
enableLookups若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads)
connectionTimeout连接超时
minProcessors服务器创建时的最小处理线程数
maxProcessors服务器同时最大处理线程数
URIEncodingURL统一编码

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值