1 架构
1.1 Http工作原理
1.2 整体架构
Tomcat要实现两个核心功能:
- 处理Socket连接,负责网络字节流与Request和Response对象的转化。
- 加载和管理Servlet,以及具体处理Request请求。
因此Tomcat设计了两个核心组件:连接器(Connecter)和容器(Container)来分别做这两件事。连接器负责对外交流,容器负责内部处理。
1.3 连接器 - Coyote
Coyote是Tomcat连接器框架的名称,是Tomcat提供的供客户端访问的外部接口。Coyote封装了底层的网络通信(Socket请求及相应处理),为Catalina容器提供了统一的接口,使Catalina容器与具体的请求协议与IO操作方式完全解耦。Coyote只负责具体协议和IO的相关操作,与Servlet规范实现没有直接关系。
在 8.0之前,Tomcat默认采用的I/O方式为BIO,之后改为NIO。
通过适配器模式,将Request请求转换为ServletRequest。
1.4 容器 - Cataline(Servlet容器)
负责解析Tomcat的配置文件,以此来创建服务器Server组件,并根据命令来对其进行管理。
1.5 Tomcat的启动流程
标准化启动流程,统一按照生命周期管理接口Lifecycle的定义启动。首先调用init()方法进行组件的逐级初始化操作,然后再调用start()方法进行启动。
2 Tomcat 安全
2.1 配置安全
- 删除webapps目录下的所有文件,禁用tomcat管理界面
- 注释或者删除tomcat-users.xml文件内的所有用户权限
- 更改关闭tomcat指令或禁用
tomcat的server.xml中定义了可以直接关闭tomcat实例的管理端口(默认8005),远程连接该端口后输入SHUTDOWN后即可关闭tomcat。
方案一:
#更改端口号和指令,改成不容易猜到的
<Server port="8234" shutdown="shutnodown">
方案二:
#禁用8005端口
<Server port="-1" shutdown="shutnodown">
2.2 应用安全
主要包含两个部分:认证(登录/单点登录)和授权(功能权限、数据权限)两个部分。可以自己做一套适用于自己业务系统的权限模块,也可以使用功能完善的安全框架,如:SpringSecurity、Shiro等。
2.3 传输安全
2.3.1 https介绍
使用https超文本安全传输协议。在http的基础上加入SSL/TLS来进行数据加密,保护交换数据不被泄露、窃取。
SSL和TLS是用于网络通信安全的加密协议,允许客户端和服务器之间通过安全链接通信。SSL协议的3个特性:
- 保密:通过SSL链接传输的数据时加密的。
- 鉴别:通过双方的身份鉴别,通常是可选的,单至少有一方需要验证。
- 完整性:传输数据的完整性检查。
从性能考虑,加解密是一项昂贵的处理,因为尽量不要将整个Web应用采用SSL链接,实际部署中,选择有必要进行安全加密的页面采用SSL通信。
http和https区别主要有以下4点:
- https协议需要到证书颁发机构CA申请SSL证书,然后与域名进行绑定,http不用申请证书。
- http是超文本传输协议,属于应用层信息传输,https则是具有SSL加密安全性传输协议,对数据的传输进行加密。
- http和https使用的是完全不同的连接方式,端口也不同。
- http连接简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
https协议优势:
- 提高网站排名,有利于SEO。
- 隐私信息加密,防止流量劫持。
- 浏览器受信任。
2.3.2
1)向相关机构申请证书
2)自己生成证书
- 生成密钥库文件
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
- 将密钥库文件
tomcat.keystore
复制到tomcat/conf
目录下。 - 配置
tomcat/conf/server.xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" schema="https" secure="true" SSLEnabled="true">
<SSLHostConfig certificateVerification="false">
<Certificate certificateKeystoreFile="tomcat.keystore" certificateKeystorePassword="jiongbaibai"
type="RSA" />
</SSLHostConfig>
</Connector>
3 Tomcat性能调优
3.1 性能测试
可以使用ApacheBench,ApacheJMeter等工具进行性能测试。
3.2 JVM参数调优
1.配置合适的JVM内存参数,调整GC策略。
参数 | 参数作用 | 优化建议 |
---|---|---|
-server | 启动Server,以服务端模式运行 | 服务端模式建议开启 |
-Xms | 最小堆内存 | 建议与-Xmx设置相同 |
-Xmx | 最大堆内存 | 建议设置成可用内存的80% |
-XX:MetaspaceSize | 元空间初始值 | |
-XX:MaxMetaspaceSize | 元空间最大内存 | 默认无限 |
-XX:MaxNewSize | 新生代最大内存 | 默认16M |
-XX:NewRatio | 年轻代和老年代大小比值,取值为整数,默认为2 | 不建议修改 |
-XX:SurvivorRatio | Eden区与Survivor区大小的比值,取值为证书,默认为8 | 不建议修改 |
修改catalina.sh
,添加以下语句,值根据服务器实际情况设置
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
- GC策略
JVM垃圾回收性能有以下两个主要的指标:
- 吞吐量
工作时间(排除GC时间)占总时间的百分比,工作时间并不仅是程序运行的时间,还包含内存分配时间 - 暂停时间
测试时间段内,由垃圾回收导致的应用程序停止相应次数/时间。
根据业务情况选择合适的垃圾收集器。
3.3 Tomcat配置调优
调整server.xml
中关于连接器的配置可以提高Tomcat的性能。
参数 | 说明 |
---|---|
maxConnections | 最大连接数,当到达该值后,服务器接收但不会处理更多的请求,额外的请求将会阻塞直到连接数低于maxConnections。可通过ulimit -a 查看服务器限制。对于CPU要求更高(计算型)时,建议不要配置过大;对于CPU要求不是特别高时,建议配置在2000左右。 |
maxThreads | 最大线程数,需要根据服务器的硬件情况,进行一个合理的设置 |
acceptCount | 最大排队等待数,当服务器接收的请求数量达到maxConntections,此时Tomcat会将后面的请求,存放在任务队列中进行排序,acceptCount指的就是任务队列中排队等待的请求数。一台Tomcat的最大的请求处理数量,是maxConnections+acceptCount。 |