Web中间件--tomcat学习
Web中间件–tomcat
Java虚拟机详解
什么是JAVA虚拟机
Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码,并执行这些代码。
Java虚拟机的主要组成部分包括:
- 类加载器:负责加载Java类文件,并将其转换为Java虚拟机可以执行的格式。
- 执行引擎:负责执行Java字节码,并将其转换为机器代码。
- 垃圾回收器:负责管理内存,自动回收不再使用的对象。
- 运行时数据区:用于存储Java程序运行时所需的数据,包括方法区、堆、栈、本地方法栈和程序计数器等。
JAVA 如何做到跨平台
Java通过以下方式实现跨平台:
- Java虚拟机:Java程序在Java虚拟机上运行,不同平台的Java虚拟机可以执行相同的Java字节码。
- 一次编写,到处运行:Java程序只需编写一次,即可在任何支持Java虚拟机的平台上运行,无需重新编译。
- 标准库:Java提供了一套标准库,包含了各种常用的功能和API,开发者可以在不同平台上使用相同的代码。
虚拟机基本结构–了解
Java虚拟机的基本结构包括:
- 类加载器:负责加载Java类文件,并将其转换为Java虚拟机可以执行的格式。
- 执行引擎:负责执行Java字节码,并将其转换为机器代码。
- 垃圾回收器:负责管理内存,自动回收不再使用的对象。
- 运行时数据区:用于存储Java程序运行时所需的数据,包括方法区、堆、栈、本地方法栈和程序计数器等。
类加载子系统
- 类加载器是Java虚拟机的一部分,负责加载Java类文件,并将其转换为Java虚拟机可以执行的格式。
- 类加载器的主要任务包括:
- 加载类:从文件系统或网络中加载Java类文件,并将其转换为Java虚拟机可以执行的格式。
- 链接类:将加载的类与其他类进行链接,包括验证、准备和解析等步骤。
- 初始化类:对类进行初始化,包括执行静态变量的初始化和静态代码块的执行等。
Java堆
- Java堆是Java虚拟机的一部分,用于存储Java对象和数组。Java堆是Java虚拟机中最大的一块内存区域,所有的对象和数组都在这里分配内存。
- Java堆的主要特点包括:
- 共享:Java堆是所有线程共享的内存区域,所有线程都可以访问Java堆中的对象和数组。
- 动态分配:Java堆中的内存是动态分配的,当需要创建新的对象或数组时,Java虚拟机会在Java堆中分配内存。
- 垃圾回收:Java堆中的对象和数组会被垃圾回收器自动回收,不再使用的对象和数组会被自动清除。
Java的NIO库(直接内存)
- Java的NIO库(New Input/Output)提供了一种新的文件和网络I/O方式,支持非阻塞I/O操作。
- NIO库的主要特点包括:
- 通道(Channel):NIO使用通道来读写数据,通道可以与文件、网络等进行交互。
- 缓冲区(Buffer):NIO使用缓冲区来存储数据,数据在通道和缓冲区之间传输。
- 选择器(Selector):NIO使用选择器来管理多个通道的I/O操作,支持非阻塞I/O。
- 直接内存:NIO支持直接内存访问,可以在Java堆外分配内存,提高I/O性能。
- 直接内存的主要特点包括:
- 高效:直接内存访问可以减少数据复制,提高I/O性能。
- 直接缓冲区:NIO提供了直接缓冲区,可以在Java堆外分配内存,提高I/O性能。
- 直接内存的使用需要注意内存管理,避免内存泄漏和溢出等问题。
垃圾回收系统
- 垃圾回收器是Java虚拟机的一部分,负责自动回收不再使用的对象和数组,释放内存。
- 垃圾回收的主要特点包括:
- 自动化:垃圾回收器自动检测不再使用的对象,无需手动释放内存。
- 标记-清除算法:垃圾回收器使用标记-清除算法来识别和回收不再使用的对象。
- 分代收集:垃圾回收器将对象分为新生代和老年代,采用不同的回收策略,提高回收效率。
- 垃圾回收的主要算法包括:
- 标记-清除算法
- 复制算法
- 标记-整理算法
执行引擎
- 执行引擎是Java虚拟机的一部分,负责执行Java字节码,并将其转换为机器代码。
- 执行引擎的主要特点包括:
- 解释执行:执行引擎可以逐条解释执行Java字节码,将其转换为机器代码。
- 即时编译(JIT):执行引擎可以将热点代码编译为机器代码,提高执行效率。
- 优化:执行引擎可以对Java字节码进行优化,提高执行效率。
虚拟机堆内存结构
Java堆内存结构包括:
- 新生代:用于存储新创建的对象,采用复制算法进行垃圾回收。
- 老年代:用于存储长时间存活的对象,采用标记-清除算法进行垃圾回收。
- 永久代:用于存储类信息和常量池等数据,采用标记-清除算法进行垃圾回收。
Java堆内存结构的主要特点包括:
- 动态分配:Java堆中的内存是动态分配的,当需要创建新的对象或数组时,Java虚拟机会在Java堆中分配内存。
- 垃圾回收:Java堆中的对象和数组会被垃圾回收器自动回收,不再使用的对象和数组会被自动清除。
常用的JVM参数
跟踪JAVA虚拟机的垃圾回收
- -XX:+PrintGC:打印垃圾回收日志。
- -XX:+PrintGCDetails:打印垃圾回收的详细信息。
- -XX:+PrintGCTimeStamps:打印垃圾回收的时间戳。
- -XX:+UseGCLogFileRotation:启用垃圾回收日志文件轮转。
- -XX:NumberOfGCLogFiles:设置垃圾回收日志文件的数量。
- -XX:GCLogFileSize:设置垃圾回收日志文件的大小。
- -Xloggc:filename:设置垃圾回收日志文件的路径和名称。
在这里GC 日志格式支持 %p 和 %t 两个参数:
- %p:表示进程ID
- %t:表示当前时间
开启gc日志
- -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log
配置JAVA虚拟机的堆空间
- -Xms:设置Java堆的初始大小。
- -Xmx:设置Java堆的最大大小。
- -Xmn:设置新生代的大小。
- -XX:NewRatio:设置新生代和老年代的比例。
- -XX:SurvivorRatio:设置Eden区和Survivor区的比例。
- -XX:MaxTenuringThreshold:设置对象在新生代中存活的最大次数。
实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大,两个不超过物理内存的一半。以避免程序频繁的申请堆空间。
vim catalina.sh
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log"
创建gc日志存放路径
mkdir /data0/logs/ -p
安装 Tomcat & JDK
安装JDK
下载安装包
wget https://cdn.azul.com/zulu/bin/zulu11.70.19-ca-jdk11.0.19-linux_x64.tar.gz
解压安装包
tar -zxvf zulu11.70.19-ca-jdk11.0.19-linux_x64.tar.gz -C /usr/local/
配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/zulu11.70.19-ca-jdk11.0.19-linux_x64
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
验证安装是否成功
java -version
安装Tomcat
下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.73/apache-tomcat-9.0.73.tar.gz
解压安装包
tar -zxvf apache-tomcat-9.0.73.tar.gz -C /usr/local/
配置环境变量(可选)
vim /etc/profile
export CATALINA_HOME=/usr/local/apache-tomcat-9.0.73
export PATH=$CATALINA_HOME/bin:$PATH
启动Tomcat
启动Tomcat
cd /usr/local/apache-tomcat-9.0.73/bin
./startup.sh
访问Tomcat
在浏览器中输入http://localhost:8080, 如果能看到Tomcat的欢迎页面,说明Tomcat安装成功。
JVM 运维实用排障工具
java常用的指令
- jps # 查看当前运行的java进程
- jstat # 查看java进程的内存使用情况
- jmap # 查看java进程的堆内存使用情况
- jstack # 查看java进程的线程堆栈信息
- jinfo # 查看java进程的配置信息
- jcmd # 执行java进程的命令
- jconsole # 监控java进程的内存使用情况
- jvisualvm # 可视化监控java进程的内存使用情况
- jhat # 查看java进程的堆内存使用情况
- jstatd # 远程监控java进程的内存使用情况
- jmap -heap # 查看java进程的堆内存使用情况
- jmap -histo # 查看java进程的堆内存使用情况
jps
jps命令用于查看当前运行的java进程,输出格式如下:
PID COMMAND CLASS JAR
1234 org.apache.catalina.startup.Bootstrap org.apache.catalina.startup.Bootstrap /usr/local/apache-tomcat-9.0.73/bin/bootstrap.jar
jps命令的常用参数:
- -l:显示完整的类名和JAR包名。
- -m:显示main方法的参数。
- -v:显示JVM参数。
- -q:只显示PID。
jps命令的使用示例:
jps -l
# 显示完整的类名和JAR包名
jps -m
# 显示main方法的参数
jps -v
# 显示JVM参数
jps -q
# 只显示PID
jstat
jstat命令用于查看java进程的内存使用情况,输出格式如下:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024 1024 0 0 8192 8192 8192 8192 1024 1024 256 256 1 0.001 0 0.000 0.001
jstat命令的常用参数:
- -gc:查看Java堆的使用情况。
- -gccapacity:查看Java堆的容量。
- -gcnew:查看新生代的使用情况。
- -gcold:查看老年代的使用情况。
jstat命令的使用示例:
jstat -gc <pid>
# 查看Java堆的使用情况
jstat -gccapacity <pid>
# 查看Java堆的容量
jstat -gcnew <pid>
# 查看新生代的使用情况
jstat -gcold <pid>
# 查看老年代的使用情况
jstat -gcmetacapacity <pid>
# 查看元空间的容量
jstat -gccapacity <pid>
# 查看Java堆的容量
jstack
jstack命令用于查看java进程的线程堆栈信息,输出格式如下:
"main" #1 prio=5 os_prio=0 tid=0x00007f8c4c001800 nid=0x1a03 runnable [0x00007f8c4c7ff000]
java.lang.Thread.State: RUNNABLEat java.base/java.lang.Object.wait(Native Method)at java.base/java.lang.Object.wait(Object.java:328)at java.base/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)at java.base/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)at org.apache.catalina.loader.WebappClassLoaderBase.clearReferences(WebappClassLoaderBase.java:2003)
jstack命令的常用参数:
- -l:显示锁的信息。
- -m:显示本地方法的堆栈信息。
- -h:显示帮助信息。
jstack命令的使用示例:
jstack <pid>
# 查看java进程的线程堆栈信息
jstack -l <pid>
# 显示锁的信息
jstack -m <pid>
# 显示本地方法的堆栈信息
jstack -h
# 显示帮助信息
jmap
jmap命令用于查看java进程的堆内存使用情况,输出格式如下:
num #instances #bytes class name1: 1 12345678 com.example.MyClass2: 2 23456789 java.lang.String3: 3 34567890 java.lang.Integer
jmap命令的常用参数:
- -heap:查看Java堆的使用情况。
- -histo:查看Java堆的类实例信息。
- -dump:导出Java堆的快照文件。
jmap命令的使用示例:
jmap -heap <pid>
# 查看Java堆的使用情况
jmap -histo <pid>
# 查看Java堆的类实例信息
jmap -dump:live,format=b,file=heapdump.hprof <pid>
# 导出Java堆的快照文件
jmap -dump:format=b,file=heapdump.hprof <pid>
# 导出Java堆的快照文件
Tomcat 基础 JDK
Tomcat好帮手—JDK
- JDK是 Java 语言的软件开发工具包,JDK是整个java开发的核心,它包含JAVA工具还包括完整的 JRE(Java Runtime Environment)Java运行环境,包括了用于产品环境的各种库类,以及给开发人员使用的补充库。
- JDK是Java开发的基础,Tomcat是Java Web应用程序的服务器,Tomcat依赖于JDK来运行和管理Java Web应用程序。
- Tomcat是一个开源的Java Servlet容器和Web服务器,支持Java EE规范,提供了Servlet、JSP、EL和WebSocket等功能。Tomcat是Java Web应用程序的标准服务器,广泛用于开发和部署Java Web应用程序。
JDK包含了一批用于Java开发的组件,其中包括:
- javac:编译器,将后缀名为.java的源代码编译成后缀名为“.class”的字节码
- java:运行工具,运行.class的字节码
- jar:打包工具,将相关的类文件打包成一个文件
- javadoc:文档生成器,从源码注释中提取文档,注释需匹配规范
- jdb debugger:调试工具
- jps:显示当前java程序运行的进程状态
- extcheck:一个检测jar包冲突的工具
- apt:注释处理工具
- jhat:java堆分析工具
- jstack:栈跟踪程序
- idlj:IDL-to-Java编译器。将IDL语言转化为java文件
- jrunscript:命令行脚本运行
- war–需要使用tomcat jar–代码里面集成了tomcat,部署一个jdk
- war传统的包, jar一般属于微服务系列------ jdk
企业 Tomcat 运维
Tomcat 简介
- Tomcat是一个开源的Java Servlet容器和Web服务器,支持Java EE规范,提供了Servlet、JSP、EL和WebSocket等功能。Tomcat是Java Web应用程序的标准服务器,广泛用于开发和部署Java Web应用程序。
- Tomcat是Apache软件基金会的一个项目,最初由Sun Microsystems开发,后来被Apache软件基金会接管。Tomcat是Java EE的参考实现,支持Servlet、JSP、EL和WebSocket等规范。
- Tomcat是一个轻量级的Web服务器,适合用于开发和测试Java Web应用程序。Tomcat可以与其他Web服务器(如Apache HTTP Server、Nginx等)结合使用,提供更高的性能和可扩展性。
- Tomcat是一个跨平台的Web服务器,可以在Windows、Linux、macOS等操作系统上运行。Tomcat支持多种协议,包括HTTP、HTTPS、AJP等,可以与其他Web服务器和应用程序服务器结合使用。
- Tomcat是一个开源的Web服务器,遵循Apache许可证2.0,允许用户自由使用、修改和分发。Tomcat是一个活跃的开源项目,拥有大量的社区支持和文档资源。
- 解析java代码: JAVA容器,WEB容器,WEB中间件:
java容器:JVM
WEB容器:Tomcat
WEB中间件:Tomcat+JVM
Tomcat,JBOSS、resin、weblogic等 —解析动态页面/Weblogic —收费。
安装Tomcat & JDK
- 安装时候选择tomcat软件版本要与程序开发使用的版本一致。jdk版本要进行与tomcat保持一致。
Tomcat主目录介绍
- bin:存放Tomcat的启动和关闭脚本
- conf:存放Tomcat的配置文件
- lib:存放Tomcat的核心类库
- logs:存放Tomcat的日志文件
- webapps:存放Web应用程序的目录
- work:存放Tomcat编译后的JSP文件和Servlet类文件
- temp:存放临时文件
webapps目录介绍
- ROOT:默认的Web应用程序,访问http://localhost:8080时显示的页面
- examples:Tomcat自带的示例应用程序
- manager:Tomcat的管理界面,用于管理Web应用程序
- host-manager:Tomcat的虚拟主机管理界面
- docs:Tomcat的文档目录
Tomcat配置文件目录介绍(conf)
- server.xml:Tomcat的主配置文件,配置服务器的基本信息
- web.xml:Tomcat的全局配置文件,配置Web应用程序的基本信息
- context.xml:Tomcat的上下文配置文件,配置Web应用程序的上下文信息
- tomcat-users.xml:Tomcat的用户管理配置文件,配置用户和角色信息
- catalina.policy:Tomcat的安全策略配置文件,配置Java安全策略
- catalina.properties:Tomcat的属性配置文件,配置Tomcat的基本属性
Tomcat的管理
- 启动程序
cd /usr/local/apache-tomcat-9.0.73/bin
./startup.sh - 关闭程序
cd /usr/local/apache-tomcat-9.0.73/bin
./shutdown.sh - 重启程序
cd /usr/local/apache-tomcat-9.0.73/bin
./shutdown.sh
./startup.sh
端口:8080
- Tomcat默认使用8080端口,可以通过修改server.xml文件中的Connector元素来更改端口号。
server.xml配置文件
- server.xml是Tomcat的主配置文件,位于conf目录下。该文件主要用于配置Tomcat的基本信息,包括端口、连接器、虚拟主机等信息。以下是server.xml文件中一些重要元素的说明:
- :配置Tomcat的连接器,包括协议、端口、最大线程数等信息。
- :配置虚拟主机,包括主机名、应用程序目录等信息。
- :配置Web应用程序的上下文信息,包括路径、文档根目录等信息。
- :配置Tomcat的引擎,包括名称、默认虚拟主机等信息。
- :配置Tomcat的安全域,包括用户和角色信息。
WEB站点部署
上线的代码有两种方式:
- 第一种方式是直接将程序目录放在webapps目录下面- 第二种方式是将程序打包成WAR包,放在webapps目录下面
使用war包部署web站点
- 将war包放在webapps目录下面,Tomcat会自动解压缩war包,并将其部署为Web应用程序。
- 访问http://localhost:8080/yourapp即可访问Web应用程序。
手动解压war包
- 将war包放在webapps目录下面,使用unzip命令解压缩war包。
- 访问http://localhost:8080/yourapp即可访问Web应用程序。
自定义默认网站目录
修改server.xml文件
- 找到元素,修改appBase属性为自定义的目录。
- 修改元素,修改path属性为自定义的路径。
修改web.xml文件
- 找到元素,修改url-pattern属性为自定义的路径。
重启Tomcat
cd /usr/local/apache-tomcat-9.0.73/bin
./shutdown.sh
./startup.sh
Tomcat多实例配置
多实例(多进程):同一个程序启动多次,分为两种情况:
- 第一种情况是使用不同的配置文件启动多个Tomcat实例。
- 第二种情况是使用相同的配置文件,但指定不同的端口号启动多个Tomcat实例。
多实例配置
- 复制Tomcat目录,修改目录名称。
- 例如,将/usr/local/apache-tomcat-9.0.73复制为/usr/local/apache-tomcat-9.0.73-1。
- 修改conf/server.xml文件中的端口号。
- 修改Connector元素中的port属性为不同的端口号。
- 修改元素中的appBase属性为不同的目录。
- 修改conf/web.xml文件中的上下文路径。
- 修改元素中的url-pattern属性为不同的路径。
- 修改conf/context.xml文件中的上下文路径。
- 修改元素中的path属性为不同的路径。
- 修改bin/catalina.sh文件中的JAVA_HOME和CATALINA_HOME变量。
- 修改JAVA_HOME变量为JDK的安装路径。
- 修改CATALINA_HOME变量为Tomcat的安装路径。
- 启动多个Tomcat实例。
cd /usr/local/apache-tomcat-9.0.73/bin
./startup.sh
cd /usr/local/apache-tomcat-9.0.73-1/bin
./startup.sh
tomcat反向代理集群
反向代理集群
- 反向代理集群是指将多个Tomcat实例通过反向代理服务器(如Nginx、Apache HTTP Server等)进行负载均衡和高可用性配置。
- 反向代理集群的主要优点包括:
- 提高性能:通过负载均衡,将请求分发到多个Tomcat实例,提高系统性能。
- 提高可用性:通过高可用性配置,当一个Tomcat实例出现故障时,其他实例可以继续提供服务。
- 提高安全性:通过反向代理服务器,可以隐藏Tomcat实例的真实地址,提高系统安全性。
Nginx反向代理集群配置
安装Nginx
yum install nginx -y
创建upstream配置文件:
vim /etc/nginx/conf.d/upstream.conf
upstream tomcat {server 192.168.233.129:8080;server 192.168.233.129:8081;}
创建nginx配置文件:
vim /etc/nginx/conf.d/tomcat.conf
server {listen 80;server_name localhost;location / {proxy_pass http://tomcat;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
Tomcat安全优化
telnet 管理端口保护(强制)
类别
- telnet管理端口保护
配置内容及说明
- 修改默认的8005管理端口为不易猜测的端口(大于1024);
- 修改SHUTDOWN指令为其他字符串;
- 修改CATALINA_HOME/bin/catalina.sh文件中的JAVA_OPTS变量,添加-Djava.security.egd=file:/dev/./urandom参数。
- 修改CATALINA_HOME/conf/server.xml文件中的元素,添加address属性,限制访问IP地址。
标准配置
vim /usr/local/apache-tomcat-9.0.73/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" >
备注
- 8005端口是Tomcat的管理端口,默认情况下是可以被外部访问的,建议修改为不易猜测的端口。
- SHUTDOWN指令是Tomcat的关闭指令,默认情况下是可以被外部访问的,建议修改为其他字符串。
- Djava.security.egd=file:/dev/./urandom参数是为了提高随机数生成器的性能,避免阻塞。
- address属性限制访问IP地址,可以设置为本地IP地址或内网IP地址,避免外部访问。
- 以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;
ajp 连接端口保护(推荐)
类别
- ajp连接端口保护
配置内容及说明
- 修改默认的8009连接端口为不易猜测的端口(大于1024);2.修改CATALINA_HOME/conf/server.xml文件中的元素,添加secret属性,限制访问IP地址。
标准配置
vim /usr/local/apache-tomcat-9.0.73/conf/server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secret="123456" />
备注
- 8009端口是Tomcat的ajp连接端口,默认情况下是可以被外部访问的,建议修改为不易猜测的端口。
- secret属性是Tomcat的ajp连接密码,默认情况下是可以被外部访问的,建议修改为其他字符串。
- address属性限制访问IP地址,可以设置为本地IP地址或内网IP地址,避免外部访问。
- 以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;;保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;
禁用管理端(强制)
类别
- 禁用管理端
配置内容及说明
- 删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件;2. 删除{Tomcat安装目录}/webapps下默认的所有目录和文件;3.将tomcat 应用根目录配置为tomcat安装目录以外的目录;
标准配置
vim /usr/local/apache-tomcat-9.0.73/conf/web.xml
<Context antiResourceLocking="false" privileged="true"><WatchedResource>WEB-INF/web.xml</WatchedResource><Parameter name="org.apache.catalina.startup.EXIT_ON_INIT_FAILURE" value="false" override="false"/><Parameter name="org.apache.catalina.startup.EXIT_ON_INIT_FAILURE" value="false" override="false"/>
</Context>
备注
- 禁用Tomcat的管理端口,防止外部访问。
- 以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置;
- 对于前段web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重;
降权启动(强制)
类别
- 降权启动
配置内容及说明
- 修改Tomcat的启动用户为非root用户;2.修改Tomcat的安装目录和工作目录的权限为非root用户;
标准配置
vim /usr/local/apache-tomcat-9.0.73/bin/catalina.sh
#!/bin/sh
export CATALINA_HOME=/usr/local/apache-tomcat-9.0.73
export CATALINA_BASE=/usr/local/apache-tomcat-9.0.73
备注
- Tomcat的默认启动用户是root,建议修改为非root用户。
- Tomcat的安装目录和工作目录的权限是root,建议修改为非root用户。
- 以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置;
- 对于前段web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重;
访问日志格式规范(推荐)
类别
- 访问日志格式规范
配置内容及说明
- 修改CATALINA_HOME/conf/server.xml文件中的元素,添加Valve元素,配置访问日志格式。
标准配置
vim /usr/local/apache-tomcat-9.0.73/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve"directory="logs"prefix="localhost_access_log."suffix=".txt"pattern="%h %l %u %t "%r" %s %b" />
</Host>
备注
- 访问日志格式规范,建议使用Common Log Format(CLF)或Combined Log Format(CLF)。
- 以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置;
隐藏版本号
类别
- 隐藏版本号
配置内容及说明
1.修改CATALINA_HOME/conf/web.xml文件中的<servlet>元素,添加init-param元素,配置隐藏版本号。
标准配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" />
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
备注
- 隐藏Tomcat的版本号,防止外部攻击。
- 以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置;
Tomcat性能优化
Tomcat性能优化
- Tomcat的性能优化主要包括以下几个方面:
- JVM参数优化:根据实际情况调整JVM参数,提高Java虚拟机的性能。
- Tomcat参数优化:根据实际情况调整Tomcat的参数,提高Tomcat的性能。
- Web应用程序优化:根据实际情况优化Web应用程序,提高Web应用程序的性能。
- 数据库连接池优化:根据实际情况调整数据库连接池的参数,提高数据库连接池的性能。
- 缓存优化:根据实际情况调整缓存的参数,提高缓存的性能。
上策:优化代码
- 该项需要开发经验足够丰富,对开发人员要求较高。
中策:jvm优化机制 垃圾回收机制把不需要的内存回收
- 垃圾回收机制:Java虚拟机自动管理内存,定期回收不再使用的对象和数组。
- 垃圾回收算法:Java虚拟机使用多种垃圾回收算法,包括标记-清除算法、复制算法、标记-整理算法等。
- 垃圾回收器:Java虚拟机使用多种垃圾回收器,包括串行垃圾回收器、并行垃圾回收器、CMS垃圾回收器等。
内存配置优化
- -Xms:设置Java堆的初始大小。# 初始堆和最大堆设为相同值,避免动态调整开销
- -Xmx:设置Java堆的最大大小。# 初始堆和最大堆设为相同值,避免动态调整开销
- -Xmn:设置新生代的大小。 # 年轻代大小(建议占堆的 1/3 到 1/2)
- -XX:NewRatio:设置新生代和老年代的比例。
- -XX:SurvivorRatio:设置Eden区和Survivor区的比例。
- -XX:MaxTenuringThreshold:设置对象在新生代中存活的最大次数。
堆总大小不超过物理内存的 60%~70%(预留内存给其他进程和堆外内存)。
年轻代大小根据对象存活率调整:短生命周期对象多则增大年轻代。
堆外内存管理
- 设置 -XX:MaxDirectMemorySize 的原则
- 默认值
- 如果不显式设置 -XX:MaxDirectMemorySize,默认值为 -Xmx(最大堆内存)减去一个 JVM 内部开销。
- 例如,-Xmx4g 时,默认直接内存约为 4GB
- 建议值
- 一般场景:设置为堆内存的 1/4 到 1/2
- 例如,堆内存为 4GB 时,直接内存可设置为 1GB 到 2GB。
- 高 I/O 场景:如果应用大量使用 NIO 或 Netty,可适当增大直接内存。
- 例如,堆内存为 8GB 时,直接内存可设置为 2GB 到 4GB。
- 低内存场景:如果物理内存有限,需严格控制直接内存大小。
- 例如,堆内存为 2GB 时,直接内存可设置为 512MB。
容器环境优化
- 适配容器内存限制
- 参数
- -XX:+UseContainerSupport # 启用容器支持(JDK 8u191+)
- -XX:MaxRAMPercentage=75.0 # 限制 JVM 使用容器内存的 75%
- 避免 OOM Killer:在 Docker 中设置内存限制略大于 JVM 堆(如 -m 5g 对应 -Xmx4g)
下策:加足够大的内存
- 物理内存:根据实际情况增加物理内存,提高系统性能。
- 虚拟内存:根据实际情况增加虚拟内存,提高系统性能。
- 硬盘:根据实际情况增加硬盘,提高系统性能。
- CPU:根据实际情况增加CPU,提高系统性能。
- 网络:根据实际情况增加网络带宽,提高系统性能。
相关文章:
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...