Tomcat

本文详细解读了Tomcat的server.xml配置,包括Server、Listener、GlobalNamingResources、Service、Connector、Engine、Host、Context等元素。此外,介绍了Tomcat的Catalina、Server、Service等核心组件及类加载机制,包括JVM的双亲委派模型和Tomcat的特殊加载方式。最后,讨论了Tomcat对https的支持和性能优化策略。
摘要由CSDN通过智能技术生成

1. server.xml解读

1. Server

  server标签为tomcat的根标签,它的一级子标签有:ListenerGlobalNamingResourcesService
  它有2个属性:
port:关闭服务器的监听端口
shutdown: 关闭服务器的指令字符串

1.1 Listener

  可以配置一些监听器,className属性指定class文件位置。

1.2 GlobalNamingResources

  可以配置一些全局的资源

1.3 Service

  service标签,有一个name属性,指定service的名称。它的下面一级标签有ListenerExecutorConnectorEngine

1.3.1 Listener

  配置生命周期监听器

1.3.2 Executor

  这个标签是设置一个线程池,可以在Connector标签中使用。
name:给这个线程池设置一个名称。
namePrefix: 给这个线程池起一个名字,这个名字的前缀设置。
maxThreads: 最大的线程数量。
minSpareThreads: 核心线程的数量, 不会被销毁, 一直会存在。
maxIdleTime: 线程空闲的时间, 设置空闲线程在这个时间之后被销毁,默认1分钟,这个值的单位毫秒
maxQueueSize:最大的线程排队数量,默认值为int的最大值
prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动
threadPriority:线程池中线程优先级,默认值为5,值从1到10
className:线程池实现类,未指定情况下,默认实现类为
org.apache.catalina.core.StandardThreadExecutor。如果想使⽤⾃定义线程池⾸先需要实现org.apache.catalina.Executor接口

1.3.3 Connector

  配置创建连接器实例
port: 监听端口号
protocol: 指定协议,默认用HTTP/1.1,还可以选AJP/1.3。
connectionTimeOut: 获取得连接后的等待超时时间,默认为-1不超时
redirectPort: https使用的端口
URIEncoding: 指定编码字符, tomcat8.x开始默认为UTF-8
executor: 指定使用哪个线程池

1.3.4 Engine

  servlet的模板引擎。它的下面一级子标签有Host, Realm
  它有2个属性
name: 设置一个名称
defaultHost: 设置默认的host

1.3.4.1 Host

  设置一个虚拟主机, 它的一级标签有context, value
  它有4个属性。
name: 设置站点的域名
appBase: 设置站点的目录
unpackWARs: 设置为true,解压war包
autoDeploy:设置为true表示自动部署

1.3.4.1.1 Context

docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于 Host appBase的相对路径。
path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/web_demo。

1.3.4.1.2 Value

  设置日志信息
className: 日志类
directory: 设置目录路径
prefix: 设置日志文件名前缀
suffix: 设置日志文件名后缀
pattern: 设置日志的格式

2. Tomcat认识

  我们往往有一个认识,Tomcat就是一个Catalina的实例,因为Catalina是Tomcat的核心。
  tomcat启动时,会启动一个Catalina实例加载server.xml来创建一个server实例,一个server实例可以有多个service实例。每一个Service实例下可以有多个Connector实例和一个Container实例。一个Container实例有一个Engine实例,一个Engine实例拥有多个Host实例,而一个Host实例可以拥有多个Context实例。一个Context实例拥有多个Wrapper实例。

2.1 Catalina

  负责解析Tomcat的配置文件(server.xml) , 以此来创建服务器Server组件并进文管理。

2.2 Server

  服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式

2.3 Service

  服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container。

2.4 Container

  容器,负责处理用户的servlet请求,并返回对象给web用户的模块

2.5 Engine

  表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host

2.6 Host

  代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,一个虚拟主机下可包含多个Context

2.7 Context

  表示一个Web应用程序, 一个Web应用可包含多个Wrapper

2.8 Wrapper

  表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器

3. 类加载机制

3.1 JVM类加载机制

  JVM 的类加载机制中有一个非常重要的⻆色叫做类加载器(ClassLoader),类加载器有自己的体系,Jvm内置了几种类加载器,包括:引导类加载器、扩展类加载器、系统类加载器,他们之间形成父子关系,通过 Parent 属性来定义这种关系,最终可以形成树形结构。
引导类加载器<-扩展类加载器<-系统类加载器

3.2 双亲委派机制

  当某个class文件被类加载器加载时, 子类加载器会一级一级传递给父类加载器,如果最顶层的父类加载器加载不到,再传递给下一级子类加载,直到某个加载器加载完毕之后才停止, 这种机制被陈伟双亲委派机制。
  这个机制的好吃就是:

  • 避免重复加载,通过委托向上问一下, 加载过了, 就不用在加载了
  • 保证核心的class文件不会被加载, 比如String.Class文件,如果在你的应用中也定义了这么一个类,如果被子类加载了的话,那么父类就不会加载核心库里面的String.class了, 这样就造成了核心的class被修改了。

3.3 Tomcat的加载机制

  tomact没有严格遵守双亲委派机制,它会先用Webapp ClassLoader(每个应用都有一个loader)加载webapp 的/WEB-INF/classes 和 /WEB-INF/lib 下的类。然后后面的加载才遵守双亲委派机制。
  为什么不严格遵守双亲加载机制。比如有这么一个场景,一个tomcat下部署了2个应用,而两个应用下,分别引入了test-1.0.jar,test-2.0.jar包, 如果严格遵守双亲委派机制,那么就会导致tomcat只会加载其中一个jar包,而不会加载另外一个, 因为2个jar包里面的文件是一样的只是版本不同而已,所以说需要打破这种机制,让每个应用都加载对应的jar包。

4. Tomcat对https的支持

  配置一个Connector 监听端口为8443

<!-- 
protocol 使用http协议并且使用NIO的模式
certificateKeystoreFile 配置证书文件位置
certificateKeystorePassword 配置证书密码
type 配置证书加密类型
-->
<Connector 
port="8443" 
protocol="org.apache.coyote.http11.Http11NioProtocol" 
 maxThreads="150" schema="https" secure="true" SSLEnabled="true">
 <SSLHostConfig>
 <Certificate
certificateKeystoreFile="" certificateKeystorePassword="" type="RSA"
/>
 </SSLHostConfig>
</Connector>

5. Tomcat 性能优化策略

5.1 虚拟机运行优化(参数调整)

参数参数作用优化建议
-server启动Server,以服务端模式运行服务端模式建议开启
-Xms最小堆内存建议与-Xmx设置相同
-Xmx最大堆内存建议设置为可用内存的80%
-XX:MetaspaceSize元空间初始值
XX:MaxMetaspaceSize元空间最大内存默认无限

设置参考
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m - XX:MaxMetaspaceSize=512m"

5.2 设置垃圾回收机制

  • 串行收集器
  • 并行收集器
  • 并发收集器
  • CMS收集器
  • G1收集器
    建议使用G1收集器(jdk1.7之后才有)
参数描述
-XX:+UseSerialGC启用串行收集器
-XX:+UseParallelGC启用并行垃圾收集器,配置了该选项,那么 -XX:+UseParallelOldGC默认启用
-XX:+UseParNewGC年轻代采用并行收集器,如果设置了 -XX:+UseConcMarkSweepGC选项,自动启动
-XX:ParallelGCThreads年轻代及⽼年代垃圾回收使⽤的线程数。默认值依赖于JVM使⽤的CPU个 数
XX:+UseConcMarkSweepGC(CMS)对于老年代,启用CMS垃圾收集器。 当并行收集器无法满足应用的延迟需求是,推荐使用CMS或G1收集器。启用该选项后, -XX:+UseParNewGC自动启用。
-XX:+UseG1GC启用G1收集器。 G1是服务器类型的收集器, 对于多核、大内存的机器。它在保持高吞吐量的情况下,高概率满足GC暂停时间的目标。

在bin/catalina.sh的脚本中 , 追加如下配置 :
JAVA_OPTS="-XX:+UseConcMarkSweepGC"

5.3 Tomcat

名称说明
maxConnections线程最大连接数,建议值2000,根据服务器配置来
maxThreads最大线程数
acceptCount最大的排队数,一台tomcat的最大请求数为maxConnections+acceptCount
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值