目录

一、JVM组成

1.JVM的组成及详解

2.内存的由来

3.虚拟机

3.1 Garbage 垃圾确定方法

3.2垃圾回收基本算法

3.2.1标记-清除 Mark-Sweep

3.2.2标记压缩(压实)Mark-Compact

3.2.3复制 Copying

3.2.4 多种算法总结

3.2.5拓展——STW

4.分代堆内存GC策略

4.1堆内存分代

4.2年轻代回收Minor GC

 4.2.1年轻代——伊甸园区

4.2.2年轻代——From survivor

4.2.3年轻代——To survivor

4.3老年代回收Major GC

5.Java 内存调整相关参数

5.1JVM 内存常用相关参数

5.1.1 Java 选项

5.1.2示例——调试java heap

5.1.3Tomcat heap调优

5.1.4查看OOM(Out Of Memory)——JDK工具监控使用情况

5.1.5 Jvisualvm

5.1.6 Jprofiler——定位OOM问题原因

二、Tomcat调优

三、Tomcat多实例——反向代理多机

1.Nginx代理服务器及静态资源Web服务器配置 

2.Tomcat动态资源服务器配置 

3.测试


在目前流行的互联网架构中,Tomcat在目前的网络编程中是举足轻重的,由于Tomcat的运行依赖于JVM,从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM Tomcat 自身调优三部分

一、JVM组成

1.JVM的组成及详解

JVM组成部分 

  • 类加载子系统: 使用Java语言编写.java Source Code文件,通过javac编译成.class Byte Code文件。class loader类加载器将所需所有类加载到内存,必要时将类实例化成实例
  • 运行时数据区: 最消耗内存的空间,需要优化
  • 执行引擎: 包括JIT (JustInTimeCompiler)即时编译器, GC垃圾回收器
  • 本地方法接口: 将本地方法栈通过JNI(Java Native Interface)调用Native Method Libraries, 比如:C,C++库等,扩展Java功能,融合不同的编程语言为Java所用

JVM运行时数据区域由下面部分构成

  • Method Area (线程共享):方法区是所有线程共享的内存空间,存放已加载的类信息(构造方法,接口定义),常量(final),静态变量(static), 运行时常量池等。但实例变量存放在堆内存中. 从JDK8开始此空间由永久代改名为元空间
  • heap (线程共享):堆在虚拟机启动时创建,存放创建的所有对象信息。如果对象无法申请到可用内存将抛出OOM异常.堆是靠GC垃圾回收器管理的,通过-Xmx -Xms 指定最大堆和最小堆空间大小
  • Java stack (线程私有):Java栈是每个线程会分配一个栈,存放java中8大基本数据类型,对象引用,实例的本地变量,方法参数和返回值等,基于FILO()(First In Last Out),每个方法为一个栈帧 1 50 %
  • Program Counter Register (线程私有):PC寄存器就是一个指针,指向方法区中的方法字节码,每一个线程用于记录当前线程正在执行的字节码指令地址。由执行引擎读取下一条指令.因为线程需要切换,当一个线程被切换回来需要执行的时候,知道执行到哪里了
  • Native Method stack (线程私有):本地方法栈为本地方法执行构建的内存空间,存放本地方法执行时的局部变量、操作数等。

Method Area(线程共享)相当于源数据区;

heap(线程共享)相当于建筑图纸,存放了线程所必要的方案;是重点调优内容;

Program Counter Register(线程私有)标记了线程是否使用;

2.内存的由来

在算术复杂的时候, cpu也会将复杂的任务拆解,这时就需要将临时结果找个地方存放一下于是工程师在cpu里设计了寄存器里,将临时结果存在寄存器里。需要的时候在拿出来。那么可以多设计几个寄存器么?答案是不能,因为cpu主要是用来计算,不是用来存储数据,多设计寄存器会加大cpu的开发设计难度,这时这些临时结果就要找个地方存放,这时就产生了内存,由于硬盘,u盘,软盘等设备的数据读取速度太慢,所以内存是最合适的。
内存胜出后,会在内存中专门预留出两块地方用来存储临时数据,我们称为栈和堆

出栈后数据还在这里,此时数据就被称为垃圾

3.虚拟机

目前Oracle官方使用的是HotSpot, 它最早由一家名为"Longview Technologies"公司设计,使用了很多优秀的设计理念和出色的性能,1997年该公司被SUN公司收购。后来随着JDK一起发布了HotSpot VM。目前HotSpot是最主要的 JVM。

安卓程序需要运行在JVM上,而安卓平台使用了Google自研的Java虚拟机——Dalvid,适合于内存、处理器能力有限系统。

在堆内存中如果创建的对象不再使用,仍占用着内存,此时即为垃圾.需要即使进行垃圾回收,从而释放内存空间给其它对象使用

其实不同的开发语言都有垃圾回收问题,C,C++需要程序员人为回收,造成开发难度大,容易出错等问题,但执行效率高,而JAVA和Python中不需要程序员进行人为的回收垃圾,而由JVM或相关程序自动回收垃圾,减轻程序员的开发难度,但可能会造成执行效率低下

堆内存里面经常创建、销毁对象,内存也是经常被使用、被释放。如果不妥善处理,一个使用频繁的进程,可能会出现虽然有足够的内存容量,但是无法分配出可用内存空间,因为没有连续成片的内存了,内存全是碎片化的空间。

所以需要有合适的垃圾回收机制,确保正常释放不再使用的内存空间,还需要保证内存空间尽可能的保持一定的连续

java什么是垃圾,没有被使用的进程、线程称之为垃圾

对于垃圾回收,需要解决的三个问题

  • 哪些是垃圾要回收 A计数法(计数为0 就是垃圾) B根搜索法(具体是谁在用 这个进程)
  • 怎么回收垃圾
  • 什么时候回收垃圾

3.1 Garbage 垃圾确定方法

  • 引用计数: 每一个堆内对象上都与一个私有引用计数器,记录着被引用的次数,引用计数清零,该对象所占用堆内存就可以被回收。循环引用的对象都无法将引用计数归零,就无法清除。Python中即使用此种方式。 简单来说就是有个笔记本,记录有没有人在用,缺陷,AB 资源互相调用
  • 根搜索(可达)算法 Root Searching

由某个程序(进程)产生的线程是有根的,由资源产生的进程或者线程都是根可达;

如果是从根环境产生的进程或者线程,那么该进程或者线程不是垃圾;反之,则为垃圾。

3.2垃圾回收基本算法

3.2.1标记-清除 Mark-Sweep

分垃圾标记阶段和内存释放阶段。标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆,对未标记对象(即不再使用的对象)逐一进行清理。

标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多,逐一删除效率也会影响)

内存分配的时候要求是连续空间;如果使用内存一定要是连续空间。

3.2.2标记压缩(压实)Mark-Compact

分垃圾标记阶段和内存整理阶段。标记阶段,找到所有可访问对象打个标记。内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。

标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。缺点是内存整理过程有消耗,效率相对低下

3.2.3复制 Copying

先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价。好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以效率很高。

3.2.4 多种算法总结

没有最好的算法,在不同场景选择最合适的算法

  • 效率: 复制算法>标记清除算法> 标记压缩算法
  • 内存整齐度: 复制算法=标记压缩算法> 标记清除算法
  • 内存利用率: 标记压缩算法=标记清除算法>复制算法

内存整齐度:会不会产生内存碎片

3.2.5拓展——STW

对于大多数垃圾回收算法而言,GC线程工作时,停止所有工作的线程,称为Stop The World。GC 完成时,恢复其他工作线程运行。这也是JVM运行中最头疼的问题。

4.分代堆内存GC策略

4.1堆内存分代

上述垃圾回收算法都有优缺点,能不能对不同数据进行区分管理,不同分区对数据实施不同回收策略,分而治之

  • 堆进一步细化分为:新生代、中生代、老生代
  • Java中每新new一个对象所占用的内存空间就是新生代的空间,当Java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代
  • 整个JVM堆大小 =  新生代大小 +  老生代大小  +  永久代大小

将heap内存空间分为三个不同类别: 年轻代、老年代、持久代

Heap堆内存分为

  • 年轻代Young:Young Generation
  • 老年代Tenured:Old Generation 

年轻代分区

  • 伊甸园区(Eden):只有一个,刚刚创建的对象的新生区域,进程线程新出生的区域,在伊甸园区的进程和线程一般不会产生垃圾;
  • 幸存(存活)区(Servivor Space):有2个幸存区,From和To,二者大小相等,地位相同,可进行互换;From是指本次复制数据的源区,To是指本次复制数据的目标区。

默认空间大小比例

规律:一般情况99%的对象都是临时对象 

在tomcat 状态页可以看到以下的内存分代 持久代是 元空间 metaspace

4.2年轻代回收Minor GC

  • 起始时,所有新建对象(特大对象直接进入老年代)都出生在eden,当eden满了,启动**GC。这个称为Young GC 或者 Minor GC
  • 标记eden存活对象,然后将存活对象复制到s0(假设本次是s0,也可以是s1,它们可以调换),eden剩余所有空间都清空。GC完成
  • 继续新建对象,当eden再次满了,启动GC
  • 先同时标记eden和s0中存活对象,然后将存活对象复制到s1。将eden和s0清空,此次GC完成
  • 继续新建对象,当eden满了,启动GC
  • 标记eden和s1中存活对象,然后将存活对象复制到s0。将eden和s1清空,此次GC完成以后就重复上面的步骤。
 4.2.1年轻代——伊甸园区

伊甸园区:进程和线程的出生区域,新开的进程和线程都由此区域开始;

在新生代区域一段时间后,伊甸园区可能会有未使用的进程或者线程,会产生垃圾 

此时需要启动GC,标记存活对象(在使用的进程或者线程(蓝色圆形) )将其复制到s0((假设本次是s0,也可以是s1,它们可以调换) )

4.2.2年轻代——From survivor

此时将伊甸园区的剩余所有空间清空,GC完成 

4.2.3年轻代——To survivor

继续新建对象,如果Eden满了,继续启动GC

年轻代回收Minor GC就是如此循环标记清除 

通常场景下,大多数对象都不会存活很久,而且创建活动非常多,新生代就需要频繁垃圾回收。但是,如果一个对象一直存活,它最后就在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,可通过java的选项 -XX:MaxTenuringThreshold=N 指定),就直接复制到老年代。

4.3老年代回收Major GC

  • 进入老年代的数据较少,所以老年代区被占满的速度较慢,所以垃圾回收也不频繁。如果老年代也满了,会触发老年代GC,称为Old GC或者 Major GC
  • 由于老年代对象一般来说存活次数较长,所以较常采用标记-压缩算法。
  • 当老年代满时,会触发 Full GC,即对所有"代"的内存进行垃圾回收
  • Minor GC比较频繁,Major GC较少。但一般Major GC时,由于老年代对象也可以引用新生代对象,所以先进行一次Minor GC,然后在Major GC会提高效率。可以认为回收老年代的时候完成了一次Full GC。所以可以认为 MajorGC = FullGC

进程或者线程运行一段时候后,由于一直运行,不断的又在产生新的进程和线程,伊甸园区也会不断地更新迭代,在年轻代的一些进程和线程会到老年代,此时老年代也会有进程或者线程退出使用,那么就会产生垃圾,此时需要清理老年代的垃圾。

当老年代满时,会触发Full GC,即对所有“代”的内存进行垃圾回收,老年代中所有进程和线程会统一停一下然后交由老年代的Major GC进行垃圾清理,

5.Java 内存调整相关参数

5.1JVM 内存常用相关参数

Java 命令行参考文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

帮助:man java

5.1.1 Java 选项

选项分类

  • 选项名称 此为标准选项,所有HotSpot都支持
  • -X选项名称 为稳定的非标准选项
  • -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消

[root@localhost ~]#java -h
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32	  使用 32 位数据模型 (如果可用)
    -d64	  使用 64 位数据模型 (如果可用)
    -server	  选择 "server" VM
                  默认 VM 是 server,
                  因为您是在服务器类计算机上运行。


    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

[root@localhost ~]#java -X
    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行
    -Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
                      设置搜索路径以引导类和资源
    -Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
                      附加在引导类路径末尾
    -Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
                      置于引导类路径之前
    -Xdiag            显示附加诊断消息
    -Xnoclassgc       禁用类垃圾收集
    -Xincgc           启用增量垃圾收集
    -Xloggc:<file>    将 GC 状态记录在文件中 (带时间戳)
    -Xbatch           禁用后台编译
    -Xms<size>        设置初始 Java 堆大小
    -Xmx<size>        设置最大 Java 堆大小
    -Xss<size>        设置 Java 线程堆栈大小
    -Xprof            输出 cpu 配置文件数据
    -Xfuture          启用最严格的检查, 预期将来的默认值
    -Xrs              减少 Java/VM 对操作系统信号的使用 (请参阅文档)
    -Xcheck:jni       对 JNI 函数执行其他检查
    -Xshare:off       不尝试使用共享类数据
    -Xshare:auto      在可能的情况下使用共享类数据 (默认)
    -Xshare:on        要求使用共享类数据, 否则将失败。
    -XshowSettings    显示所有设置并继续
    -XshowSettings:all
                      显示所有设置并继续
    -XshowSettings:vm 显示所有与 vm 相关的设置并继续
    -XshowSettings:properties
                      显示所有属性设置并继续
    -XshowSettings:locale
                      显示所有与区域设置相关的设置并继续

-X 选项是非标准选项, 如有更改, 恕不另行通知。
参数说明举例
-Xms设置应用程序初始使用的堆内存大小(年轻代+老年代)-Xms2g
-Xmx设置应用程序能获得的最大堆内存早期JVM不建议超过32G,内存管理效率下降-Xms4g
-XX:NewSize设置初始新生代大小-XX:NewSize=128m
-XX:MaxNewSize设置最大新生代内存空间-XX:MaxNewSize=256m
-Xmnsize同时设置-XX:NewSize 和 -XX:MaxNewSize,代-Xmn1g
-XX:NewRatio以比例方式设置新生代和老年代-XX:NewRatio=2new/old=1/2
-XX:SurvivorRatio以比例方式设置eden和survivor(S0或S1)-XX:SurvivorRatio=6eden/survivor=6/1new/survivor=8/1
-Xss设置每个线程私有的栈空间大小,依据具体线程-Xss256k

建议将初始使用的堆内存大小(Xms)和最大堆内存大小(Xmx)设置为一样

#有不稳定选项的当前生效值
[root@localhost ~]#java -XX:+PrintFlagsFinal
#查看所有不稳定选项的默认值
[root@localhost ~]#java -XX:+PrintFlagsInitial
5.1.2示例——调试java heap
[root@localhost ~]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.java
[root@localhost opt]#javac Heap.java 
[root@localhost opt]#ls
Heap.class  Heap.java
[root@localhost opt]#echo $CLASSPATH
/usr/local/jdk/lib/:/usr/local/jdk/jre/lib/
java -Xms1024m -Xmx1024m -XX:+PrintGCDetails -cp  . Heap
#指定内存空间大小
max=1029177344字节	981.5MB
total=1029177344字节	981.5MB
Heap
 PSYoungGen      total 305664K, used 10486K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)
  eden space 262144K, 4% used [0x00000000eab00000,0x00000000eb53d888,0x00000000fab00000)
  from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)
  to   space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)
 ParOldGen       total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)
  object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)
 Metaspace       used 2528K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 269K, capacity 386K, committed 512K, reserved 1048576K

5.1.3Tomcat heap调优

默认不指定,-Xmx大约使用了四分之一的内存

[root@localhost ~]#cd /usr/local/tomcat/bin/
[root@localhost bin]#ls
bootstrap.jar                 configtest.sh     shutdown.sh
catalina.bat                  daemon.sh         startup.bat
catalina.sh                   digest.bat        startup.sh
catalina-tasks.xml            digest.sh         tomcat-juli.jar
ciphers.bat                   makebase.bat      tomcat-native.tar.gz
ciphers.sh                    makebase.sh       tool-wrapper.bat
commons-daemon.jar            setclasspath.bat  tool-wrapper.sh
commons-daemon-native.tar.gz  setclasspath.sh   version.bat
configtest.bat                shutdown.bat      version.sh
[root@localhost bin]#vim catalina.sh

 -server:服务器模式
-Xms:堆内存初始化大小
-Xmx:堆内存空间上限
-XX:NewSize=:新生代空间初始化大小 
-XX:MaxNewSize=:新生代空间最大值

[root@localhost bin]#systemctl restart tomcat

5.1.4查看OOM(Out Of Memory)——JDK工具监控使用情况
[root@localhost opt]#ls
Heap.class  Heap.java
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.class  Heap.java  HeapOom2.java
[root@localhost opt]#javac HeapOom2.java 
[root@localhost opt]#ls
Heap.class  Heap.java  HeapOom2.class  HeapOom2.java
[root@localhost opt]#java -cp . HeapOom2
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3332)
	at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
	at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:674)
	at java.lang.StringBuilder.append(StringBuilder.java:208)
	at HeapOom2.main(HeapOom2.java:6)

使用MobaXterm连接

[root@localhost ~]#export DISPLAY=192.168.241.11:0.0
[root@localhost ~]#yum -y install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1
[root@localhost ~]#which jvisualvm
/usr/local/jdk/bin/jvisualvm
[root@localhost ~]#jvisualvm
5.1.5 Jvisualvm

[root@localhost opt]#ls
Heap.class  Heap.java  HeapOom2.class  HeapOom2.java
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Heap.class  Heap.java  HeapOom2.class  HeapOom2.java  HeapOom.java
[root@localhost opt]#javac HeapOom.java 
[root@localhost opt]#ls
Heap.class  HeapOom2.class  HeapOom.class
Heap.java   HeapOom2.java   HeapOom.java
[root@localhost opt]#java -cp . -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid8578.hprof ...
Heap dump file created [7088230 bytes in 0.010 secs]
java.lang.OutOfMemoryError: Java heap space
	at HeapOom.main(HeapOom.java:12)
count=7

5.1.6 Jprofiler——定位OOM问题原因

JProfiler是一款功能强大的Java开发分析工具,它可以快速的帮助用户分析出存在的错误,软件还可对需要的显示类进行标记,包括了内存的分配情况和信息的视图等

JProfiler官网:http://www.ej-technologies.com/products/jprofiler/overview.html

java -cp . -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom

二、Tomcat调优

Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。

#Tomcat 配置文件参数优化##
常用的优化相关参数如下:
【redirectPort】如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS   443 请求时,则转发至此属性定义的 8443 端口。

【maxThreads】Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200。

【minSpareThreads】最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。

【maxSpareThreads】最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。

【processorCache】进程缓冲器,可以提升并发请求。默认值是200,如果不做限制的话可以设置为-1,一般采用maxThreads的值或者-1。

【URIEncoding】指定 Tomcat 容器的 URL 编码格式,网站一般采用UTF-8作为默认编码。

【connnectionTimeout】网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。

【enableLookups】是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。

【disableUploadTimeout】上传时是否使用超时机制。应设置为 true。

【connectionUploadTimeout】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。

【acceptCount】指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。

【maxKeepAliveRequests】指定一个长连接的最大请求数。默认长连接是打开的,设置为1时,代表关闭长连接;为-1时,代表请求数无限制

【compression】是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。

【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。

【compressableMimeType】压缩类型,指定对哪些类型的文件进行数据压缩。

【noCompressionUserAgents="gozilla, traviata"】对于以下的浏览器,不启用压缩
#如果已经进行了动静分离处理,静态页面和图片等数据就不需做 Tomcat 处理,也就不要在 Tomcat 中配置压缩了。

以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。


vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/11.1" 
connectionTimeout="20000" 
redirectPort="8443" 
--71行--插入
minSpareThreads="50" 
enableLookups="false" 
disableUploadTimeout="true" 
acceptCount="300" 
maxThreads="500" 
processorCache="500"
URIEncoding="UTF-8" 
maxKeepAliveRequests="100"
compression="on" 
compressionMinSize="2048" 
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>

三、Tomcat多实例——反向代理多机

1.Nginx代理服务器及静态资源Web服务器配置 

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum install nginx -y
[root@localhost ~]#vim /etc/nginx/nginx.conf

[root@localhost ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost ~]#nginx -s reload
nginx: [error] invalid PID number "" in "/run/nginx.pid"
[root@localhost ~]#systemctl start nginx
[root@localhost ~]#nginx -s reload
[root@localhost ~]#mkdir /opt/html
[root@localhost ~]#vim /opt/html/test.html
[root@localhost ~]#cat /opt/html/test.html 
test test

2.Tomcat动态资源服务器配置 

[root@node2 ~]#systemctl stop firewalld
[root@node2 ~]#setenforce 0
[root@node2 ~]#cd /opt
[root@node2 opt]#rz -E
rz waiting to receive.
[root@node2 opt]#rz -E
rz waiting to receive.
[root@node2 opt]#ls
apache-tomcat-9.0.16.tar.gz  jdk-8u291-linux-x64.tar.gz
[root@node2 opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@node2 opt]#cd /usr/local/
[root@node2 local]#ls
bin  games    jdk1.8.0_291  lib64    nginx  share
etc  include  lib           libexec  sbin   src
[root@node2 local]#ln -s jdk1.8.0_291/ jdk
[root@node2 local]#ls
bin  games    jdk           lib    libexec  sbin   src
etc  include  jdk1.8.0_291  lib64  nginx    share
[root@node2 local]#vim /etc/profile.d/jdk.sh
[root@node2 local]#cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
[root@node2 local]#. /etc/profile.d/jdk.sh 
[root@node2 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@node2 local]#cd /opt
[root@node2 opt]#tar xf apache-tomcat-9.0.16.tar.gz  -C /usr/local/
[root@node2 opt]#cd /usr/local/
[root@node2 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    nginx  share
bin                   games  jdk      lib           libexec  sbin   src
[root@node2 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node2 local]#ls
apache-tomcat-9.0.16  games    jdk1.8.0_291  libexec  share
bin                   include  lib           nginx    src
etc                   jdk      lib64         sbin     tomcat
[root@node2 local]#useradd tomcat -s /sbin/nologin -M
[root@node2 local]#chown tomcat:tomcat tomcat/ -R
[root@node2 local]#ll
total 0
drwxr-xr-x.  9 tomcat tomcat 220 Mar  4 02:08 apache-tomcat-9.0.16
drwxr-xr-x.  2 root   root     6 Nov  5  2016 bin
drwxr-xr-x.  2 root   root     6 Nov  5  2016 etc
drwxr-xr-x.  2 root   root     6 Nov  5  2016 games
drwxr-xr-x.  2 root   root     6 Nov  5  2016 include
lrwxrwxrwx.  1 root   root    13 Mar  4 02:06 jdk -> jdk1.8.0_291/
drwxr-xr-x.  8  10143  10143 273 Apr  7  2021 jdk1.8.0_291
drwxr-xr-x.  2 root   root     6 Nov  5  2016 lib
drwxr-xr-x.  2 root   root     6 Nov  5  2016 lib64
drwxr-xr-x.  2 root   root     6 Nov  5  2016 libexec
drwxr-xr-x. 11 root   root   151 Feb 25 02:02 nginx
drwxr-xr-x.  2 root   root     6 Nov  5  2016 sbin
drwxr-xr-x.  5 root   root    49 Dec 18 08:36 share
drwxr-xr-x.  3 root   root    26 Feb 25 02:02 src
lrwxrwxrwx.  1 root   root    21 Mar  4 02:08 tomcat -> apache-tomcat-9.0.16/
[root@node2 local]#vim /usr/lib/systemd/system/tomcat.service
[root@node2 local]#cat /usr/lib/systemd/system/tomcat.service 
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecrStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@node2 local]#systemctl daemon-reload
[root@node2 local]#systemctl start tomcat
[root@node2 local]#systemctl status tomcat
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-03-04 02:15:48 EST; 4s ago
  Process: 2204 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2219 (catalina.sh)
   CGroup: /system.slice/tomcat.service
           ├─2219 /bin/sh /usr/local/tomcat/bin/catalina.sh start
           └─2220 /usr/bin/java -Djava.util.logging.config.file=/usr/local...

Mar 04 02:15:48 node2.localdomain systemd[1]: [/usr/lib/systemd/system/to...'
Mar 04 02:15:48 node2.localdomain systemd[1]: Starting Tomcat...
Mar 04 02:15:48 node2.localdomain systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 local]#cd tomcat/webapps/ROOT/
[root@node2 ROOT]#ls
asf-logo-wide.svg  bg-upper.png       tomcat.css        tomcat.svg
bg-button.png      favicon.ico        tomcat.gif        WEB-INF
bg-middle.png      index.jsp          tomcat.png
bg-nav.png         RELEASE-NOTES.txt  tomcat-power.gif
[root@node2 ROOT]#vim test.jsp
[root@node2 ROOT]#cat test.jsp 
cxk
[root@node3 ~]#systemctl stop firewalld
[root@node3 ~]#setenforce 0
[root@node3 ~]#cd /opt
[root@node3 opt]#rz -E
rz waiting to receive.
[root@node3 opt]#rz -E
rz waiting to receive.
[root@node3 opt]#ls
apache-tomcat-9.0.16.tar.gz  jdk-8u291-linux-x64.tar.gz
[root@node3 opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@node3 opt]#cd /usr/local/
[root@node3 local]#ls
bin  games    jdk1.8.0_291  lib64    sbin   src
etc  include  lib           libexec  share
[root@node3 local]#ln -s jdk1.8.0_291/ jdk
[root@node3 local]#ls
bin  games    jdk           lib    libexec  share
etc  include  jdk1.8.0_291  lib64  sbin     src
[root@node3 local]#vim /etc/profile.d/jdk.sh
[root@node3 local]#cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH
[root@node3 local]#. /etc/profile.d/jdk.sh 
[root@node3 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@node3 local]#cd /opt
[root@node3 opt]#tar xf apache-tomcat-9.0.16.tar.gz  -C /usr/local/
[root@node3 opt]#cd /usr/local/
[root@node3 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share
[root@node3 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node3 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share  tomcat
[root@node3 local]#useradd tomcat -s /sbin/nologin -M
[root@node3 local]#chown tomcat:tomcat tomcat/ -R
[root@node3 local]#ll
总用量 0
drwxr-xr-x. 9 tomcat tomcat 220 3月   4 15:08 apache-tomcat-9.0.16
drwxr-xr-x. 2 root   root     6 11月  5 2016 bin
drwxr-xr-x. 2 root   root     6 11月  5 2016 etc
drwxr-xr-x. 2 root   root     6 11月  5 2016 games
drwxr-xr-x. 2 root   root     6 11月  5 2016 include
lrwxrwxrwx. 1 root   root    13 3月   4 15:06 jdk -> jdk1.8.0_291/
drwxr-xr-x. 8  10143  10143 273 4月   8 2021 jdk1.8.0_291
drwxr-xr-x. 2 root   root     6 11月  5 2016 lib
drwxr-xr-x. 2 root   root     6 11月  5 2016 lib64
drwxr-xr-x. 2 root   root     6 11月  5 2016 libexec
drwxr-xr-x. 2 root   root     6 11月  5 2016 sbin
drwxr-xr-x. 5 root   root    49 1月  13 23:33 share
drwxr-xr-x. 2 root   root     6 11月  5 2016 src
lrwxrwxrwx. 1 root   root    21 3月   4 15:08 tomcat -> apache-tomcat-9.0.16/
[root@node3 local]#vim /usr/lib/systemd/system/tomcat.service
[root@node3 local]#cat /usr/lib/systemd/system/tomcat.service 
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecrStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@node3 local]#systemctl daemon-reload
[root@node3 local]#systemctl start tomcat
[root@node3 local]#systemctl status tomcat
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2024-03-04 15:15:47 CST; 4s ago
  Process: 2541 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2557 (catalina.sh)
   CGroup: /system.slice/tomcat.service
           ├─2557 /bin/sh /usr/local/tomcat/bin/catalina.sh start
           └─2558 /usr/bin/java -Djava.util.logging.config.file=/usr/local...

3月 04 15:15:47 node3.node3 systemd[1]: [/usr/lib/systemd/system/tomcat....'
3月 04 15:15:47 node3.node3 systemd[1]: Starting Tomcat...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_BASE:   /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_HOME:   /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CATALINA_TMPDIR: /usr...
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using JRE_HOME:        /usr
3月 04 15:15:47 node3.node3 startup.sh[2541]: Using CLASSPATH:       /usr...
3月 04 15:15:47 node3.node3 systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node3 local]#cd tomcat/webapps/ROOT/
[root@node3 ROOT]#ls
asf-logo-wide.svg  bg-upper.png       tomcat.css        tomcat.svg
bg-button.png      favicon.ico        tomcat.gif        WEB-INF
bg-middle.png      index.jsp          tomcat.png
bg-nav.png         RELEASE-NOTES.txt  tomcat-power.gif
[root@node3 ROOT]#vim test.jsp
[root@node3 ROOT]#cat test.jsp 
wyb

3.测试

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐