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:持续更新

posted @ 2021-03-01 17:34  (◓3◒)  阅读(179)  评论(0)    收藏  举报