Tomcat的优化

隐藏版本信息

(本地上传,图片缺失见谅)

隐藏curl版本号

vim /usr/local/tomcat-8.5.42/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" server="web/8.8.8"/>

![[Pasted image 20230301090333.png]]

systemctl restart tomcat-8.5.42
curl -I 192.168.45.10:8080

![[Pasted image 20230301090606.png]]

隐藏404页面版本号

  • 加压缩对应的jar包
cd /usr/local/tomcat-8.5.42/lib/
jar -xvf catalina.jar
  • 修改解压后的文件重新打包回catalinla
vim org/apache/catalina/util/ServerInfo.properties

![[Pasted image 20230301091257.png]]

  • 修改完成后打包回去,并删除之前的解压包
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
rm -rf META-INF/ org/
  • 重启tomcat
systemctl restart tomcat-8.5.42
  • 测试
    http://192.168.45.10:8080/aa
    ![[Pasted image 20230301091700.png]]

配置Tomcat的运行模式

NIO模式

  • 概念:[[6-Tomcat基础#NIO-Non-blocking IO(非阻塞IO)]]

配置

  • 修改配置文件
vim /usr/local/tomcat-8.5.42/conf/server.xml 

![[Pasted image 20230301100320.png]]

 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" server="web/8.8.8"/>
  • 参数解释
    • port 代表服务接口;
    • protocol代表协议类型;
    • connectionTimeout 代表连接超时时间,单位为毫秒;
    • redirectPort 代表安全通信(https)转发端口
      • 一般配置成8443。
  • 重启tomcat
 systemctl restart tomcat
  • 查看日志
cat /usr/local/tomcat-8.5.42/logs/catalina.out |grep nio2
  • 浏览器查看
    ![[Pasted image 20230301101009.png]]

APR模式

  • 概念:[[6-Tomcat基础#APR(移植运行模式)]]

部署

  • 安装apr支持
yum install -y apr apr-devel gcc gcc-c++ openssl-devel openssl
安装Tomcat-Native
  • 预编译安装
tar zxf /usr/local/tomcat-8.5.42/bin/tomcat-native.tar.gz -C /usr/local/src/
cd /usr/local/src/tomcat-native-1.2.21-src/native/
./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/usr/local/jdk1.8.0_171/ --with-ssl
make -j4 && make install
  • 初始化
ln -s /usr/local/apr/lib/*  /usr/lib/
  • 调整Tomcat配置文件开启APR
vim /usr/local/tomcat/conf/server.xm
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" server="web/8.8.8"/>

![[Pasted image 20230301103506.png]]

  • 重启Tomcat检查日志文件
systemctl restart tomcat
cat /usr/local/tomcat-8.5.42/logs/catalina.out | grep Native
cat /usr/local/tomcat-8.5.42/logs/catalina.out | grep apr
  • APR
    ![[Pasted image 20230301103819.png]]
  • Native
    ![[Pasted image 20230301103823.png]]

隐藏目录结构

默认情况下是隐藏的,如果不隐藏的话会将网站根目录的所有信息进行展示,有造成数据泄露的风险。

vim /usr/local/tomcat-8.5.42/conf/web.xml
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value> 
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

<param-value>false</param-value>
true是打开,false是隐藏,默认是隐藏的

Tomcat执行器(线程池)优化

概念

  • Tomcat的线程池用于管理Tomcat线程,以有效地处理Web服务器的请求和响应。
  • Tomcat线程池能够有效地分配系统资源,提高Web应用程序的响应时间,减少系统资源,并在高负载情况下使用多种策略保持系统的稳定性。

开启线程池

vim /usr/local/tomcat-8.5.42/conf/server.xml
 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="1500" minSpareThreads="100" maxSpareThreads="500"
        prestartminSpareThreads="true" maxQueueSize="300" />

参数说明

  • name
    • 共享线程池的名字。
    • 这是 Connector 为了共享线程池要引用的名字,该名字必须唯一
  • namePrefix
    • 在 JVM 上,每个运行线程都可以有一个 name 字符串。
    • 这一属性为线程池中每个线程的 name 字符串设置了一个前缀
    • Tomcat 将把线程号追加到这一前缀的后面。
  • maxThreads
    • 最大并发数,默认设置 200,一般建议在 500 ~1000,根据硬件设施和业务来判断
      - minSpareThreads
    • 最小空闲线程数,Tomcat初始化时创建的线程数,默认设置25
  • maxSpareThreads
    • 最大空闲线程数,一旦空闲线程超过这个值,Tomcat就会关闭不再需要的线程。
  • prestartminSpareThreads
    • 在Tomcat初始化的时初始化minSpareThreads的参数值
    • 如值不是 trueminSpareThreads的值无效
  • maxQueueSize
    • 最大的等待队列数,超过则拒绝请求

使用线程池

vim /usr/local/tomcat-8.5.42/conf/server.xml
    <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" server="web/8.8.8"/>

Connector优化

vim /usr/local/tomcat-8.5.42/conf/server.xml
    <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="20000"
               redirectPort="8443" server="web/8.8.8"
               maxThreads="1000"
               minSpareThreads="100"
               acceptCount="1000"
               maxConnections="1000"
               maxHttpHeaderSize="8192"
               tcpNoDelay="true"
               compression="on"
               disableUploadTimeout="true"
               enableLookups="false"
               URIEncoding="UTF-8"/>

参数说明

  • maxThreads
    • 最大线程数。
    • 最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。如果没有指定,该属性被设置为200。如果使用了executor将忽略此连接器的该属性,连接器将使用executor
  • minSpareThreads
    • 最小空闲线程数。
  • acceptCount
    • 接受最大队列长度,当队列满时收到的任何请求将被拒绝。
  • maxConnections
    • 在任何给定的时间服务器接受并处理的最大连接数。
  • connectionTimeout
    • 超时等待时间(毫秒)
  • maxHttpHeaderSize
    • 请求头最大值
  • tcpNoDelay
    • 如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能。缺省情况下设为true
  • compression
    • 是否开启压缩GZIP 。可接受的参数的值是“off ”(禁用压缩),“on ”(允许压缩,这会导致文本数据被压缩),“force ”(强制在所有的情况下压缩)。提示:压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。
  • disableUploadTimeout
    • 此标志允许servlet容器在数据上传时使用不同的连接超时,通常较长。如果没有指定,该属性被设置为true,禁用上传超时。
  • enableLookups
    • 关闭DNS反向查询,DNS反查很耗时间

禁用AJP连接器

什么是AJP

  • AJP(Apache JServ Protocol)是一种连接Web服务器和应用服务器的协议
  • 允许Web服务器将请求转发到应用服务器上执行,然后再将结果反馈给Web服务器,从而提供了一种可靠、可扩展、高性能的服务器架构。
  • ![[Pasted image 20230301133934.png]]
  • 当我们使用nginx+tomcat的架构时,需要关闭AJP协议以做效率的优化。

关闭AJP

  • 注释 server.xml 该行
    ![[Pasted image 20230301134214.png]]
  • 重启服务生效
  • 进入Tomcat的web管理台查看状态

禁用8005端口(不建议使用)

  • 会影响本地的 systemctl 的管理
  • 修改 server.xml 这行
<Server port="-1" shutdown="SHUTDOWN">

![[Pasted image 20230301134501.png]]

JVM参数优化(JDK8)

Java内存模型

![[Pasted image 20230301134639.png]]

堆内存

  • 一种存放动态分配的内存的区域,它容纳着应用程序使用的所有对象
  • Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
GC
  • GC(Garbage Collection),垃圾桶,垃圾回收
  • GC周期是一个可重复的过程,包括一组GC操作。这些操作处理Java堆的全部或部分。
  • 当操作整个Java堆时,该周期称为全局GC周期;当操作堆的一部分时,该周期称为部分GC周期
新生代(Young)
  • 对象在被创建时,内存首先是在年轻代进行分配(注意,大对象可以直接在老年代分配)。
  • 当年轻代需要回收时会触发Minor GC(也称作Young GC,Garbage Collection,垃圾收集,垃圾回收)。
  • Young 区被划分为三部分,Eden 区和两个大小相同的 Survivor 区,其中 Survivor 区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在 Young 区间变满的时候,minor GC ([ˈmaɪnər])就会将存活的对象移到空闲的Survivor 区间中,根据 JVM 的策略,在经过几次垃圾收集后,仍然存活于 Survivor 的对象将被移动到 Tenured 区间。
Eden
  • 新生代中的Eden空间和 幸存空间(Survivor) 是Java垃圾收集器的一部分。
  • 当使用new关键字创建对象时,内存将在Eden空间中分配。
  • 幸存空间是包含从Eden空间经过Java垃圾收集后幸存下来的对象的池。
老年代(Tenured)

老年代用于存放在年轻代中经多次垃圾回收仍然存活的对象,可以理解为比较老一点的对象,例如缓存对象,一般如果系统中用了 application 级别的缓存,缓存中的对象往往会被转移到这一区间。当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区。当老年代满了的时候就需要对老年代进行垃圾回收,老年代的垃圾回收称作Major GC(也称作Full GC)。

方法区

一种存放类信息、静态变量和常量的存储空间

  • 方法区存放了要加载的类的信息(如类名,修饰符)、类中的静态变量、final定义的常量、类中的field、方法信息。
  • 当开发人员调用类对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区。
  • 方法区是全局共享的,在一定条件下它也会被GC。当方法区使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。
  • 在JDK8之前的Hotspot虚拟机中,这块区域对应的是Permanent Generation(永久代),一般的,方法区上执行的垃圾收集是很少的,因此方法区又被称为永久代的原因之一。
  • 随着JDK8的到来,JVM不再有永久代(PermGen)。但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Meta space”的本地内存(Native memory)。

一种存储局部变量的内存空间,是系统自动分配释放,存放函数的参数值、局部变量的值等。栈空间随着线程的终止而释放。

优化

vim /usr/local/tomcat-8.5.42/bin/catalina.sh
export JAVA_OPTS="-server -Xms128M -Xmx256M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking  -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"

![[Pasted image 20230301163001.png]]

参数详解

常规
  • -server:只要Tomcat运行在生产环境中,参数必须加上,否则后面的参数不会生效。
  • XX:+AggressiveOpts
    • aggressive adj. 积极的、进取的
    • 启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术(如果有的话)。
堆栈
  • -Xms:Java初始化堆的大小,-Xms-Xmx 设成一样的值,避免JVM反复重新申请内存。
    • 反复申请内存会导致性能大起大落
    • 默认值为物理内存的 1/64
    • 默认(MinHeapFreeRatio 参数可以调整)空余堆内存小于 40%时,JVM 就会增大堆直到 -Xmx 的最大限制。
  • -Xmx:表示最大Java堆大小,当应用程序需要的内存超出堆的最大值时JVM就会提示内存溢出,导致应用服务崩溃。
    • 因此一般建议堆的最大值设置为物理内存的最大 值的 50%。
新生代
  • -XX:NewSize:新生代内存大小
  • -XX:MaxNewSize:最大新生代新生代内存大小
  • -Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与 jmap-heap 中显示的 New gen 是不同的。
    • 整个堆大小 = 新生代大小 + 老生代大小 + 永久代大小。
    • 在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8
持久代
  • -XX:PermSize:设置持久代内存大小。
  • -XX:MaxPermSize:持久代内存最大值。
年轻代
  • -XX:NewRatio:年轻代(包括 Eden 和两个 Survivor 区)与年老代的比值(不含持久代)
    • -XX:NewRatio=4 表示 年轻代与年老代比值为1:4
垃圾收集
  • -XX:CMSInitiatingOccupancyFraction:当堆满之后,并行收集器便开始进行垃圾收集。
    • 例如,当没有足够的空间来容纳新分配或提升的对象时。
    • CMS:Mostly Concurrenct Mark and Sweep Garbage Collector(最大-并发-标记-清除-垃圾收集器)
      • 启用参数:-XX:+UseConMarkSweepGC
  • -XX:MaxTenuringThreshold:设置垃圾最大年龄,默认为15、如果设置为0的话,年轻代对象不经过Survivor区,直接进入年老代。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值