Tomcat高级特性及性能调优
Tomcat对Https的支持
HTTPS简介
Https,是以安全为目标的Http通道,在Http的基础上通过传输加密和身份认证保证了传输的安全性。HTTPS在HTTP的基础上加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS和HTTP的主要区别
- HTTPS协议使用时需要到电子商务认证授权机构申请SSL证书
- HTTP默认是8080端口,HTTPS默认8443端口
- HTTPS是具有SSL加密的安全性传输协议,对数据的传输加密
- HTTP的连接是无状态的,不安全的;HTTPS协议是SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全

Tomcat对HTTPS的支持
- 使⽤ JDK 中的 keytool⼯具⽣成免费的秘钥库⽂件(证书)
keytool -genkey -alias lagou -keyalg RSA -keystore lagou.keystore

- 配置conf/server.xml
certificateKeystoreFile 就是上一步生成的文件的路径,certificateKeystorePassword是上一步输入的密钥
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" schema="https" secure="true" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="d:/apache-tomcat-8.5.32/lagou.keystore"
type="RSA" certificateKeystorePassword="123456"/>
</SSLHostConfig>
</Connector>
- 访问https://localhost:8443/测试

Tomcat类加载机制
我们先来回顾一下Java的双亲委派机制

如一个Hello.class文件,不考虑自定义加载器,首先会在AppClassLoader中检查是否已经加载过,如果加载过就不加载了。如果没有加载过,就会拿到父加载器,那么父加载器(ExtClassLoader)就会检查是否加载过,如果没有,就再往上,让BootStrapClassLoader检查是否加载过。
如果还是没有,因为他的上面已经没有父加载器了,那么他就开始自己加载,如果能加载,他就自己加载。不能加载,就下沉到子加载器去加载,一直到最底层,如果没有类加载器能加载就抛出异常ClassNotFoundException。
而Tomcat为了实现同一个tomcat中,webapps下部署了两个应用,要使这两个应用隔离,就算两个应用里有相同全路径的两个类,也要分别都被加载,且互不能访问。这样它就违背了双亲委派机制。
Tomcat类加载器图:

- BootstrapClassLoader和ExtClassLoader的作用不变
- AppClassLoader正常情况加载的是CLASSPATH下的类,但是Tomcat的启动脚本并未使用该变量,而是加载tomcat启动的类,比如bootstrap.jar,通常在catalina.sh中指定,位于CATALINA_HOME/bin下面
- Common类加载器加载Tomcat的一些通用的类,位于CATALINA_HOME/lib下,如servlet-api.jar
- Catalina ClassLoader用于加载服务器内部可见类,这些类应用程序不能访问
- Shard ClassLoader用于加载应用程序共享类
- WebAppClassLoader,每个应用程序都有一个独一无二的WebApp ClassLoader,用于加载应用程序/WEB-INF/classes和WEB-INF/lib下的类
tomcat8.5默认改变了双亲委派机制
- 首先从Bootstrap ClassLoader加载指定的类
- 如果未加载到,从/WEB-INF/classes加载
- 如果未加载到,从/WEB-INF/lib/*.jar 加载
- 如果未加载到,则依次从AppClassLoader、Common、Shared加载
Tomcat性能优化
Tomcat的优化主要从两个方面:
- JVM虚拟机优化
- Tomcat自身的配置优化
对于JVM的虚拟机优化,这里不做过多赘述,主要关注Tomcat配置的优化
Tomcat配置优化
- 调整tomcat线程池

- 调整tomcat连接器设置
| 参数 | 说明 |
|---|---|
| maxConnections | 最⼤连接数,当到达该值后,服务器接收但不会处理更多的请求, 额外的请求将会阻塞.可通过ulimit -a 查看服务器限制。对于CPU要求更⾼(计算密集型)时,建议不要配置过⼤ ; 对于CPU要求不是特别⾼时,建议配置在2000左右(受服务器性能影响)。 当然这个需要服务器硬件的⽀持 |
| maxThreads | 最大线程数 |
| acceptCount | 最大排队等待数,当服务器接收的请求数量到达maxConnections,此时tomcat会将后面的请求放入队列中等待,acceptCount指的就是队列的大小。 |
- 禁用AJP连接器

- 调整IO模式
Tomcat8之前的版本默认是BIO,Tomcat8之后的版本默认使用的是NIO模式

- 动静分离
可以使用Nginx + Tomcat 相结合的部署方案,Nginx负责静态资源访问,Tomcat负责Jsp等动态资源访问。(因为Tomcat不擅长处理静态资源)
Tomcat高级特性及性能调优的更多相关文章
- Redis 宝典 | 基础、高级特性与性能调优
转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者:kelgon ...
- Redis基础用法、高级特性与性能调优以及缓存穿透等分析
一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...
- Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Tomcat和JVM的性能调优总结
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
- 《Tomcat和JVM的性能调优你真的学会了吗?》总结篇
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
- 一份 Tomcat 和 JVM 的性能调优经验总结!拿走不谢
Tomcat性能调优 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建 ...
- 性能优化 | Tomcat和JVM的性能调优总结
Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...
- Tomcat修改service.xml性能调优 增加最大并发连接数
详细配置: <Connector executor="tomcatThreadPool" port="80" protocol ...
随机推荐
- NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)
由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...
- Linux系统编程之命名管道与共享内存
在上一篇博客中,我们已经熟悉并使用了匿名管道,这篇博客我们将讲述进程间通信另外两种常见方式--命名管道与共享内存. 1.命名管道 管道是使用文件的方式,进行进程之间的通信.因此对于管道的操作,实际上还 ...
- c语言转义字符如下
#define MQTT_EVENT_REPORT_BOX_STATUS_FORMAT "{"\ ...
- nrf 51802 和 nrf51822 的区别于联系
51802QFAA与51822QFAA在FLASH 跟RAM的容量没有差别:区别在于:a,接收灵敏度 51802是-91dBm;51822是-93dBm,这个差异导致接收距离有差异:b,Tx Powe ...
- acclaim
欲学acclaim,先学claim.即使学会claim,未必记住acclaim. [LDOCE] claim的词源是cry out, shoutverb:1. state that sth is tr ...
- oracle中的控制语句
一.条件语句1.流程控制-if else(1)ifif 判断条件 then ...end if;(2)if-elseif 判断条件 then ...else ...end ...
- RAC(Reactive Cocoa)常见的类
导入ReactiveCocoa框架 在终端,进入Reactive Cocoa文件下 创建podfile 打开该文件 并配置 use_frameworks! pod 'ReactiveCocoa', ' ...
- 【Linux】【Commands】trouble shooting命令详解目录
1. 简介 1.1. 最近看到阿里的运维招聘需要熟练掌握以下的命令,我就针对这几个命令做一下总结,有些命令我觉得别人总结的挺好了,我就不赘述了 1.2. 还有一些其他我觉得用得到的命令的用法会在第三部 ...
- 【编程思想】【设计模式】【行为模式Behavioral】Specification
Python版 https://github.com/faif/python-patterns/blob/master/behavioral/specification.py #!/usr/bin/e ...
- 通过spring-data-redis操作Redis
一.操作String类型数据 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/ ...