Tomcat组件

Tomcat组件

tomcat经常使用组件

Tomcat的组织结构

Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是CATALINA SERVLET容器,其余的组件按照必定的格式要求配置在这个顶层容器中。
    Tomcat的各个组件是server.xml文件中配置的,Tomcat服务器默认状况下对各类组件都有默认的实现。
    server.xml
        <Server>
            <Service>
                <connector/>
                <connector/>
                ...
                <Engine>
                    <Host>
                        <Context/>
                        <Context/>
                        ...
                    </Host>
                    <Host>
                        ...
                    </Host>
                    ...
                </Engine>
            </Service>
        </Server>
    Tomcat中真正处理客户请求与生成响应的三个组件是Engine 、Host、 Context。
    Tomcat 支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,每个组件都由一个Java“类”实现,这些组件大致可分为如下几个类型:
        顶级组件:Server
        服务类组件:Service
        链接器组件:http, https, ajp(apache jserv protocol)
        容器类:Engine, Host, Context
        被嵌套类:valve, logger, realm, loader, manager, ...
        集群类组件:listener, cluster, ...

Server组件

Tomcat的一个实例,一般一个JVM只能包含一个Tomcat实例。
    所以一台物理服务器上能够在启动多个JVM的状况下在每个JVM中启动一个Tomcat实例,每一个实例分属于一个独立的管理端口。
    表明tomcat instance,即表现出的一个java进程。
    监听在8005端口,只接收“SHUTDOWN”。
    各server监听的端口不能相同,所以,在同一物理主机启动多个实例及多个java进程时,须要修改其监听端口为不一样的端口。
    <Server port=”8005” shutdown=”SHUTDOWN”>
        这会让Tomcat启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。
        各Server的定义不能使用同一个端口,这意味着若是在同一个物理机上启动了多个Server实例,必须配置它们使用不一样的端口。
        这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,所以,管理员能够直接telnet至此端口使用SHUTDOWN命令关闭此实例。
        不过,基于安全角度的考虑,这一般不容许远程进行。
        相关属性:
            className: 用于实现此Server容器的彻底限定类的名称,默认为org.apache.catalina.core.StandardServer;
            port: 接收shutdown指令的端口,默认仅容许经过本机访问,默认为8005;
            shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;

Service组件

一个服务组件一般包含一个引擎和与此引擎相关联的一个或多个链接器。
    给服务命名能够方便管理员在日志文件中识别不一样服务产生的日志。
    一个server能够包含多个service组件,但一般情下只为一个service指派一个server。
    用于实现将一个或多个connector组件关联至一个engine组件。
    <Service name=”Catalina”>
        这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。
        相关属性:
            className: 用于实现service的类名,通常都是org.apache.catalina.core.StandardService。
            name:此服务的名称,默认为Catalina;

Connector组件

负责链接客户端(能够是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,一般指的是接收客户发来请求的位置及服务器端分配的端口。
    默认端口一般是HTTP协议的8080,管理员也能够根据本身的须要改变此端口。
    一个引擎能够配置多个链接器,但这些链接器必须使用不一样的端口,默认的链接器是基于HTTP/1.1的Coyote。
    Tomcat也支持AJP、JServ和JK2链接器。
    负责接收请求,链接内部的Engine,常见的有三类http/https/ajp;
    
    进入Tomcat的请求能够根据Tomcat的工做模式分为以下两类:
        (1) Tomcat做为独立服务器:
            请求直接来自于客户端浏览器;
        (2) Tomcat做为应用程序服务器:
            请求来自于前端的反代web服务器,这多是Apache, IIS, Nginx等反代
            nginx --> http connector --> tomcat
            httpd(proxy_http_module) --> http connector --> tomcat
            httpd(proxy_ajp_module) --> ajp connector --> tomcat
            
    <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443"/>
        相关属性:
            port="8080",监听端口,默认为0;
            protocol="HTTP/1.1",链接器使用的协议,默认为HTTP/1.1,定义AJP协议时一般为AJP/1.3;
            connectionTimeout="20000",等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
            address:监听的IP地址;默认为本机全部可用地址;
            maxThreads:最大并发链接数,默认为200;
            enableLookups:是否启用DNS查询功能,便是否经过request.getRemoteHost()进行DNS查询以获取客户端的主机名,默认为true;
            acceptCount:等待队列的最大长度,一般在tomcat全部处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
            secure="TRUE" :后面两个属性是启用https的配置,通常tomcat不会使用https,而不是在前段的反代上设置,由于tomcat自己运行起来已经很慢了,加上https就更慢了
            sslProtocol:ssl协议类型
            redirectPort:若是某链接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
    Tomcat链接器架构:
        基于Apache作为Tomcat前端的架构来说,Apache经过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。
        而对Tomcat来讲,每一个Web容器实例都有一个Java语言开发的链接器模块组件,在Tomcat中,这个链接器是org.apache.catalina.Connector类。
        这个类的构造器能够构造两种类别的链接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。
        但能够简单地经过在server.xml配置文件中实现链接器的建立,但建立时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不一样。
        APR是附加在提供了通用和标准API的操做系统之上一个通信层的本地库的集合,它可以为使用了APR的应用程序在与Apache通讯时提供较好伸缩能力时带去平衡效用。
        同时,须要说明的是,mod_jk2模块目前已经再也不被支持了,mod_jk模块目前仍是apache被支持,但其项目活跃度已经大大下降,所以,目前更经常使用 的方式是使用mod_proxy模块。
        若是支持APR:
            HTTP/1.1:org.apache.cotote.http11.Http11AprProtocol
            AJP/1.3:org.apache.coyote.ajp.AjpAprProtocol
        若是不支持APR:
            HTTP/1.1: org.apache.coyote.http11.Http11Protocol
            AJP/1.3: org.apache.jk.server.JkCoyoteHandler
    
    Tomcat应该考虑工做情形并为相应情形下的请求分别定义好须要的链接器才能正确接收来自于客户端的请求,一个引擎能够有一个或多个链接器,以适应多种请求方式。
    定义链接器可使用多种属性,有些属性也只适用于某特定的链接器类型,常见于server.xml中的链接器类型一般有4种:
        HTTP链接器
        SSL链接器
        AJP 1.3链接器
        proxy链接器
    
    链接器协议:
        Tomcat的Web服务器链接器支持两种协议:
            AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。
        AJP(Apache JServ Protocol)协议:
            目前正在使用的AJP协议的版本是经过JK和JK2链接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。
        HTTP协议:
            诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间创建通讯,此时,Tomcat就是一个彻底功能的HTTP服务器,它须要监听在某端口上以接收来自于服务器的请求。

Engine组件

引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每个请求的HTTP首部信息以辨别此请求应该发往哪一个host或context,并将请求处理后的结果返回的相应的客户端。
    严格意义上来讲,容器没必要非得经过引擎来实现,它也能够是只是一个容器。
    若是Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。
    而若是Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,由于Web服务器自身就能肯定将用户请求发往何处。
    一个引擎能够包含多个host组件。
    Servlet实例,即servlet引擎,其内部能够一个或多个host组件来定义站点,一般须要经过defaultHost来定义默认的虚拟主机。
    <Engine name="Catalina" defaultHost="localhost">
    属性:
        name,Engine组件的名称,用于日志和错误信息记录时区别不一样的引擎;
        defaultHost="localhost",
            Tomcat支持基于FQDN的虚拟主机,这些虚拟主机能够经过在Engine容器中定义多个不一样的Host组件来实现。
            但若是此引擎的链接器收到一个发往非非明肯定义虚拟主机的请求时则须要将此请求发往一个默认的虚拟主机进行处理。
            所以,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;
        jvmRoute=

Host组件

主机组件相似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。
    一个引擎至少要包含一个主机组件。
    位于engine内部用于接收请求并进行相应处理的主机或虚拟主机
     <Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
    </Host>
        相关属性:
            appBase:
                设置默认网页文件的存放路径,也就是根目录,至关于httpd的document root
                此Host的webapps是默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径,可使用基于$CATALINA_BASE变量所定义的路径的相对路径。
            unpackWARs:
                若是咱们拿到的一个程序是.war格式的,把它放到网页文件存放的目录下会自动展开。
                在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;
            autoDeploy:
                是否启动自动部署功能
            <Alias>test.com</Alias>:
                若是一个主机有两个或两个以上的主机名,额外的名称都可以以别名的形式进行定义,此处别名定义为test.com
    示例:
        vim  /etc/tomcat/server.xml
            <Host name="tc1.qwe.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
            </Host>
        mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}
        vim /appdata/webapps/ROOT/index.jsp
            提供一个测试页便可;

Context组件

Context组件是最内层次的组件,它表示Web应用程序自己。
    配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器可以将用户请求发往正确的位置。
    Context组件也可包含自定义的错误页,以实如今用户访问发生错误时提供友好的提示信息。
    用来定义一个独立的应用,也就是你访问哪一个uri时访问的是哪一个目录,至关于http里的别名
    <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
        相关属性:
            path:
                表示访问的uri,表明的是个别名
            docBase:
                真实目录路径,指定Web应用的文件路径,能够给定绝对路径,也能够给定相对于<Host>的appBase属性的相对路径。
                若是Web应用采用开放目录结构,则指定Web应用的根目录,若是Web应用是个war文件,则指定war文件的路径。
            reloadable:
                若是这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,若是监测到有class文件被更新的,服务器会自动从新加载Web应用。
                在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加剧服务器运行负荷,建议在Web应用的发布阶段将reloadable设为false。

Valve组件

用来拦截请求并在将其转至目标以前进行某种处理操做,相似于Servlet规范中定义的过滤器。
    Valve能够定义在任何容器类的组件中,Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术一般被称做请求转储(request dumping)。
    请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。 
    Valve相似于过滤器,它能够工做于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。
    一个容器内能够创建多个Valve,并且Valve定义的次序也决定了它们生效的次序。
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    Valve存在多种类型:
        定义访问日志:org.apache.catalina.valves.AccessLogValve
        定义访问控制:org.apache.catalina.valves.RemoteAddrValve
    相关属性:
        AccessLogValve:访问日志Valve
        ExtendedAccessValve:扩展功能的访问日志Valve
        JDBCAccessLogValve:经过JDBC将访问日志信息发送到数据库中;
        RequestDumperValve:请求转储Valve;
        RemoteAddrValve:基于远程地址的访问控制;
        RemoteHostValve:基于远程主机名称的访问控制;
        SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
        JvmRouteBinderValve:在配置多个Tomcat为以Apache经过mod_proxy或mod_jk做为前端的集群架构中,当指望中止某节点时,能够经过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;
        ReplicationValve:专用于Tomcat集群架构中,能够在某个请求的session信息发生更改时触发session数据在各节点间进行复制;
        SingleSignOn:将两个或多个须要对用户进行认证webapp在认证用户时链接在一块儿,即一次认证便可访问全部链接在一块儿的webapp;
        ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,须要结合ClusterSingleSignOnListener进行工做;
        RemoteHostValve和RemoteAddrValve能够分别用来实现基于主机名称和基于IP地址的访问控制,控制自己能够经过allow或deny来进行定义,这有点相似于Apache的访问控制功能;
    示例:
        <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>

Logger组件

用于记录组件内部的状态信息,可被用于除Context以外的任何容器中。
    日志记录的功能可被继承,所以一个引擎级别的Logger将会记录引擎内部全部组件相关的信息,除非某内部组件定义了本身的Logger组件。

realm组件

用于用户的认证和受权。
    在配置一个应用程序时,管理员能够为每一个资源或资源组定义角色及权限,而这些访问控制功能的生效须要经过Realm来实现。
    Realm的认证能够基于文本文件、数据库表、LDAP服务等来实现。
    Realm的效用会遍布整个引擎或顶级容器,所以一个容器内的全部应用程序将共享用户资源。
    同时,Realm能够被其所在组件的子组件继承,也能够被子组件中定义的Realm所覆盖。
    一个Realm表示一个安全上下文,它是一个受权访问某个给定Context的用户列表和某用户所容许切换的角色相关定义的列表。
    所以,Realm就像是一个用户和组相关的数据库。
    定义Realm时唯一必需要提供的属性是classname,它是Realm的多个不一样实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
    相关属性:
        JAASRealm:基于Java Authintication and Authorization Service实现用户认证;
        JDBCRealm:经过JDBC访问某关系型数据库表实现用户认证;
        JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;
        MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;
        UserDatabaseRealm:基于UserDatabase文件(一般是tomcat-user.xml)实现用户认证,它实现是一个彻底可更新和持久有效的MemoryRealm,所以可以跟标准的MemoryRealm兼容,它经过JNDI实现;

综合示例

<Host name="node1.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="node1_access" suffix=".log"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="/test" docBase="test" reloadable="">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
            prefix="node1_test_access_" suffix=".log"
            pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        </Context>
    </Host>

其余配置信息

GlobalNamingResources
        应用于整个服务器的JNDI映射,此能够避免每一个Web应用程序都须要在各自的web.xml建立,这在web应用程序以WAR的形式存在时尤其有用。它一般能够包含三个子元素:
            Environment;
            Resource;
            ResourceEnvRef;
    WatchedResource
        WatchedResource能够用于Context中监视指定的webapp程序文件的改变,而且可以在监视到文件内容发生改变时从新装载此文件。
    Listener
        Listener用于建立和配置LifecycleListener对象,而LifecycleListener一般被开发人员用来建立和删除容器。
    Loader
        Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖的类。Loader能够用于Context中控制java类的加载。
    Manager
        Manger对象用于实现HTTP会话管理的功能,Tomcat中有5种Manger的实现:
        StandardManager
            Tomcat的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。
        PersistentManager
            当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来讲比较有用。
        DeltaManager
            用于Tomcat集群的会话管理器,它经过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将全部会话的改变同步给集群中的每个节点,也是在集群环境中用得最多的一种实现方式。
        BackupManager
            用于Tomcat集群的会话管理器,与DeltaManager不一样的是,某节点会话的改变只会同步给集群中的另外一个而非全部节点。
        SimpleTcpReplicationManager
            Tomcat4时用到的版本,过于老旧了。
    Stores
        PersistentManager必须包含一个Store元素以指定将会话数据存储至何处。这一般有两种实现方式:FileStore和JDBCStore。
    Resources
        常常用于实如今Context中指定须要装载的但不在Tomcat本地磁盘上的应用资源,如Java类,HTML页面,JSP文件等。
    Cluster
        专用于配置Tomcat集群的元素,可用于Engine和Host容器中。在用于Engine容器中时,Engine中的全部Host均支持集群功能。在Cluster元素中,须要直接定义一个Manager元素,这个Manager元素有一个其值为org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className属性。同时,Cluster中还须要分别定义一个Channel和ClusterListener元素。
        Channel 用于Cluster中给集群中同一组中的节点定义通讯“信道”。Channel中须要至少定义Membership、Receiver和Sender三个元素,此外还有一个可选元素Interceptor。
        Membership 用于Channel中配置同一通讯信道上节点集群组中的成员状况,即监控加入当前集群组中的节点并在各节点间传递心跳信息,并且能够在接收不到某成员的心跳信息时将其从集群节点中移除。Tomcat中Membership的实现是org.apache.catalina.tribes.membership.McastService。
        Sender 用于Channel中配置“复制信息”的发送器,实现发送须要同步给其它节点的数据至集群中的其它节点。发送器不须要属性的定义,但能够在其内部定义一个Transport元素。
        Transport 用于Sender内部,配置数据如何发送至集群中的其它节点。Tomcat有两种Transport的实现: 
            1) PooledMultiSender 
                基于Java阻塞式IO,能够将一次将多个信息并发发送至其它节点,但一次只能传送给一个节点。 
            2)PooledParallelSener 
                基于Java非阻塞式IO,即NIO,能够一次发送多个信息至一个或多个节点。
        Receiver 用于Channel定义某节点如何从其它节点的Sender接收复制数据,Tomcat中实现的接收方式有两种BioReceiver和NioReceiver。
相关文章
相关标签/搜索