tomcat 优化
tomcat 优化
环境:tomcat-8.5.59
一、连接优化
1.修改服务器资源限制
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
切换终端使配置生效
2.修改tomcat配置文件
vim $TOMCAT_HOME/conf/server.xml
修改下面

修改并添加:
<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="200"
prestartminSpareThreads="true"/>
<Connector port="8080"
executor="tomcatThreadPool"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"
acceptCount="20000"
enableLookups="false"
URIEncoding="UTF-8"
maxPostSize="-1"
disableUploadTimeout="true"
/>
说明:
1.maxThreads:tomcat可用于请求处理的最大并发线程数,默认是200,如果一个执行器与此连接器关联,则忽略此属性,因为该属性将被忽略,所以该连接器将使用执行器而不是一个内部线程池来执行任务;
2.minSpareThreads:tomcat初始线程数,即最小空闲线程数;
3.acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100;
4.prestarminSpareThreads:是否在启动时就生成minSpareThreads个线程,默认为flase,true为开启;
5.connectionTimeout:连接超时时间;
6.enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false;
7.URIEncoding:指定字符集
8.maxPostSize:上传文件大小限制。-1为不限制,正值限制大小
9.disableUploadTimeout:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
其他:
<Executor name="tomcatThreadPool" #开启线程一个线程池并指定名称:tomcatThreadPool
namePrefix="catalina-exec-" #指定线程名
executor="tomcatThreadPool" #指定使用的线程池
protocol="org.apache.coyote.http11.Http11Nio2Protocol" #指定连接模型,tomcat支持三种连接模型之一
tomcat支持三种连接模型
- 1)BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
- 2)NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
- 3)APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
二、jvm参数优化
1.修改配置文件
vim $TOMCAT_HOME/bin/catalina.sh
在125行添加如下配置
JAVA_OPTS="$JAVA_OPTS -server -Xms2G -Xmx2G -Xss128k -Xmn512m -XX:NewRatio=4"
需要特别说明下:
元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm。
2.jvm调优项目
jdk1.8以后舍弃了持久代的概念,改用元数据;使用宿主机内存来存储元数据!!!;
1)堆大小设置
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制;
- -Xms:初始堆大小
- -Xmx:最大堆大小
- -Xss:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
- -XX:NewSize=n:设置年轻代大小,整个JVM内存大小=年轻代大小 + 年老代大小 + 元数据大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
- -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
- -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
2)回收器选择
JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。
- -XX:+UseSerialGC:设置串行收集器
- -XX:+UseParallelGC:设置并行收集器
- -XX:+UseParalledlOldGC:设置并行年老代收集器
- -XX:+UseConcMarkSweepGC:设置并发收集器
3)其他信息
垃圾回收统计信息
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -Xloggc:filename
并行收集器设置
- -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
- -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
- -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
- -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
- -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
三、其他优化
隐藏版本号
下载并解压官方tomcat应用并解压
cd $TOMCAT_HOME/lib/catalina/
找到catalina.jar
解压缩/或者直接用解压工具打开
unzip catalina.jar
cd /org/apache/catalina/util
找到Serverinfo.properties文件
修改server_info= 要修改成的版本信息
重新压缩回去
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
优化缓存
tocmat出现缓存错误信息
...to the cache because there was insufficient free space available after evicting expired cache entries -consider increasing the maximum size of the cache
原因:
tomcat8以上对resource采取了cache,而默认的大小是10M. 如果超过了此限制,影响对系统的正常访问
优化缓存:
1.增加cache大小
$TOMCAT_HOME/conf/context.xml 的 context 标签里面增加
<Resources cachingAllowed="true" cacheMaxSize="100000" />
2.禁用缓存
禁用缓存,disable the cache,在 context 标签里面添加如下设置
<Resources cachingAllowed="false"/>
安全优化之配置https证书
前置条件:安装的有openssl服务;并且已经下载了tomcat所需得证书文件。
1.将已经下载好的证书文件解压: 会出来两个文件,一个pfx后辍得证书文件跟txt结尾得密码文件。
说明:每次下载证书都会产生新的密码,该密码仅匹配本次下载的证书。如果需要更新证书文件,同时也要更新匹配的密码。
2.在Tomcat安装目录下新建cert目录,将解压的证书和密码文件拷贝到cert目录下。
3.修改配置文件server.xml,并保存。
a.去掉以下内容的注释
<Connector port="8443"protocol="HTTP/1.1"
port="8443" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
b.修改
<Connector port="443" #port属性根据实际情况修改(https默认端口为443)。如果使用其他端口号,则您需要使用https://yourdomain:port的方式来访问您的网站。
protocol="HTTP/1.1"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="Tomcat安装目录/cert/domain name.pfx" #证书名称前需加上证书的绝对路径,请使用您证书的文件名替换domain name。
keystoreType="PKCS12"
keystorePass="证书密码" #请替换为密码文件pfx-password.txt中的内容。
clientAuth="false"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
4.强制跳转https
编辑web.xml文件,再 下添加以下内容
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
5.重启tomcat生效
配置systemctl管理tomcat
环境:
centos7
tomcat目录:/opt/tomcat
1.配置jdk
vi /etc/profile
export JAVA_HOME=/opt/jdk
export JAVA_BIN=$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
2.配置service服务脚本
vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=network.target
[Service]
Type=forking
PIDFile=/opt/tomcat/pid
ExecStart=/opt/tomcat/bin/catalina.sh start
ExecReload=/opt/tomcat/bin/catalina.sh restart
ExecStop=/opt/tomcat/bin/catalina.sh stop
[Install]
WantedBy=multi-user.target
[Unit] 表示这是基础信息
Description 是描述
After 是在那个服务后面启动,一般是网络服务启动后启动
[Service] 表示这里是服务信息
Type 是服务类型
PIDFile 是服务的pid文件路径, 开启后,必须在tomcat的bin/catalina.sh中加入CATALINA_PID参数
ExecStart 是启动服务的命令
ExecReload 是重启服务的命令
ExecStop 是停止服务的指令
[Install] 表示这是是安装相关信息
WantedBy 是以哪种方式启动:multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
3.配pid 路径,及环境变量
vi /opt/tomcat/bin/catalina.sh
CATALINA_PID=/opt/tomcat/pid
#OS specific support. $var _must_ be set to either true or false.
.....
vim /opt/tomcat/bin/setclasspath.sh

4.创建软连接, 创建软链接是为了下一步系统初始化时自动启动服务,或者使用enable选项
ln -s /lib/systemd/system/tomcat.service /etc/systemd/system/multi-user.target.wants/tomcat.service
5.刷新配置,启动tomcat
systemctl daemon-reload
systemctl start/restart tomcat
tips:持续更新

浙公网安备 33010602011771号