隐藏版本信息
(本地上传,图片缺失见谅)
隐藏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
- 最大并发数,默认设置 200,一般建议在 500 ~1000,根据硬件设施和业务来判断
maxSpareThreads
- 最大空闲线程数,一旦空闲线程超过这个值,Tomcat就会关闭不再需要的线程。
prestartminSpareThreads
- 在Tomcat初始化的时初始化
minSpareThreads
的参数值 - 如值不是
true
,minSpareThreads
的值无效
- 在Tomcat初始化的时初始化
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区,直接进入年老代。