Tomcat启动分析

转载 2004年08月06日 16:46:00

1 - Tomcat Server的组成部分

1.1 - Server

A Server element represents the entire Catalina servlet container. (Singleton)

1.2 - Service

A Service element represents the combination of one or more Connector components that share a single Engine
Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求

1.3 - Connector

一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户
TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求

1.4 - Engine

The Engine element represents the entire request processing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmission back to the client
Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

1.5 - Host

代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理
匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配

1.6 - Context

一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成
Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类
如果找到,则执行该类,获得请求的回应,并返回

2 - Tomcat Server的结构图

01-startup.gif

3 - 配置文件$CATALINA_HOME/conf/server.xml的说明

该文件描述了如何启动Tomcat Server




<Server port="8005" shutdown="SHUTDOWN" debug="0">


  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>


  <GlobalNamingResources>
    ... ... ... ...
  </GlobalNamingResources>


  <Service name="Tomcat-Standalone">


    <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" 
               port="8080" 
               minProcessors="5" maxProcessors="75" acceptCount="100" 
               enableLookups="true" 
               redirectPort="8443" 
               debug="0" 
               connectionTimeout="20000" 
               useURIValidationHack="false" 
               disableUploadTimeout="true" />


    <Engine name="Standalone" defaultHost="localhost" debug="0">
    

      <Logger className="org.apache.catalina.logger.FileLogger" .../>

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>


      <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
      

        <Logger className="org.apache.catalina.logger.FileLogger" .../>
      

        <Context path="" docBase="mycontext" debug="0"/>
        

        <Context path="/wsota" docBase="wsotaProject" debug="0"/>
             
        
      </Host>
      
    </Engine>

  </Service>

</Server>


4 - Context的部署配置文件web.xml的说明

一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的
当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类
它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类
然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类
web.xml文件有两部分:servlet类定义和servlet映射定义
每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应
当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应

分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入



<web-app>




  

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.DefaultServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>


    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>



    
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>


    ... ... ... ...

</web-app>


5 - Tomcat Server处理一个http请求的过程

假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser

Tomcat源码分析--启动过程

一直使用Tomcat确不知道它的运行原理。看了源码后对它的启动过程有了一定的了解,特来记录一下。      首先先介绍一下Tomcat的架构图:       Tomcat主要有两个核心的组件,一个是...
  • c275046758
  • c275046758
  • 2016年04月26日 16:52
  • 5333

Tomcat启动过程分析(上)

一般启动Tomcat会是运行startup.bat或者startup.sh文件,实际上这两个文件最后会调用org.apache.catalina.startup.Bootstrap类的main方法, ...
  • hanekawa
  • hanekawa
  • 2016年08月10日 19:09
  • 7301

Tomcat启动打印日志格式分析

Tomcat启动后,Console打印日志: 2016-6-22 23:34:20 org.apache.catalina.core.AprLifecycleListener init 信息: T...
  • nyhyn
  • nyhyn
  • 2016年06月22日 23:51
  • 848

tomcat源码解析(一)——Bootstrap和Catalina启动部分

本文目的是总结tomcat的类Bootstrap和Catalina的在启动中的动作。由于tomcat是通过组件方式进行注册及生命周期的统一管理,所以对各不同组件的生命周期及动作源码解析会在后面的文章中...
  • u011545486
  • u011545486
  • 2016年07月23日 09:49
  • 3248

Tomcat7源码解析

Tomcat7 源码阅读学习     背景     Tomcat源码目录结构     Tomcat体系结构     Tomcat源码解析           Tomcat的启动流程          ...
  • c929833623lvcha
  • c929833623lvcha
  • 2015年03月27日 15:42
  • 4896

Tomcat源码分析之Context的创建与启动分析

在前面的文章中,知道在HostConfig对象中,会在host启动的时候开始部署当前host下面的web应用程序,一般情况下就是扫描webapps文件夹,然后为每个web应用程序创建Context对象...
  • fjs_cloud
  • fjs_cloud
  • 2014年03月15日 20:48
  • 1654

Tomcat启动过程原理详解

Tomcat启动过程原理详解,Tomcat Server处理一个http请求的过程
  • yuxiangaaaaa
  • yuxiangaaaaa
  • 2017年06月05日 14:48
  • 590

tomcat的启动过程(Tomcat源码解析(三))

Tomcat组件生命周期管理 在Tomcat总体结构 (Tomcat源代码解析之二)中,我们列出了Tomcat中Server,Service,Connector,Engine,Host,Contex...
  • jiaomingliang
  • jiaomingliang
  • 2015年08月10日 17:49
  • 5454

Tomcat日志文件分析详解

在server.xml里的标签下加上 directory="logs"prefix="localhost_access_log." suffix=".txt" pattern="common"...
  • u011599900
  • u011599900
  • 2014年04月11日 19:12
  • 3016

tomcat源码解析(一)--启动与Server.xml文件的解析

后台大部分功能是用java来实现的,因此很有必要了解tomcat的底层实现。写下此文留做复习用吧。至于一些概念在一书《深入剖析tomcat》已经有很详细的分析了。 说明一下本文分析的tomcat的...
  • x87648510
  • x87648510
  • 2016年06月24日 11:23
  • 1253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tomcat启动分析
举报原因:
原因补充:

(最多只允许输入30个字)