继Tomcat配置详解(Tomcat配置server.xml详解)Tomcat配置详解(Tomcat配置server.xml详解)_tomcat xml配置https://blog.csdn.net/imwucx/article/details/132166738文章之后,深入的学习tomcat相关知识,对Tomcat的组件进进补充和记录。
目录
一、Tomcat整体架构图
二、Tomcat整体树形结构
三、组件说明
四、配置文件
五、源码结构
5.1 java 目录的子目录
5.2 jakarta
5.3 org.apache
一、Tomcat整体架构图
二、Tomcat整体树形结构
如上图所示,为何是这样的组合?
- Tomcat需要一个对象来代表整个Servlet容器,引入了Server组件。
- Tomcat需要一个组件来包含一个或者多个连接器,引入了Service组件。
- Tomcat需要一个用于接收客户端并处理协议相关的功能,引入了Connector连接器。
- Tomcat需要一个用于实现HTTP中指定服务主机的功能,引入了Host组件。
- Tomcat需要一个用于表示Web应用的功能,引入了Context。
- Tomcat需要一个用于表示Servlet的功能,引入了Wrapper。
三、组件说明
- Server组件: 代表整个Tomcat Servlet容器,一个Server可以包含一个或者多个Service,包括一组全局的命名资源,即naming resource。
- Listener组件:也称LifecycleListener,用于监听组件在整个生命周期过程中产生的事件,从而完成响应相应的动作。
- Global Naming Resources:包含公用的全局命名资源。
- Service组件:用于管理连接器和引擎,其中包含了一个或者多个连接器和一个引擎组件。
- Connector组件:包含协议处理器,用于实现Tomcat中定义的Coyote连接器,HTTP协议也是在连接器这一层实现的。
- 线程池:Connector中包含的线程池为Tomcat的业务线程池,通过这个线程池可以将耗时的操作放到线程池中执行,连接器只需要处理连接、读写数据即可,极大地增强了Tomcat的性能。
- Engine组件:是一个容器,表示整个Tomcat的Servlet容器的引擎,其中包含一组Host组件。可以从上图中看到它是包含的容器的最顶层容器。
- Value组件:一般为多个,它们之间形成一个链表一起处理组件内部的动作。通常将一系列的Value组件放进Pipeline(流水线)组件中,让它们组成一条Value流水线,处理当前传入包含组件的请求。
- Cluster组件:表示当前多个Tomcat服务器组成了一个集群,集群之间可以互相传输共享信息。如,可以使用Cluster组件实现Session共享,不过这种方式效率较低,一般不建议使用这种方式。通常使用Redis共享会话信息。
- Realm组件:表示一个只读的安全域门面,通常使用Realm验证不同的用户,并且授予这些用户相应的访问规则。Realm组件通常和容器等级的组件联合使用。
- Host组件:表示一个包含在Engine组件听虚拟主机容器。内部包含一个或者多个Context容器,可以通过Host组件隔离不同的Context,将它们放到不同的虚拟主机中。
- Context组件:表示一个Servlet上下文,通常包含在Host容器中,顶层容器必须是引擎组件。Context组件代表Web应用程序。
- Filter组件:属于J2EE定义表示一个请求的过滤器,也称为拦截器链,当请求在访问到最终的Servlet组件前,必须经过所有的拦截器链才能访问。
- Manager组件:用于管理与Context组件绑定的Session池,不同的Manager组件可以自定义添加自己的处理Pipeline(由Value组件组成)将Session进行持久化。
- Resource Like组件:代表了一个Web应用程序的资源链表,即在配置文件中定义的Resource标签的信息。这些资源链访问Global Naming Resources中的资源。
- Resource组件:代表一个命名资源对象。
- Loader组件:代表了一个Java类加载器,用于在容器中加载必要的类文件,通常用于热部署时应用上下文类文件。
四、配置文件
// 配置服务器,关闭服务器的端口号为8005
<Server port="8005" shutdown="SHUTDOWN">
// 配置版本日志监听器
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
// 配置Apr本地库加载监听器
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
// 配置Jre内存泄漏监听器
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
// 配置全局资源JNDI与JMX监听器
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
// 配置预防ThreadLocal发生内存泄漏监听器
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResource >
// 配置用户数据库资源,默认为内存数据库,用于保存访问Tomcat的管理页的用户密码
<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"/>
</GlobalNamingResource>
// 定义服务对象
<Service name="Catalina">
// 定义HTTP连接器,指定端口,协议,连接超时时间和重定向端口
<Connector port="8080" protocol="HTTP/1.1" connectionTimout="20000" redirectPort="8443"/>
// 定义引擎对象,并指定默认的虚拟主机为localhost
<Engine name="Catalina" defaultHOst="localhost">
// 定义锁定对象的Realm,当用户尝试登录次数太多后,将会锁定用户
<Realm className="org.apache.catalina.realm.LockOutRealm">
// 定义组合在LockOutRealm内部的,使用JNDI定义的用户数据库对用户进行较难的Realm对象
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDataBase" />
</Realm>
// 宝义虚拟主机对象,并指定名称,Web上下文目录,是否自动解压war包,是否自动部署
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.values.AccessLogValue" directory="logs" prefix="local_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />/>
</Host>
</Engine>
</Service>
</Server>
- Server: 服务器对象
- Service: 服务对象
- Global Naming Resources: 全局命名资源
- Connector: HTTP连接器
- Engine: 引擎对象
- Realm: 用户身份信息校验
- Host: 虚拟主机
- Valve: 阀门
五、源码结构
1. /bin目录
存放启动、关闭Tomcat和其它脚本文件。.sh结尾的文件为UNIX系统使用,.bat结尾的文件为Windows系统使用。
2. /conf目录
存放Tomcat配置文件和相关DTD定义,其中最重要的文件是server.xml,它是tomcat容器和组件的主要配置文件。
3. /logs目录
存放Tomcat运行时产生的日志文件,是默认的日志文件日录。
4. /webapps目录
存放Web应用,Tomcat会自带几个默认项目存放在该目录中。
5. /res目录
存放Tomcat的资源文件,如icon图标,欢迎页HTML文件。
6. /modules目录
存放Tomcat依赖的模块组件源码。
7. /java目录
存放Tomcat的主要源码文件,即主要研究对象。
5.1 java 目录的子目录
详细介绍如下:
5.2 jakarta
该目录存放jakarta扩展的接口表述,即J2EE的接口文件。(如上图)
旧版的包名不是java.jakarta,为什么取包名为java.jakarta?原因是Oracle公司收购sun公司之后,Oracle将Java EE 移交给了 Eclipse 基金会,但不允许使用Java这个前缀,Eclipse基金会强烈争取不改名,没谈拢,最后将Java EE改名为Jakarta EE。
5.3 org.apache
用于存放Tomcat的源代码,其中每个目录的存放内容如下。(如上图)
- catalina:该目录存放Tomcat的核心文件,包括容器、组件。
- coyote:该目录存放协议相关的内容,如HTTP1.1、HTTP1.2、AJP待协议处理器。
- el:该目录用于存放el表达式解析的相关内容。
- jasper:该目录存放JSP引擎的相关内容。
- juli:该目录存放JULI日志框架的源码。
- naming:该目录存放JDNI的相关内容。
- tomcat:该目录存放tomcat工具类,如jar包扫描组件、DBCP连接池源码、InstanceManager实例化管理器等组件。