【JAVA】Tomcat性能优化、安全配置、资源控制以及运行模式超详细

news2024/12/23 22:41:36

在这里插入图片描述

文章目录

      • 一、Tomcat性能优化
        • application.yml配置
        • maxThreads 连接数限制
        • 压缩传输
        • AJP禁用
      • 二、JVM方向优化
        • 设置并行垃圾回收器
        • 查看gc日志文件
      • 三、Tomcat安全配置
        • 入侵防范
        • 禁用非法HTTP请求方法
        • 禁止目录列出
        • 防止恶意关闭服务
        • 配置HTTPS加密协议
        • HttpOnly标记
        • 安全头配置
      • 四、Tomcat资源控制
        • 默认程序
        • 错误页面重定向
        • 会话超时
      • 五、Tomcat运行模式
      • 六、总结

更多相关内容可查看

在现代Web应用中,Tomcat作为Java Servlet容器的代表之一,大部分公司以及学校接触的比较多。同时,Undertow作为另一种流行的Java Web服务器,与Tomcat相比也具有其独特的优势和特点,在一些场景下可以考虑用Undertow。


一、Tomcat性能优化

application.yml配置

可以参考以下的配置文件,为了让大家通俗易懂,都写在注释里了,针对这些参数调整可以调整为自己合适的数值

server:
  port: 8080
  connection-timeout: 20000 															//客户端连接超时时间(以毫秒为单位)
  tomcat:
  	//调整Spring Boot,Spring Cloud 应用中Tomcat连接设置可以改善 Tomcat 处理传入连接的方式。
    max-connections: 10000 																//可处理的最大连接数
    accept-count: 1000																	//传入连接请求的最大队列长度
    threads:
    //调整Spring Boot,Spring Cloud 应用中Tomcat可用的线程数可以帮助有效地处理更多并发请求。
      max: 200 																			//池中最大线程数
      min-spare: 10 																	//最小空闲线程数
     //调整Spring Boot,Spring Cloud 应用中Tomcat保持活动设置可以帮助更有效地管理连接。
    keep-alive-timeout: 10000															//保持连接超时时间(以毫秒为单位)
    max-keep-alive-requests: 100														//可通过保持连接发送的最大请求
    //启用压缩可以减少通过网络发送的数据量,从而缩短响应时间。
    compression:
      enabled: true
      mime-types: application/json,application/xml,text/html,text/xml,text/plain		//启用压缩的输出内容大小
      min-response-size: 1024															//压缩类型
     //配置访问日志可以帮助监控和分析请求模式。
    accesslog:
      enabled: true
      directory: /var/log/tomcat
      prefix: access_log
      suffix: .txt
//Spring Boot,Spring Cloud应用程序警用优化。例如,禁用不必要的自动配置可以节省资源。
spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration
maxThreads 连接数限制

上面配置文件中的maxThreads 是 Tomcat 所能接受最大连接数。一般设置不要超过8000以上,一般在公司当中如果访问量很大的话可以配置多个tomcat,然后用nginx去进行负载

maxThreads="2048" 		
压缩传输

上面配置文件中的compression用起来的时候有一些需要注意的地方,压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。

 compression:
      enabled: true	
      mime-types: application/json,application/xml,text/html,text/xml,text/plain
      min-response-size: 1024
AJP禁用

AJP(Apache JServ Protocol)是一个面向包的协议,用于Web服务器与Servlet容器之间的通信。AJP协议通过TCP连接在Web服务器和Servlet容器之间传递请求和响应,为了节省SOCKET创建的昂贵代价,Web服务器会维持一个长期的TCP连接来重用,这样可以减少建立和拆除连接的开销。,登录完tomcat会看到

在这里插入图片描述
因为现在大家都在用Nginx+Tomcat的架构,所以可以通过配置文件来进行禁用

<!-- 禁用AJP连接 -->
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

二、JVM方向优化

设置并行垃圾回收器

在/bin/catalina.sh文件第一行添加如下参数,gc日志输出到/logs/gc.log

#年轻代、老年代均使用并行收集器,初始堆内存64M,最大堆内存512M
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
查看gc日志文件

将gc.log文件上传到gceasy.io查看gc中是否存在问题。上传文件后需要等待一段时间,需要耐心等待。
在这里插入图片描述

这里会看到一些吞吐信息,以及gc的情况,年轻代老年代的gc次数,可以根据这些信息来调整内存等一些配置,配置完可以再次测试来看一下是否有所提升

在这里插入图片描述

在这里插入图片描述

这里是自测的最佳配置仅供参考

JAVA_OPTS="-Dfile.encoding=UTF-8-server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10-XX:NewRatio=2 -XX:+DisableExplicitGC"

参数说明:

file.encoding 默认文件编码

-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=0 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

-XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会触发任何GC。

在每调一个参数的时候,都可以使用jmeter进行压测,这里不详细说明如何使用了,有兴趣的可以看一下【Jmeter】压力测试工具下载、安装、配置环境变量、中文设置、压测实战教程(超详细)


三、Tomcat安全配置

入侵防范

不要让连接器(connector)监听服务器上所有可用的网络接口和IP地址,而要让连接器监听指定的网络接口和IP地址采用address属性,防止应用程序意外地运行在某个开放的网络接口上。

#将默认值20000改成10000即可单位ms注意需要根据实际需求更改
$vim conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" 
connectionTimeout="10000" 
redirectPort="8443" address="127.0.0.1" />
禁用非法HTTP请求方法

readonly参数默认是true即不允许delete和put操作编辑,web.xml文件查看org.apache.catalina.servlets.DefaultServlet是否存在如下配置

$vim conf/web.xml
<init-param>
  <param-name>readonly</param-name>
  <param-value>true</param-value>
</init-param>
禁止目录列出

设置DefaultServlet的listings为false,这不仅仅是因为允许显示目录列表被认为是不安全的,而且还因为生成具有数千个文件的目录列表会消耗大量的CPU资源,相当于被DDoS攻击

$vim conf/web.xml
<!-- 同样也是在下面进行添加-->
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
  <param-name>listings</param-name>
  <param-value>false</param-value>
</init-param>

小知识:DDoS攻击是一种分布式拒绝服务攻击(Distributed Denial of Service Attack)是一种通过向目标系统发送大量的网络流量导致目标系统无法提供正常服务的攻击方式。

防止恶意关闭服务

编辑tomcat配置文件conf/server.xml配置文件,shutdown的值为复杂的字符串

#随机生成密码
$cat /dev/urandom | tr -dc '_a-zA-Z0-9' | head -c 12
r02BPRnHyq89
#配置如下:将默认的SHUTDOWN变成r02BPRnHyq89
<Serverport="8005" shutdown="r02BPRnHyq89">

#如果不需要该功能,必须要将其停用,设置如下:
<Server  port="-1" shutdown="SHUTDOWN"> #本地管理脚本可将服务器关闭,即使在关闭端口被禁用的情况下。
配置HTTPS加密协议

采用HTTPS协议加密可以防止中间人攻击,以及数据的拦截和修改的验证导致攻击无效;

使用keytool生成证书:

#(1)用JDK自带的keytool工具生成一个证书,默认三个月的有效期;
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore /tmp/keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]:  Tomcat
What is the name of your organizational unit?
[Unknown]:  CQ
What is the name of your organization?
[Unknown]:  CQ
What is the name of your City or Locality?
[Unknown]:  BEIJING
What is the name of your State or Province?
[Unknown]:  XIZHIMEN
What is the two-letter country code for this unit?
[Unknown]:  408119
Is CN=Tomcat, OU=CQ, O=CQ, L=BEIJING, ST=XIZHIMEN, C=408119 correct?
[no]:  Y

Enter key password for <tomcat>
      (RETURN if same as keystore password):
Re-enter new password:

#(2)修改tomcat安装目录下/conf/server.xml配置文件,更改为使用HTTPS方式,增加如下行:
<Connector classname="org.apache.catalina.http.HttpConnector"
    port="443" protocol="HTTP/1.1"  minProcessors="5"
    SSLEnabled="true"
    maxprocessors="100"
    enableLookups="true" acceptCount="10"  debug="0"
    scheme="https"
    Factory_classname="org.apache.catalina.SSLServerSocketFactory"
    secure="true"
    clientAuth="false"
    keystoreFile="/tmp/keystore"
    keystorePass="weiyigeek"
    sslProtocol="TLS" />
#SSL Connector来指定可用的SSL加密方式:  
ciphers="SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA,  TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA,  SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,  SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
HttpOnly标记

对会话cookie自动启用HttpOnly的cookie标记,查看配置以确保该选项为被禁用。如果应用程序需要通过JavaScript访问HttpOnly cookie,可以在METAINF/context.xml中一个单独的Context中定义一个异常。

#要启用HttpOnly设置使之全局应用于所有应用程序:
<Context useHttpOnly='true'>
...
<Context>
安全头配置

XSS保护

<filter>
  <filter-name>XSSFilter</filter-name>
  <filter-class>com.example.XSSFilter</filter-class>
</filter>

防止点击劫持

<filter>
  <filter-name>ClickjackingFilter</filter-name>
  <filter-class>com.example.ClickjackingFilter</filter-class>
</filter>

四、Tomcat资源控制

默认程序

${tomcat_home}/webapps中所有的默认的web应用程序有:ROOT、Documentation、Examples、Host Manager和Manager

#如果不是一定需要,可以将它们移除。
rm -rf /opt/tomcat/apache-tomcat-8.5.45/webapps/*
错误页面重定向

编辑tomcat配置文件/conf/web.xml文件,在最后一行之前加入以下内容,然后需要重新启动tomcat服务;

<error-page>
  <!-- 配置实现了将404未找到jsp网页的错误导向noFile.htm页面,还可以添加其多的错误代码导向页面,如403,500 -->
  <error-code>404</error-code>
  <location>/noFile.htm</location>
</error-page>
<error-page>
  <!--配置实现了当jsp网页出现java.lang.NullPointerException导常时,转向error.jsp错误页面 -->
  <exception-type>java.lang.NullPointerException</exception-type>
  <location>/error.jsp</location>
</error-page>

当出现NullPointerException异常时tomcat会把网页导入到error.jsp,且会打印出出错信息。

<%@ pageerrorPage="/error.jsp" %>
典型的error.jsp错误页面的程序写法如下:
<%@ pagecontentType="text/html;charset=GB2312"%>
<%@ pageisErrorPage="true"%>
<html>
<head>
  <title>错误页面</title>
</head>

<body>出错了:</p>错误信息:<%= exception.getMessage() %>
<br>
Stack Trace is :
  <pre>
    <font color="red"><%
    java.io.CharArrayWritercw = new java.io.CharArrayWriter();
    java.io.PrintWriterpw = new java.io.PrintWriter(cw,true);
    exception.printStackTrace(pw);
    out.println(cw.toString());
    %>
    </font>
  </pre>
</body>
</html>

注:如果Manager应用程序没被移除,必须手动将位于 CATALINA_HOME/webapps/manager/WEB-INF/jsp/ 的错误页面里的Tomcat版本信息移除。

会话超时

所有的web应用程序的会话超时必须设置为20分钟可通过编辑 CATALINA_HOME/conf/web.xml 文件并做以下配置来实现

<!-- Tomcat8默认的超时时间是半个小时 -->
<session-config>  
    <session-timeout>20</session-timeout> 
</session-config>

五、Tomcat运行模式

  1. BIO(Blocking I/O):这是传统的阻塞 I/O 模式。在这种模式下,每个请求都会占用一个线程,这个线程在等待 I/O 操作完成时会被阻塞。性能低下

  2. NIO(Non-blocking I/O): nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat8默认使用nio运行模式。默认运行模式

  3. APR(Apache Portable Runtime):APR 模式使用 Apache Portable Runtime 库来提供高效的 I/O 操作。APR 从操作系统级别来解决异步的IO问题,大幅度的提高性能。安装起来最困难

六、总结

如果不管怎么优化都无法突破瓶颈,可以从根本解决问题,不用tomcat,可以考虑以下Undertow 等一些其他的容器来进行本质上的提升

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rancher 与 Kubernetes(K8s)的关系

1. 简介 1.1 Kubernetes 作为容器编排平台 Kubernetes 是一个开源平台&#xff0c;用于自动化部署、扩展和管理容器化的应用。它提供了容器调度、自动伸缩、健康检查、滚动更新等功能。 例子&#xff1a;假设您有一个微服务架构的应用程序&#xff0c;需要运行在多个节…

基于arcpro3.0.2版的使用深度学习目标提取之建筑房屋

基于arcpro3.0.2版的使用深度学习目标提取之建筑房屋 采用像素分类方法&#xff0c;像素分类一般把多边形详细轮廓给标注出来&#xff0c; 而目标检测就标注出对象大致矩形框就行, 本次训练结果&#xff1a;采用GPU显卡Nivda 1080 训练模型图 20个周期GPU训练 &#xff08;一…

【JavaEE】TCP协议 (TCP-传输层协议 万字详解)

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f3a4;一.报头格式 TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 被设计用来提供端到端的数据传…

Brequinar (Synonyms: 布喹那; DUP785; NSC 368390) AbMole介绍

Brequinar&#xff08;布喹那&#xff09;是一种合成的喹啉羧酸类似物&#xff0c;也是有效的二氢乳清酸脱氢酶(DHODH)抑制剂&#xff0c;对人 的 IC50 值为 5.2 nM&#xff0c;可以通过抑制DHODH&#xff0c;从而阻断嘧啶的从头合成。此外&#xff0c;Brequinar还可诱导肿瘤的…

【kafka】消息队列

本文主要通过字节的团队的博客学习kafka&#xff0c;写的真不错&#xff1a;一键跳转 1.kafka的架构 2.kafka的副本管理 3.日志同步管理 4.kafka快的原因&#xff1f; 批量处理、消息压缩、建立索引、分区、一致性、顺序写盘、页缓存、0拷贝 5.kafka怎么保证可靠&#xff1f…

【C++ Qt day10】

2、 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&am…

OCR在线识别网站现已上线!

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 由作者亲自开发的ocr识别网站哈哈,暂时汇聚了三十多种验证码模型以及算法,欢迎各路朋友去尝试,网站地址如下 http://gbj5w3.natappfree.cc/ocr 验证码类型包括但…

【MADRL】反事实多智能体策略梯度法(COMA)算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

前端开发的观察者模式

什么是观察者设计模式 观察者模式&#xff08;Observer Pattern&#xff09;是前端开发中常用的一种设计模式。它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生改变时&#xff0c;其所有依赖对象都能收到通知并自动更新。观察者模式广泛应用于事件驱动的系…

56页PPT | 大数据决策分析平台怎么建设?经典实践方案推荐

一、现状和目标 企业用户现状&#xff1a;数据分散&#xff0c;利用率低&#xff0c;业务需求变化快但IT响应慢。 问题&#xff1a;数据展示不及时、不准确&#xff0c;缺乏深入分析工具&#xff0c;报表制作效率低下。 目标&#xff1a;建设统一的数据整合平台&#xff0c;…

四款数据恢复精灵好用之处及使用感受~

在数字化的时代&#xff0c;数据的重要性不言而喻&#xff1b;不慎删除重要文件、格式化磁盘后数据丢失、存储设备故障……这些情况都可能让我们痛心疾首&#xff1b;这时&#xff0c;数据恢复软件就显得尤为重要了&#xff0c;今天&#xff0c;就为大家介绍四款备受好评的数据…

服装|基于Java+vue的服装定制系统(源码+数据库+文档)

服装定制系统 目录 基于Javavue的服装定制系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布…

Linux——redis主从复制、集群模式、哨兵模式

主从复制 部署至少两个redis的实例 // 提供数据冗余和备份 两个独立服务器两个虚拟机两个容器一个redis的master 节点可以有多个redis的replica 从节点&#xff0c; 而从节点也可以成为其他从节点的主节点 // 方便对于主复制架构进行扩展提供数据灾备&#xff0c;当red…

复赛总榜TOP1方案Champion Chasing Boy分享

关联比赛: 2020数字中国创新大赛—算法赛&#xff1a;智慧海洋建设 写在前面的话 大家好&#xff0c;我是 Champion Chasing Boy的DOTA&#xff0c;在队友 鱼遇雨欲语与余、 尘沙杰少、林有夕、嗯哼哼唧 的Carry下&#xff0c;最终在本届智能算法赛拿到了复赛总榜单Top1的成绩…

Java通过jna调用c++动态库

1、pom文件添加jna依赖 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.14.0</version></dependency> 2、注意问题 要实现Java调用C的动态库&#xff0c;需要使用"extern C&…

Script-server: 一款开源的脚本管理工具,为你的Python脚本提供一个直观的 Web UI

在日常工作中&#xff0c;我们经常会使用各种脚本来自动化任务&#xff0c;提升效率。但传统的脚本管理方式往往伴随着一些困扰&#xff1a;复杂的命令行操作、难以理解的脚本参数、缺乏直观的反馈等等。这些问题&#xff0c;让原本应该便捷的脚本管理变得繁琐。 Script-server…

Qt-QWidget的focusPolicy属性(20)

目录 描述 相关API 使用 描述 这里引入了焦点的概念&#xff0c;这个很重要&#xff0c;也是伴随后面介绍中的一个很重要的概念 拿魔兽世界来举例&#xff0c;如下我们在操作兵种的时候&#xff0c;需要先选中单位&#xff0c;然后才能对这些单位进行命令的下达 这一点在笔…

[极客大挑战 2019]Http

1、访问题目链接 2、查看页面源码发现一个Secret.php的跳转页面 3、访问Secret.php发现页面有提示&#xff0c;它说它不是来自这个网页 4、抓包修改来源 添加&#xff1a;Referer: https://Sycsecret.buuoj.cn 发送查看响应 5、修改User-Agent为&#xff1a;Syclover 6、添加X-…

Catia的插件不能调用CAA 的API问题

今天到客户实施Catia二开软件&#xff0c;发现在客户的电脑上调用CAA的API出现调用失败的问题。 根据经验&#xff0c;想到大概是用户电脑上的Catia授权有问题&#xff0c;但是Catia的一大堆授权中需要哪些授权呢&#xff0c;最后花了半天的时间使用二分法测试出&#xff0c;C…

产线工控安全之防勒索病毒杀手锏

在当今数字化时代&#xff0c;数据安全已成为企业运营中不可或缺的一部分。勒索病毒和内部泄密事件的频发&#xff0c;使得企业必须采取更为严格的安全措施来保护其关键数据和运营系统。苏州深信达网络科技推出的MCK主机加固解决方案&#xff0c;正是为了应对这些挑战而设计的。…