热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tomcat5启动流程与配置详解ZT

Tomcat5启动流程与配置详解   星期日 2007年08月19日 Tomcat5启动流程与配置


Tomcat5启动流程与配置详解  
星期日 2007年08月19日


Tomcat5启动流程与配置详解

 

虽然版本已经更新蛮多的了,但是了解以前的还是有很大帮助的。

1.Tomcat5.0 目录结构


    Tomcat下有9个目录,分别是bin,common,conf,logs,server,shared,temp,webapps,work 目录,现在对每一目录做介绍。Tomcat根目录在tomcat中叫

-/bin-


    存放各种平台下启动和关闭Tomcat的脚本文件。startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件。

-/common-


    在common目录下的lib目录,存放Tomcat服务器和所有web应用都能访问的JAR。

-/shared-


    在shared目录下的lib目录,存放所有web应用能访问的,但Tomcat不能访问的JAR。

-/server-


    在server/webapps目录中,存放Tomcat自带的两个APP-admin和manager应用,使用来管理Tomcat-web服务用的。在server/lib目录中,存放tomcat服务器所需要的各web应用不能访问种jar。

-/work –


    Tomcat把各种由jsp生成的servlet文件放在这个目录下。

-/temp –


    临时活页夹,Tomcat运行时候存放临时文件用的。

-/logs –


    存放Tomcat的日志文件。

-/conf –


    Tomcat的各种配置文件,最重要的是 server.xml。(下文将详细介绍此文件)

-/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]: 位于整个配置文件的顶层, 包括


②连接器类元素[Connectors ]: 客户和服务(容器类元素)间的通讯接口。接受客户请求,返回响应结果


③容器类元素[Containers]: 处理客户请求并且生成响应结果,包含3个:


④嵌套类元素[Nested Components]: 可以加入到容器中的元素,包括: 等。

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方式记录的值更多

 

    一个包含一个或多个,一个包含唯一一个和一个或多个,多个 共享一个;一个包含多个,每个定义一个虚拟主机,包含一个或多个web应用; 元素是代表一个在虚拟主机上运行的Web应用。标签的描述(Apache官方文档):


    Please note that for tomcat 5.x, unlike tomcat 4.x, it is NOT recommended to place elements directly in the server.xml file. Instead, put them in the META-INF/context.xml directory of your WAR file or the conf directory as described above.

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接口组件产生的start,stop事件)。

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的一些属性(Change request properties that have already been used to direct the flow of processing control for this 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的子容器是Wrapper(代表单个Servlet)。Context接口里面多数是关于Web Application的设置的方法,我们可以参考Web.xml文件研究里面的方法,里面多数方法都是如何读取Web.xml文件里的资源。

4.11
org.apache.catalina.Wrapper



    Wrapper是一个容器,它代表单个Servlet。Wrapper管理Servlet的生命周期,包括调用init()和destory()方法。Wrapper所附属的父容器是Context,没有附属于Wrapper的子容器,方法addChild()应该抛出IllegalArgumentException异常。Wrapper接口里面的方法都是关于读取Servlet的属性,可以参考Web.xml文件里面关于标签的定义。

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文件。

6.tomcat 虚拟主机配置


    第一步





  








  





    第二步对于windows XP:


\WINDOWS\system32\drivers\etc\hosts,此文件没有扩展名,可以手工创建。


127.0.0.1       localhost


127.0.0.1      

www.dykj.com



127.0.0.1      

www.zhip.com

7.tomcat做web服务器的中文参数传递问题


    tomcat做web服务器时,通过地址栏传中文参数时,为防止浏览器上的为乱码,需在服务器server.xml中配置对应的端口中配置编码方式即可。例如:




  maxSpareThreads="75" enableLookups="false" redirectPort="8443"


  acceptCount="100"  debug="0" cOnnectionTimeout="20000"


  disableUploadTimeout="true" useBodyEncodingForURI="true"


   URIEncoding="UTF-8"/>


    中加入useBodyEncodingForURI="true" URIEncoding="UTF-8"就可以了。



Tomcat5启动流程与配置详解 ZT




推荐阅读
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
YANLIUPING
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有