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: 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包

自定义默认网站目录

修改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 &quot;%r&quot; %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 &quot;%r&quot; %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,提高系统性能。
  • 网络:根据实际情况增加网络带宽,提高系统性能。
相关推荐
不倒翁^130 分钟前
kafka-消息中间件(one-day)【概论】
中间件
三目君5 小时前
SpringMVC异步处理Servlet
java·spring·servlet·tomcat·mvc
芯盾时代10 小时前
AI中间件,构建大模型应用的标准化接入枢纽
人工智能·网络安全·中间件
嫄码1 天前
kafka快速入门与知识汇总
java·大数据·分布式·中间件·kafka·linq
想躺平的咸鱼干1 天前
RestClient
java·后端·elasticsearch·中间件·intellij-idea
ytttr8731 天前
docker快速部署OS web中间件 数据库 编程应用
前端·docker·中间件
厚衣服_31 天前
第7篇:中间件全链路监控与 SQL 性能分析实践
数据库·sql·中间件
Bullet3431 天前
IDEA运行Tomcat出现乱码问题解决汇总
java·经验分享·笔记·tomcat·intellij-idea
何双新1 天前
Cursor+MCP编程工具助力开发效率倍增
中间件·golang·pycharm