设为首页 收藏本站
查看: 235|回复: 0

[经验分享] Tomcat启动过程

[复制链接]

尚未签到

发表于 2017-1-17 10:29:36 | 显示全部楼层 |阅读模式
  1 Tomcat5.0目录结构
  Tomcat下有9个目录,分别是
  bin,common,conf,logs,server,shared,temp,webapps,work 目录,现在对每一
  目录做介绍。Tomcat根目录在tomcat中叫<CATALINA_HOME>。
  -<CATALINA_HOME>/common-
  在common目录下的lib目录,存放Tomcat服务器和所有web应用都能访问的JAR。
  -<CATALINA_HOME>/shared-
  在shared目录下的lib目录,存放所有web应用能访问的,但Tomcat不能访问的JAR。
  -<CATALINA_HOME>/server-
  在server/webapps目录中,存放Tomcat自带的两个APP-admin和manager
  应用,使用来管理Tomcat-web服务用的。在server/lib目录中,存放tomcat服
  务器所需要的各web应用不能访问种jar。
  -<CATALINA_HOME>/work –
  Tomcat把各种由jsp生成的servlet文件放在这个目录下。
  -<CATALINA_HOME>/temp –
  临时活页夹,Tomcat运行时候存放临时文件用的。
  -<CATALINA_HOME>/logs –
  存放Tomcat的日志文件。
  -<CATALINA_HOME>/conf –
  Tomcat的各种配置文件,最重要的是 server.xml。下文将详细介绍此文件:
  -<CATALINA_HOME>/webapps-
  web应用的发布目录,把 java开发的web站点或war文件放入这个目录下就
  可以通过tomcat服务器访问了。
  2:Tomcat的启动
  Tomcat的启动是从解析bat文件开始bat文件最终调用
  org.apache.catalina.startup.Bootstrap开始类的加载。
  2.1 TOMCAT自己的类载入器(ClassLoader)加载流程如下
  +---------------------------+
  |         Bootstrap         |
  |                |                 |
  |          System            |
  |                |                 |
  |          Common          |
  |            /       \             |
  |   Catalina  Shared    |
  +---------------------------+
  其中:
  -Bootstrap –
  载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar。
  - System -
  ①载入$CATALINA_HOME/bin/bootstrap.jar  初始化Tomcat,执行Main方法。
  ②$JAVA_HOME/lib/tools.jar  Sun的工具类,包括编译Jsp为Servlet的工具类。
  - Common -
  这个目录下的类虽然对TOMCAT和所有的WEB APP都可见。但是Web App的
  类不应该放在这个目录下,所有未打包的Class都在$CATALINA_HOME/common/classes下,
  所有打包的jar都 在$CATALINA_HOME/commons/endorsed和$CATALINA_HOME/common/lib下,
  默认情况会包含以下几个 包:
  ①jndi.jar JNDI API接口,这个包仅在Java1.2时候装入,1.3以后的版本JDK
  已自动装入。
  ②naming-common.jar JNDI接口实现类,Tomcat用这些类在内存中使用Context。
  ③naming-resources.jar JNDI实现,Tomcat用它们定位Web App的静态资源。
  ④servlet.jar Servlet,Jsp API。
  ⑤xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆盖。
  - Catalina -
  装入Tomcat实现所有接口的类,这些类对Web App是完全不可见的,所有未
  打包的类在$CATALINA_HOME/server/classes所有jar包在$CATALINA_HOME 
  /server/lib下。一般情况该ClassLoader将Load下面几个包:
  ①catalina.jar Servlet容器的Tomcat实现包。
  ②jakarta-regexp-X.Y.jar 正则表达式,请求过滤时使用。
  ③servlets-xxxxx.jar Servlet支持包。
  ④tomcat-coyote.jar Tomcat的Coyote连接实现包。
  ⑤tomcat-jk.jar Web Server绑定包,允许Tomcat绑定Apache等作为Web Server。
  ⑥tomcat-jk2.jar 功能同上。
  ⑦tomcat-util.jar Tomcat工具类,可能被一些Connector用到。
  ⑧tomcat-warp.jar 用于Apache Server包。
  - Shared -
  载入所有WEB APP都可见的类对TOMCAT不可见。 所有未打包的类在
  $CATALINA_HOME/shared/classes所有jar包在$CATALINA_HOME /lib下。
  默认情况包含下面几个包:
  ①jasper-compiler.jar Jsp编译器,编译Jsp为Servlet。
  ②jasper-runtime.jar Jsp(已编译成Servlet)运行支持包。
  ③naming-factory.jar 支持Web App使用JNDI的封装包。
  -WebAppX -
  Web App ClassLoader,Web App被部署是在该ClassLoader被创建的时候。
  所有class都在WEB-INF/classes下,所有jar在WEB-INF/lib下。
  特别注意WEB APP自己的ClassLoader的实现与众不同:
  它先试图从WEB APP自己的目录里载入如果失败则请求父ClassLoader
  的代理。这样可以让不同的WEB APP之间的类载入互不干扰.另,Tomcat Server
  使用的是Catalina   ClassLoader,一般的Web App使用的是WebApp 
  ClassLoader。
  2.2 下面总结Tomcat类加载过程
  Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
  System($CLASSPATH/*.class和指定的jar)
  Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)
  Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
  Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)
  仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)
  2.3加载类和资源的顺序为:
  1、/Web-INF/classes
  2、/Web-INF/lib/*.jar
  3、Bootstrap
  4、System
  5、$CATALINA_HOME/common/classes
  6、$CATALINA_HOME/common/endores/*.jar
  7、$CATALINA_HOME/common/lib/*.jar
  8、$CATALINA_HOME/shared/classes
  9、$CATALINA_HOME/shared/lib/*.jar
  3:server.xml
  3.1配置tomcat组件的XML文件server.xml:
  ①顶层类元素[Top Level Elements]: 位于整个配置文件的顶层, 包括<Server>和<Service>。
  ②连接器类元素[Connectors ]: 客户和服务(容器类元素)间的通讯接口。接受客户请求,返回响应结果<Connector>。
  ③容器类元素[Containers]: 处理客户请求并且生成响应结果,包含3个:<Engine> <Host> <Context>。
  ④嵌套类元素[Nested Components]: 可以加入到容器中的元素,包括:<logger> <Valve><Realm>等。
  3.2下表为server.xml配置简介:  
  元素名    属性    解释 
  server    port     指定一个端口这个端口负责监听关闭 tomcat的请求 
  shutdown          指定向端口发送的命令字符串 
  service   name  指定 service的名字 
  Connector
  (表示客户端和 service之间的连接 )
  port——指定服务器端要创建的端口号并在这个端口监听来自客户端的请求 
  minProcessors——服务器启动时创建的处理请求的线程数 
  maxProcessors——最大可以创建的处理请求的线程数 
  enableLookups——如果为 true则可以通过调用 request.getRemoteHost()进行 
  DNS——查询来得到远程客户端的实际主机名若为 false则不进行 DNS查询而是返回其 ip地址 
  redirectPort——指定服务器正在处理 http请求时收到了一个 SSL传输请求后重定向的端口号 
  acceptCount——指定当所有可以使用的处理请求的线程数都被使用时可以放到处理队列中的请求数超过这个数的请求将不予处理 
  connectionTimeout——指定超时的时间数 (以毫秒为单位 )
  Engine
  (表示指定 service中的请求处理机接收和处理来自 Connector的请求 ) 
  defaultHost——指定缺省的处理请求的主机名它至少与其中的一个 host元素的 name属性值是一样的
  Context
  (表示一个 web应用程序通常为 WAR文件关于 WAR的具体信息见 servlet规范 )
  docBase—— 应用程序的路径或者是 WAR文件存放的路径 
  path——表示此 web应用程序的 url的前缀这样请求的 url为http://localhost:8080/path/****
  reloadable——这个属性非常重要如果为 true则 tomcat会自动检测应用程序的 /WEB-INF/lib 和 /WEB-INF/classes目录的变化自动装载新的应用程序
  我们可以在不重起 tomcat的情况下改变应用程序 
  host
  (表示一个虚拟主机)
  name——指定主机名 
  appBase——应用程序基本目录即存放应用程序的目录 
  unpackWARs——如果为 true则 tomcat会自动将 WAR文件解压否则不解压直接从 WAR文件中运行应用程序 
  Logger 
  (表示日志调试和错误信息)
  className——指定 logger使用的类名此类必须实现 org.apache.catalina.Logger 接口 
  prefix——指定 log文件的前缀 
  suffix——指定 log文件的后缀 
  timestamp——如果为 true则 log文件名中要加入时间如下
  例 :localhost_log.2007-03-04.txt
  Realm 
  (表示存放用户名密码及role的数据库)
  className——指定 Realm使用的类名此类必须实现 org.apache.catalina.Realm接口 
  Valve
  (功能与Logger差不多其prefix和suffix属性解释和Logger 中的一样) 
  className——指定 Valve使用的类名如用 org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 
  directory——指定 log文件存放的位置 
  pattern——有两个值common方式记录远程主机名或 ip地址用户名日期
  第一行请求的字符串HTTP响应代码发送的字节数。 combined方式比 common方式记录的值更多 
  一个<Server>包含一个或多个<Service>,
  一个<Service>包含唯一一 个<Engine>和一个或多个<Connector>,
  多个 <Connector>共享一个<Engine>;
  一个<Engine>包含多个<Host>,
  每个<Host>定义一个虚拟主机,包含一个或多个web应用<Context>;
  <Context>元素是代表一个在虚拟主机上运行的Web应用。
  3.3分析server.xml
  -Server-
  server元素是JVM的入口点,整个配置文件只有一个,因为server不是容器
  (container),因此不能嵌套子组件。server在某一指定的端口监听shutdown命令。
  server可以包含一个或多个service实。
  -Service-
  service有共享同一个Container的一个或多个Connectors组成,一般
  Service就是一个Engine,但没有明确规范要求如 此。因为Service不是一个
  Container,因此不能在里面嵌套子组件(比如Loggers/Valves)。
  -Connector-
  connector就是一个Tomcat与客户端的连接,Tomcat有两种典型的
  Connector:http,JK2.http connector监听来自Browser的连接(通常在我们熟
  悉的8080端口),JK2.来自其他WebServer的请求(默认在8009端口监 听)。
  Connector会把获得的请求交给Engine处理。
  -Engine-
  Engine下可以配置多个虚拟主机Virtual Host每个虚拟主机都有一个域
  名。当Engine获得一个请求时它把该请求匹配到某个Host上然后把该请求交给该Host来处理。
  Engine 有一个默认虚拟主机当请求无法匹配到任何一个Host上的时候将交给该默认Host来处理。
  -Host-
  host代表一个虚拟主机默认是localhosthost下可以部署多个web 
  application在我们实际应用中一般要考虑问题的对象就是host。
  4:Tomcat主要组件类介绍
  4.1 org.apache.catalina.Lifecycle
  通用的组件声明周期接口一般Tomcat的组件都要实现这个接口但不是
  必须的这个接口是为所有组件提供相同的start和stop。
  4.2 org.apache.catalina. LifecycleListener
  该接口用于监听一些重要事件包括实现了Lifecycle接口组件产生的startstop事件。
  4.3 org.apache.catalina.Container
  容器是用于从客户端取得请求request并且处理请求并回复给客户端response的对象。
  容器可以支持可选pipeline以便能在运行时按配置的顺序处理请求。
  在Tomcat里面容器在概念上存在以下几层
  -Engine-请求处理入口点可以包含多个Host和Context。
  -Host-代表一个虚拟主机。
  -Context-代表单个ServletContext可以包含多个Wrappers。
  -Wrapper-代表单个Servlet如果Servlet实现了SingleThreadModel可以代表单个Servlet的多个实例。
  容器为了实现自己的功能经常要绑定一些其他组件这些组件的功能可能被共享也可以被单独定制下面是被使用的组件
  -Loader-ClassLoader装载Java Classes。
  -Logger-实现了ServletContext的log方法用于记录日志。
  -Manage-管理与容器绑定的session池。
  -Realm-用户安全管理。
  -Resources-JNDI资源访问
  4.4 org.apache.catalina. ContainerListener
  容器事件监听器注意的是startstop是正常的生命周期事件LiftcycleEvent不是容器事件。
  4.5 org.apache.catalina. Pipeline
  Pipleline是Valve的集合当invoke方法被调用时它会按指定的顺序
  调用Valve它总是要求有一个Valve必须处理传递的request一般是最后一
  个并产生response否则就把request传递到下一个Valve。
  一般一个容器仅绑定一个Pipleline实例一般说来容器会把处理request
  的功能封装到一个容器绑定的Valve里这个Valve应该在 Pipleline最后被
  执行。为了完成这个功能Pipleline提供了setBasic方法以保证Valve
  被最后执行而其他Valve按 顺序被调用。
  4.6 org.apache.catalina.Valve
  Valve是被绑定在一个Container上的请求处理组件一组Valve被按顺序
  绑定在一个Pipleline上。
  一个Valve可能按照一定的顺序执行下面的动作
  *1.检查并且或者修改指定的Request和Response属性。
  *2.检查Request属性生成相应的Response并返回控制权到调用者。
  *3.检查Request和Reponse属性包装这些对象并增强它们的功能然后把它们传到下一个组件。
  *4.如果相应的Response没有被产生并且控制权也没有被返回调用Pipleline上的下一个Valve如果有通过方法context.invokeNext()。
  *5.检查但不修改Response属性调用后面的Valve或Container产生的。
  Valve一定不能作下面的事情
  *1. 改变Request的一些属性。
  *2.创建一个已经被创建并且已经被传递的Response。
  *3.在调用invokeNext()方法并返回后修改包含Response的HTTP Header信息。
  *4.在invokeNext()调用返回后在绑定Response上的输出流上作任何调用。
  *@param
  request 将被处理的Request
  *@param
  response 将被创建的Response
  *@param
  context 被用来调用下一个Valve的Valve Context
  4.7 org.apache.catalina.ValveContext
  一个ValveContext是这样一种机制一个Valve可以触发下一个Valve的
  调用而不必知道机制的内在实现。
  4.8 org.apache.catalina.Engine
  Engine是一个容器是Cataline的Servlet的入口点。当发布一个连接到
  Web Server的Cataline时可能不使用Engine因为Connectior将使用Web 
  Server的资源决定使用哪个Context处理Request。附属于Engine的子容器根
  据Engine实现的不同可能是Host或 Context单个Servlet Context。如果
  使用了Engine在Cataline的层次中它就是顶层容器因此setParent()应改
  抛出 IllegalArgumentException异常。
  4.9 org.apache.catalina. Host
  Host是一个容器它代表一个虚拟主机。当发布一个连接到Web Server的
  Cataline时可能不使用Host因为Connectior将使用Web Server的资源决定
  使用哪个Context处理Request。Host所附属的父容器通常是Engine附属于
  Host的子容器通常是 Context单个Servlet Context。Host接口里面的方
  法多数都是关于修改Host属性及设定默认的Context。这里我们不再一一列举。
  4.10 org.apache.catalin. Context
  Context是一个容器它代表一个ServletContext一个Cataline Engline
  中的单个的Web Application。Context所附属的父容器是Host附属于Context
  4.11 org.apache.catalina.Wrapper
  Wrapper是一个容器它代表单个Servlet。Wrapper管理Servlet的生命
  周期包括调用init和destory方法。 Wrapper所附属的父容器是Context
  没有附属于Wrapper的子容器方法addChild()应该抛出 IllegalArgumentException异常。
  Wrapper接口里面的方法都是关于读取Servlet的属性可以参考Web.xml文件里 面关于<servlet>标签的定义。
  4.12 org.apache.catalina.Server
  Server是整个Catalina容器的入口点可以包含多个Service和顶层资源元素。
  一般说来实现Server接口的类也应该同时实现Lifecycle接口当start
  和stop方法被调用的时候调用Service相应的方法。
  Server负责在指定的端口监听连接当有连接被接受的时候Server会分
  析请求的第一行信息如果是SHUTDOWN则stop服务。
  可以参考Server.xml文件关于Server的定义。
  4.13 org.apache.catalina. Service
  Service是一个或多个共享同以Container的Connectiors的集合。
  JVM可以包含一个或多个Service实例但它们相互之间是完全独立的它们仅共享JVM的资源。
  4.14 org.apache.catalina. Connector
  Connector是一个从客户端接受请求request并生成回应reponse的组件。
  一个Connection通常执行下面的逻辑
  1)从客户端程序接受请求。
  2)创建Request和Response并把下面这些属性设置到这些对象。
  对所有的 Request、connector、protocol、protocol、response、scheme、
  secure、serverName、serverPort、serverPort 属性必须被设置。
  contentLength、contentType通常也被设置。
  对所有的 HttpRequests、method、queryString、requestedSessionCookie、
  requestedSessionId、requestedSessionURL、requestURI、secure 属性必须被设置。
  另外所有addXxx方法也必须被调用以记录cookiesheaders和locales信息。
  对所有的Responses属性connector、request、stream属性必须被设置。
  对HttpResponses来说connector不会为它设置额外headers信息。
  5:WEB应用程序的目录结构
  在WEB上发布的J2EE应用程序都有自己特定的目录结构。假设创建一名为
  HELLOAPP的WEB项目。
  -HELLOAPP-WEB应用根目录所有JSP\HTML等文件均存放于此。
  -HELLOAPP/WEB-INF-存放WEb应用的发布描述文件web.xml。
  -HELLOAPP/WEB-INF/classes-存放各种class文件servlet类文件也存放于此。
  -HELLOAPP/WEB-INF/lib-存放WEb应用所需的各种JAR文件。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-329689-1-1.html 上篇帖子: Tomcat configuration recommendations 下篇帖子: Eclipse的Tomcat插件安装Eclipse的Tomcat插件安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表