Java-52 深入浅出 Tomcat SSL工作原理 性能优化 参数配置 JVM优化

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

目前2025年06月13日更新到:
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年06月11日更新到:
Java-44 深入浅出 Nginx - 底层进程机制 Master Worker 机制原理 常用指令

MyBatis 已完结,Spring 已完结,深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!

目前2025年06月13日更新到:
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

Tomcat 与 HTTPS 支持

HTTPS 是用来加强数据传输安全的,HTTP超文本传输协议,明文传输是非常不安全的,HTTPS在传输的过程中会对传输的数据进行加密。

SSL协议

基本介绍

TLS(Stransport Layer Security)协议

HTTP协议是互联网应用最广泛的数据传输协议之一,但HTTP本身不具备加密功能,传输的数据为明文,存在被窃听、篡改、伪造的风险。

HTTPS协议则通过TLS(旧称SSL)加密通道,提供:

  • 数据机密性(Confidentiality):确保数据在传输过程中不会被窃听。
  • 数据完整性(Integrity):确保传输过程中数据不会被篡改或破坏。
  • 身份认证(Authentication):客户端和服务端之间可进行身份验证,确认通信双方的真实性。

工作原理

HTTPS在HTTP基础上,引入了一个TLS/SSL加密层。通信步骤如下:

  • 客户端请求连接:客户端向服务器发送HTTPS请求。
  • 服务器响应并发送证书:服务器返回一个包含其公钥的数字证书。
  • 客户端验证证书:客户端校验数字证书是否合法。验证证书上的域名是否与当前访问域名匹配。
  • 协商加密方式并生成会话密钥:客户端生成随机的对称密钥(Session Key),使用服务器证书中的公钥加密后传给服务器。服务器用自己的私钥解密获得会话密钥。
  • 建立安全连接并传输数据:客户端和服务器端使用会话密钥进行数据加密和解密,实现安全通信。

术基础

非对称加密(公钥加密)

  • 使用一对密钥,分别是公开密钥(Public Key)和私密密钥(Private Key)。
  • 公钥用于加密数据,私钥用于解密数据,私钥永远只存储在服务器端。

常用算法:

  • RSA(应用广泛,但速度较慢)
  • ECC(椭圆曲线算法,效率更高)

对称加密

  • HTTPS传输数据的主体使用对称加密技术,即客户端和服务器端拥有相同的密钥用于加密和解密数据。

常用算法:

  • AES(高级加密标准)
  • ChaCha20(性能好,安全性高)

数字签名与证书

数字证书一般由第三方权威机构(Certificate Authority,简称CA)颁发,包含以下内容:

  • 网站拥有者身份信息
  • 公钥
  • 签发机构的信息
  • 签名和有效期

客户端通过CA根证书确认服务器证书的真实性和有效性,从而信任通信的另一方。

TLS握手过程

TLS握手过程是建立HTTPS通信的关键步骤,其具体流程:

  • 客户端发起连接,提出支持的TLS版本与密码套件。
  • 服务器回应自己的证书、公钥、选定的密码套件。
  • 客户端验证证书有效性后,生成随机密钥,用服务器公钥加密发送给服务器。
  • 服务器用私钥解密出会话密钥,完成握手。

优缺点

优点:

  • 数据传输安全,防止中间人攻击(MITM)。
  • 保护用户隐私与敏感数据。
  • 提升用户对网站的信任感。
  • 符合现代浏览器与搜索引擎的要求。

缺点:

  • 部署成本较高(需要申请和更新证书)。
  • TLS握手阶段会增加网络延迟和服务器资源开销。
  • 需要额外配置和维护证书有效性。

应用场景

  • 电子商务(支付类网站)
  • 银行金融业务系统
  • 电子邮件传输(如Gmail)
  • 社交网络、即时通讯服务
  • 各种Web应用、API接口服务

HTTPS与HTTP的主要区别

● HTTPS协议使用时需要到电子商务认证授权机构(CA)申请SSL证书

● HTTP默认端口是8080端口,HTTPS默认使用8443端口

● HTTPS则是具有SSL加密的安全性传输协议,对数据传输进行加密,效果上相当于HTTP的升级版本。

● HTTP的连接是无状态的、不安全的,HTTPS是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

HTTPS工作原理

Tomcat HTTPS

生成证书

首先我们需要生成免密的秘钥证书

shell 复制代码
keytool -genkey -alias wzkicu -keyalg RSA -keystore wzkicu.keystore

对应的截图如下所示:

生成结束后,在当前目录下有了keystore文件:

配置XML

shell 复制代码
vim /opt/servers/apache-tomcat-9.0.98/conf/server.xml

当中的内容如下所示:

我们需要修改,Connect的部分:

xml 复制代码
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
 maxThreads="150" schema="https" secure="true" SSLEnabled="true">
 <SSLHostConfig>
 <Certificate
certificateKeystoreFile="/opt/wzk/wzkicu.keystore" certificateKeystorePassword="123123" type="RSA"
/>
 </SSLHostConfig>
</Connector>

修改之后对应的内容如下所示:

访问网站

shell 复制代码
https://server:8443

执行结果如下图所示(由于证书是自签的,所以会提示不安全)

Tomcat 性能优化

Tomcat的性能优化本质上是围绕这些核心功能进行合理的参数调优,以提高吞吐量、降低延迟,最大程度地利用系统资源。

基本介绍

系统性能的衡量指标,主要是响应时间和吞吐量。

● 响应时间:执行某个操作的耗时

● 吞吐量:系统在给定时间内能够支持的事务数量,单位TPS(Transaction PerSecond 的缩写,也就是事务数/秒,一个事务是指一个客户机向服务发送请求然后服务器做出反映的过程)

Tomcat优化主要从以下方面进行:

● JVM的虚拟机优化(优化内存模型)

● Tomcat自身配置的优化(比如是否使用了共享线程池?IO模型?)

Tomcat优化涉及的关键区域包括:

  • 连接器(Connector)优化
  • 线程池优化
  • JVM内存优化(堆、栈)
  • 垃圾回收(GC)优化
  • 缓存优化(静态资源缓存、类加载器)

参数调整

Java虚拟机的运行优化主要是内存分配和垃圾回收策略的优化:

● 内存直接影响服务的运行效率和吞吐量

● 垃圾回收机制会不同程度的导致程序运行中断(垃圾回收策略不同,垃圾回收次数和回收效率都是不同的)

连接器(Connector)

常用的示例:

xml 复制代码
<Connector port="8080"
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           acceptCount="100"
           maxConnections="10000"
           maxThreads="200"
           minSpareThreads="10"
           enableLookups="false"
           compression="on"
           compressibleMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>
  • maxThreads:最大请求处理线程数,200~500,取决于系统资源
  • minSpareThreads:最小空闲线程数(始终准备好的线程数),10~50
  • acceptCount:等待队列中允许的最大连接数,100~300
  • maxConnections:同时处理的最大连接数(包含等待连接),根据系统与并发需求设定
  • connectionTimeout:连接超时(毫秒),20000(20秒)左右
  • enableLookups:DNS反查开关,false(可提升速度)
  • compression:是否启用GZIP压缩,on
  • compressibleMimeType:允许压缩的内容类型,文本类如text/html、text/css等

APR连接器优化

使用APR连接器(需安装native库)可大幅提升性能,尤其对于高并发和静态资源较多的场景。

如果使用APR连接器(如protocol="org.apache.coyote.http11.Http11AprProtocol"):

xml 复制代码
<Connector port="8080"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           connectionTimeout="20000"
           maxThreads="500"
           acceptCount="500"
           maxConnections="20000"
           enableLookups="false"
           keepAliveTimeout="15000"/>

Java虚拟机内存相关的参数

在Tomcat启动脚本中优化JVM:

shell 复制代码
JAVA_OPTS="-server -Xms2G -Xmx2G -Xss512k \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-Djava.awt.headless=true"

● server:启动Server,以服务端模式运行(服务端模式建议开启)

● Xms:最小堆内存(建议与Xmx设置相同)

● Xmx:最大堆内存(建议设置为可用内存80%)

● XX:MetaspaceSize:元空间初始值

● XX:MaxMetaspaceSize:元空间最大内存

● XX:NewRatio 年轻代和老年代大小比值,取值为整数,默认为2

● XX:SurvivorRatio Eden区与Survivor区大小的比值,取值为整数,默认为8

内存设置(Xms和Xmx)应根据机器物理内存与应用负载确定,一般两者设定相同以减少GC频繁调整。选择合适的GC算法可有效减少垃圾回收暂停,提升应用响应性能。

Web应用参数优化

主要是 web.xml 的配置

xml 复制代码
<servlet>
  <servlet-name>default</servlet-name>
  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  <init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param>
    <param-name>readOnly</param-name>
    <param-value>true</param-value>
  </init-param>
</servlet>
  • listings:是否允许显示目录列表,false
  • readOnly:是否禁止Tomcat锁定静态文件,true

禁用listings可防止目录暴露,提高安全性;readOnly开启后Tomcat不会锁定静态文件,从而提升文件访问性能。

其他优化

  • 连接池(如HikariCP):合理配置数据源连接池以减少连接频繁创建销毁的开销;
  • 负载均衡:通过Nginx或Apache httpd等反向代理实现负载均衡和静态资源处理;
  • 缓存技术:采用Redis、Memcached等缓存热点数据;
  • 操作系统层面优化:如打开系统TCP快速回收、减少TIME_WAIT、优化文件句柄数。
相关推荐
间彧几秒前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧5 分钟前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
Deamon Tree10 分钟前
HBase 核心架构和增删改查
java·hbase
间彧10 分钟前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
卡卡酷卡BUG30 分钟前
Java 后端面试干货:四大核心模块高频考点深度解析
java·开发语言·面试
Yolo566Q33 分钟前
OpenLCA生命周期评估模型构建与分析
java·开发语言·人工智能
brzhang1 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
DeBuggggggg1 小时前
linux 安装Python3.9 且支持SSL
linux·运维·ssl
lang201509281 小时前
Spring Boot日志配置完全指南
java·spring boot·单元测试
在坚持一下我可没意见1 小时前
HTTP 协议基本格式与 Fiddler 抓包工具实战指南
java·开发语言·网络协议·tcp/ip·http·java-ee·fiddler