Fork me on GitHub

web服务器专题:tomcat(一)基础及模块

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又包含四个子容器:EngineHostContextWrapper

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 配置文件   

 

 

 

 

posted @ 2020-12-03 23:02  糖拌西红柿  阅读(482)  评论(0编辑  收藏  举报