定义
The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer
Pages, Java Expression Language and Java WebSocket technologies.
Apache Tomcat软件是Java Servlet、Java服务器页面、Java表达式语言和Java WebSocket技术的开源实现。在传统单机系统中部署javaweb项目,可以作为运行的服务器,在该容器内启动项目。
目录文件的含义
1.bin 存放主要的运行命令,包括windows、linux的启动方式。.bat是window下面的,.sh是linux的
- conf: 存放tomcat的一些配置文件相关
- lib: 存放依赖的包
- logs: 存放日志文件,项目启动是可以指定打印到该目录下具体的日志。
- temp: 临时文件
- webapps: 存放应用程序
- work: 编译后的文件,比如运行java程序。
我的理解: 这是使用java语言编写的,内部基于Servlet技术,需要满足该规范,依赖该api,集成了Servlet容器。在java语言中,关于网络编程的中的Socket大家都知道,tomcat其实就是一个容器,里面包含了我们接收客户端的请求以及响应必要的一些处理,还包括对请求的一些进行拦截,过滤,监听等等。正常我们要写接收来自其他客户端的请求的话,需要开启ServerSocket,去监听端口,接收客户端的请求,同时还要考虑使用哪种I/O方式去处理这些读写请求,我们返回的客户端的数据。。。。这些都是tomcat帮我们封装好了。
主要的一些重要组件
- Server
在Tomcat世界中,服务器代表整个容器。Tomcat提供了服务器接口的默认实现,用户很少定制它。
- Service
服务是位于服务器内部的中间组件,它将一个或多个连接器与一个引擎绑定在一起。服务元素很少由用户自定义,
因为默认实现是简单而充分的:服务接口。
- Engine
引擎代表特定服务的请求处理管道。
由于服务可能具有多个连接器,因此引擎会接收并处理来自这些连接器的所有请求,并将响应传递回适当的连接
器以传输到客户端。
- Host
主机是一个网络名称(例如www.yourcompany.com)与Tomcat服务器的关联。一个引擎可以包含多个主机,并且主机元素还支持网络别名,如yourcompany.com和abc.yourcompany.com。用户很少创建自定义主机,因为标准主机实现提供了重要的附加功能。
5.Connector
连接器处理与客户机的通信。Tomcat有多个可用的连接器。其中包括用于大多数HTTP流量的HTTP连接器,特别是在将Tomcat作为独立服务器运行时;以及实现将Tomcat连接到Apache HTTPD服务器等web服务器时使用的AJP协议的AJP连接器。创建自定义连接器是一项重要的工作。
- Context
上下文表示web应用程序。主机可以包含多个上下文,每个上下文具有唯一的路径。可以通过实现上下文接口来创建自定义上下文,但这种情况很少发生,因为StandardContext提供了重要的附加功能。
整体架构图:官网也有:
启动的流程:
BootStrap ->main()->根据脚本命令->startd
daemon.load() 加载
daemon.start() 启动
The Engine interface may be implemented to supply custom Engines, though this is uncommon.
关于优化的一些思路
首先需要清楚的是: tomcat 是使用java语言编写的,封装servlet和jsp相关的容器,是需要运行在虚拟机的。要使用必须基于jdk。还有服务器的CPU、内存、硬盘等的对其性能同样有绝对的影响。还有可以对其使用的网络通信方式等进行优化。
1. 从组件以及配置的方向入手
我们可以先从提供的几个组件的思路去考虑优化:
几个组件相关的,可以阅读官方文档,附带链接:https://tomcat.apache.org/tomcat-8.0-doc/
我们可以去看一下几个组件的介绍,如下:
Server
官网描述:Server interface which is rarely customized by users.
Service
官网描述:The Service element is rarely customized by users. service很少由用户去定制的。
Connector
官网描述:Creating a customized connector is a significant effort. 创建自定义连接器是一项重要的工作,所以这块我们可以去尝试优化
Engine
官网描述:The Engine interface may be implemented to supply custom Engines, though this is uncommon.可以实现引擎接口来提供自定义引擎,但这并不常见,可以忽略
Host
官网描述:Users rarely create custom Hosts because the StandardHost implementation provides significantadditional functionality. :用户很少创建自定义主机,因为标准主机实现提供了重要的附加功能,所以也可以忽略
Context
官网描述:The Context interface may be implemented to create custom Contexts, but this is rarely the casebecause the StandardContext provides significant additional functionality.可以通过实现上下文接口来创建自定义上下文,但这种情况很少发生,因为StandardContext提供了重要的附加功能.
以上均来自官方文档的建议,,大家可以慢慢的学会从看官方文档开始去学习一个框架,技术,能更好的去使用和理解其东西的使用,毕竟官方的就是最权威的了。慢慢学会用英语哈,我也在慢慢学习。
言归正传,我们继续讲怎么优化。一般来讲以上组件都是通过修改tomcat配置文件去觉得怎么设置属性去优化的。我们可以打开配置文件来分析一个个分别配置的是什么,以下是我整理的一些可以优化的配置:(配置文件的位置就不说了,上面已经说了。。。)
Listener
Listener(即监听器)定义的组件,可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止。根据以下的一些内容我们可以选择一些监听事件属性,比如。
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
Global Resources(全局资源)
GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcatusers.xml实现的。
<GlobalNamingResources>
<Resource name="UserDatabase"auth="Container"type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
Valve
功能类似于过滤器Filter
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" />
Realm
Realm,可以把它理解成“域”;Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用。在本例中,Realm的配置使用name为UserDatabase的资源实现。而该资源在Server元素中使用GlobalNamingResources配置.
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
以上几个是我们可以去控制,是对tomcat的server组件也就是容器的一些的配置。。
下面才是我真正要讲的的,在web.xml文件中,
可以优化的点来了
这个defaultServlet是一个默认静态资源的文件的一个定位,就是我们刚进去的那个tomcat主页的静态资源,可以删除。
从600多行开始,就是一些压缩文件的格式,我们可以删除部分。
jspServlet相关的,主要处理jsp相关的文件,现在基本都是使用前后端分离的技术,很少见jsp了,可以注释掉。
欢迎页相关的,如果有自己的默认欢迎页,可以删除,避免引入。
session-config
页面与session有关的也是使用这个配置时间。
全局的web.xml文件有些标签用不到的,可以删除掉。
2.从使用的协议入手或者说连接器(Connector)的优化
我们知道tomcat其实也是使用socket来接收网络读写消息的,所以同样是涉及到我们的几个I/O相关的方式,已知的java提供的有几种,BIO、NIO、AIO,tomcat还内置了一种ARP协议的。
我们可以根据我们项目使用的规模,或者说请求的吞吐量等,去控制使用哪种协议,我自己本地通过jmeter去测试了tomcat在跑一个项目,对外暴露了一个接口,调用一个线程组,分别测试了以下的几种数据:
以下数据仅供参考哈
tomcat8 默认是NIO协议
默认
请求数量 响应时间(ms) 吞吐量
10 126 71.4
100 186 211
500 952 195
1000 602 45.2
5000 12331 100
BIO协议(tomcat7)
请求数量 响应时间 吞吐量
10 88 77.5
100 116 265
500 1344 129
1000 2073 103
5000 很大很大。。。
通过以上数据我们可以分析出一些东西:
- 使用NIO/BIO的方式,在500以下其实相差还不大,当然说的是同等硬件条件下,你们要测试才能得出来,结果跟我不一定一样。
2.当请求数量达到更大时,使用NIO的方式确实可以去控制更好的吞吐量和响应时间的。比如1000开始。
最好的还是使用AIO的方式。
优化的方式:就是设置在我们前面说的Connector的里面设置他使用的协议的方式:
修改protocol,可以看官方文档哈:
官方文档也可以找到:
继续看,我们可以设置每个连接器的最大线程数量,连接超时时间,这个需要你自己去调试你项目了。具体按照我上面的方式,使用jmeter工具。
-
service中的executor属性
(1)acceptCount:达到最大连接数之后,等待队列中还能放多少连接,超过即拒绝,配置太大也没有意义
(2)maxConnections
达到这个值之后,将继续接受连接,但是不处理,能继续接受多少根据acceptCount的值
BIO:maxThreads
NIO/NIO2:10000 ——— AbstractEndpoint.maxConnections
(3)maxThreads:最大工作线程数,也就是用来处理request请求的,默认是200,如果自己配了executor,并且和Connector有关联了,则之前默认的200就会被忽略,取决于CPU的配置。
(4)minSpareThreads
最小空闲线程数 删掉A JP的Connector
Host标签
autoDeploy :Tomcat运行时,要用一个线程拿出来进行检查,生产环境之下一定要改成false
Context标签
reloadable:false
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web应用的运行阶段将reloadable设为false。
最后一个优化的方向----------JVM优化
还记得我前面说的,tomcat是使用java语言编写的,所以需要运行在java环境下,所以我们可以根据jvm优化的一些方向去优化我们的tomcat服务器运行时的性能和效率
现在有个问题,修改JVM参数在哪里修改会对tomcat生效?还是在bin文件夹之下,有一个catalina.sh,找到JAVA_OPTS即可,当然不建议对此文件进行直接修改,一般是在外面新建一个文件,然后引入进来。
关于JVM相关的优化,我就不一一系数了,可以看我的jvm专题。https://www.jianshu.com/c/7fda371713a5
提供几个方向,,内存的大小控制,垃圾回收算法,一些运行时的相关参数调优。。。。
待续。。。。。。。。。。还以为今天能完成的。。。哎,又过了。