Web服务器专题:Tomcat(一)基础及模块
针对java系的经典服务器,打算系统的整理一下Tomcat的机制和一些原理,以此记录。
插一则题外话,关于tomat这个名字的由来:Tomcat 名称的由来
关于Tomcat
基础的 tomcat 内容就不过多赘述了,基本的百度百科都可以看到,在这里我想从catlina入手介绍一下tomcat,我想很多人刚开始接触tomcat,不论是日志里,bin目录下的脚本里,都会看见catlina这个东西,都会很困惑,什么是 Catlina,说到 Catlina,就要介绍一些tomcat相比于Apache 的不同之处,简单来说,Apache主要用来处理网络中的静态资源请求(HTML,CSS、图片等),而tomcat是专为java的servlet而生的,简单来说就是为J2EE提供环境的, 用来解析动态的资源处理(即后端的业务处理,动态数据等)的部分就被称为 Catlina。
tomcat 继承了Apache 作为web服务器的基本功能,本身包含了三个重要的组成:
处理 html, js, css等 静态页面的Web容器;
根据不同的请求来调用不同的servlet的servlet容器Catlina;
编译jsp的引擎Jasper
其实Catlina就是一个Servlet容器,它也是tomcat区别于其他服务器的核心,整个Tomcat最核心的事就是进行Servlet的管理和根据前端的请求进行调度。
Tomcat的目录层级及常用文件
首先简单记录一下Tomcat的文件目录及一些常用的文件。
Tomcat的目录:
|---bin://存放启动和关闭tomcat脚本
|---conf://存放不同的配置文件(server.xml和web.xml);
|---doc://存放Tomcat文档;
|---lib/japser/common://存放Tomcat运行需要的库文件(JARS);
|---logs://存放Tomcat执行时的LOG文件;
|---src://存放Tomcat的源代码;
|---webapps://Tomcat的主要Web发布目录(包括应用程序示例);
|---work://存放jsp编译后产生的class文件;
以上目录中,一般我们基本开发部署中常用的基本就 bin 、conf 、logs三个,其中 tomcat 的系统级启动shell、bat文件均在bin目录下,具体环境变量及启动流程,都可以在start.sh或start.bat中查看源码,这里就不多说了,就主要说一下 conf 目录下的文件吧:
server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;
catalina.properties:Tomcat内部package的定义及访问相关控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的 组件级别以及日志文件的存在位置等;
context.xml:所有host的默认配置信息;
Tomcat架构
Tomcat的设计是基于模块化设计的,内部主要依赖于不同的模块组件构成, 这里打算图解一下Tomcat的内置组件及 一条请求的主要流程,话不多说,先上图:
一句话简单概括,一个tomcat只有一个Server作为根,它管理着多个Service服务,而Service服务又管理着多个Connector以及一个Container,其中核心组件为Connector以及Container。
Server
组件
从图中可以看出,一个Tomcat只能有一个Server,Server就是一个Tomcat的实例。
Service
组件
Service其实是一个集合,它将Connector
组件与Container
组件包装组合在一起(一个Service可以有多个Connector和一个Container),对外进行服务,而Service又是运行在Server中,也就是说,一个Tomcat可以有多个service
Connector
组件
该组件主要负责监听指定端口的客户端请求(不同端口对应不同的Connect组件),将Socket请求过来的数据,都封装成Request请求对象,同时将该请求对象 传递给Container容器进行下一步的处理。
Container
组件
Container组件才是最接近Web应用的组件,它负责根据请求进行一系列的servlet调用,本身Container又包含四个子容器:Engine
、Host
、Context
、Wrapper
Container的容器组合如下图:
Engine
:引擎,用来管理多个站点, 一个Service
最多只能有一个Engine
;Host
:代表一个站点,也可以叫虚拟主机,通过配置Host 就可以添加站点;Context
:代表一个应用程序,即为我们开发的一个war
服务在webapp
目录下的各个应用,或者一个WEB-INF
目录以及下面的web.xml
文件;Wrapper
:每个Wrapper
封装着一个servlet
一次完整的流程:
1、当我们浏览器点击事件发生,发送了一个http/https的请求,首先到达tomcat,即运行的实例server中
2、该请求被监听 8080 端口的 connector监听到,获取请求报文后,封装成Request请求,并将该请求发往Engine
3、Engine根据请求的url,搜寻使用哪个Host
4、当相应的Host获取该请求后,根据请求中的地址,找寻相应的Context来处理该请求
5、Context根据其内部的映射表,获取相应的servlet,并构造HttpServletRequest
对象和HttpServletResponse
对象,进行业务处理
6、Context将处理完的HttpServletResponse
对象返回给Host
7、Host再将结果返回Engine
8、Engine中心调度,将结果返回给 connector
9、connector将结果返归给客户端
进发:web服务器专题:tomcat(二)模块组件与server.xml 配置文件