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

在这里插入图片描述

文章目录

      • 一、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: 8080connection-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: truemime-types: application/json,application/xml,text/html,text/xml,text/plain		//启用压缩的输出内容大小min-response-size: 1024															//压缩类型//配置访问日志可以帮助监控和分析请求模式。accesslog:enabled: truedirectory: /var/log/tomcatprefix: access_logsuffix: .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/plainmin-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]:  YEnter 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.rhkb.cn/news/422799.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信

目录 1、模块化语法 1.1 模块化基本认知 1.2 默认导出和导入 1.3 按需导出和导入 1.4 全部导入 2、自定义组件 -基础 2.1 自定义组件 - 基本使用 2.2 自定义组件 -通用样式 2.3 自定义组件 -成员函数变量 3、 状态管理 3.1 状态管理概述 3.2 State 自己的状态 3.3…

硬盘格式化后能恢复数据吗?教你如何恢复硬盘数据

在数字时代&#xff0c;硬盘作为存储数据的重要设备&#xff0c;承载着人们大量的工作文件、珍贵照片、重要视频等。然而&#xff0c;由于误操作、病毒感染或系统升级等原因&#xff0c;有时我们不得不对硬盘进行格式化。那么&#xff0c;硬盘格式化后&#xff0c;里面的数据还…

spring综合性利用工具-SpringBootVul-GUI(五)

项目地址 https://github.com/wh1t3zer/SpringBootVul-GUI 0x01简介 本着简单到极致的原则&#xff0c;开发了这么一款半自动化工具&#xff08;PS&#xff1a;这个工具所包含了20个漏洞&#xff0c;开发不易&#xff0c;有任何问题可提issue&#xff09; 尽管是一个为懒人量…

【免费刷题】实验室安全第一知识题库分享

道路千万条&#xff0c;实验安全第一条。 嘿&#xff0c;实验室的小伙伴们&#xff01;是不是还在为实验室安全考试而烦恼&#xff1f;别担心&#xff0c;今天就让我来分享一些实用的题库&#xff0c;帮助你轻松应对考试&#xff0c;同时也更好地保护自己和实验室的安全。 一、…

petalinux开发 添加iperf

如何把iperf编译到petalinux工程中去 目录&#xff1a; /home/xxx/7z020/project-spec/meta-user/conf 里面有一个user-rootfsconfig文件 它默认里面有 CONFIG_gpio-demo CONFIG_peekpoke 把iperf添加进去 #Note: Mention Each package in individual line #These packages w…

网络安全实训八(y0usef靶机渗透实例)

1 信息收集 1.1 扫描靶机IP 1.2 收集靶机的端口开放情况 1.3 探测靶机网站的目录 1.4 发现可疑网站 1.5 打开可疑网站 2 渗透 2.1 使用BP获取请求 2.2 使用工具403bypasser.py探测可疑网页 2.3 显示可以添加头信息X-Forwarded-For:localhost来访问 2.4 添加之后转发&#xff…

如何在Django中创建新的模型实例

在 Django 中&#xff0c;创建新的模型实例可以通过以下几个步骤进行&#xff0c;通常包括定义模型、创建模型实例、保存数据到数据库&#xff0c;以及访问和操作这些实例。 1、问题背景 在 Django 中&#xff0c;可以使用 models.Model 类来创建模型&#xff0c;并使用 creat…

sqlguna靶场get shell

一、打开靶场&#xff0c;发现一个搜索框&#xff0c;尝试sql注入&#xff0c;发现可以注入&#xff0c;爆破数据库&#xff0c;表名&#xff0c;字段名以及 用户名密码 二、发现密码被MD5&#xff0c;解密后得到密码 三、进入后台界面登陆查看 四、发现添加新闻出可以上传图片…

前端开发macbook——NVM环境配置以及git配置流程

本文主要针对前端使用mac电脑时需要安装nvm对应环境&#xff0c;一文解决环境安装问题 主要步骤如下&#xff1a; 安装homebrew 安装nvm 安装git 第一步&#xff1a;安装homebrew /bin/bash -c "$(curl -fsSL https:/raw.githubusercontent.com/Homebrew/install/HE…

Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 基于 Redis 实现的分布式锁存在的问题 2.0 Redisson 功能概述 3.0 Redisson 具体使用 4.0 Redisson 可重入锁原理 5.0 Redisson 锁重试原理 6.0 Redisson WatchDo…

第7篇:【系统分析师】计算机网络

考点汇总 考点详情 1网络模型和协议&#xff1a;OSI/RM七层模型&#xff0c;网络标准和协议&#xff0c;TCP/IP协议族&#xff0c;端口 七层&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;…

如何为Google RSA安排广告定制器 [2024]

近年来&#xff0c;响应式搜索广告&#xff08;RSA&#xff09;的人气稳步上升&#xff0c;这也就不足为奇了。通过谷歌的机器学习能力&#xff0c;RSA 提供了一种强大的方式来自动测试多个标题和描述&#xff0c;以确保更接近用户的意图。其好处显而易见&#xff1a;RSA 意味着…

Docker容器技术1——docker基本操作

Docker容器技术 随着云计算和微服务架构的普及&#xff0c;容器技术成为了软件开发、测试和部署过程中的重要组成部分。其中&#xff0c;Docker作为容器技术的代表之一&#xff0c;以其简便易用的特点赢得了广大开发者的青睐。 Docker允许开发者在轻量级、可移植的容器中打包和…

通信工程学习:什么是GFP通用成帧规范

GFP&#xff1a;通用成帧规范 GFP通用成帧规范&#xff08;Generic Framing Procedure&#xff09;是一种先进的数据业务适配的通用协议和映射技术&#xff0c;由国际电联ITU-T的G.7041标准定义。该技术旨在透明地将各种不同物理层或逻辑链路层信号适配进入SDH&#xff08;同步…

Unity UI 系统:Unity UI package (uGUI) 使用说明

卡牌游戏 UI 系统 Unity UI 基础概念 布局&#xff08;Layout&#xff09; Unity 的屏幕坐标定义为左下角为 (0, 0)&#xff0c;右上角为 (1, 1) 。 锚点&#xff08;Anchor&#xff09; 锚点控制 子矩形UI的边 相对 父矩形对应坐标轴的指定比例边 的 距离 保持不变。 Anc…

s3c2440---中断控制器

一、概述 S3C2440A 中的中断控制器接受来自 60 个中断源的请求。提供这些中断源的是内部外设&#xff0c;如 DMA 控制器、 UART、IIC 等等。 在这些中断源中&#xff0c;UARTn、AC97 和 EINTn 中断对于中断控制器而言是“或”关系。 当从内部外设和外部中断请求引脚收到多个中…

区间的合并

给定 n个区间 [,]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3]和 [2,6]可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n行&#xff0c;每行包含两个整数 …

解决python-docx设置字体为宋体无效

环境&#xff1a;python3.12 python-docx 1.1.2 最初使用的设置字体的代码&#xff1a; from docx import Documentfrom docx.oxml.ns import qndoc Document()style doc.styles[Title]style.font.name Times New Roman # 设置西文字体style._element.rPr.rFonts.set(qn(w:e…

828华为云征文|Flexus云服务器X实例快速部署在线测评平台,适用各种信息学教学

文章目录 如何选配Flexus云服务器X实例服务器HydroOJHOJ 服务器资源的选取基础配置实例规格镜像、存储、网络弹性公网IP云服务器名称 部署HydroOJ1.设置安全组、开放端口2.部署HydroOJ回到控制中心&#xff0c;远程登录 部署HOJ安装docker# 安装docker-compose部署HOJ 本篇幅为…