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: RUNNABLE
at 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 name
1: 1 12345678 com.example.MyClass
2: 2 23456789 java.lang.String
3: 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,提高系统性能。
- 网络:根据实际情况增加网络带宽,提高系统性能。