Tomcat的架构图

Tomcat的组织结构

Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的是Catalina servlet容器,其他组件按照一定的格式要求配置在这个顶层容器中。 
Tomcat的各种组件都是在Tomcat安装目录下的/conf/server.xml文件中配置的。

由Server.xml的结构看Tomcat的体系结构

1
2
3
4
5
6
7
8
9
10
11
12
<Server>                                                //顶层类元素,可以包括多个Service   
    <Service>                                           //顶层类元素,可包含一个Engine,多个Connecter
        <Connector>                                     //连接器类元素,代表通信接口
                <Engine>                                //容器类元素,为特定的Service组件处理客户请求,要包含多个Host
                        <Host>                          //容器类元素,为特定的虚拟主机组件处理客户请求,可包含多个Context
                                <Context>               //容器类元素,为特定的Web应用处理所有的客户请求
                                </Context>
                        </Host>
                </Engine>
        </Connector>
    </Service>
</Server>

配置文件详解

1. Tomcat的配置文件

Tomcat的配置文件默认存放在/usr/local/tomcat/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的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;

logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;

context.xml:所有host的默认配置信息;

2. Server.xml

  Tomcat以面向对象的方式运行,它可以在运行时动态加载配置文件中定义的对象结构,这有点类似于apache的httpd模块的调用方式。server.xml中定义的每个主元素都会被创建为对象,并以某特定的层次结构将这些对象组织在一起。下面是个样样例配置:

<Server port=”8005″ shutdown=”SHUTDOWN”>

  <Listener className=”org.apache.catalina.core.JasperListener” />
  <Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener” />
  <Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />   <GlobalNamingResources>
   <Resource name=”UserDatabase” auth=”Container”
   type=”org.apache.catalina.UserDatabase”
   description=”User database that can be updated and saved”
   factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
   pathname=”conf/tomcat-users.xml”/>
  </GlobalNamingResources>   <Service name=”Catalina”>     <Connector port=”8080″ protocol=”HTTP/1.1″
      maxThreads=”150″ connectionTimeout=”20000″
      redirectPort=”8443″/>     <Engine name=”Catalina” defaultHost=”localhost”>       <Host name=”localhost” appBase=”webapps”
        unpackWARs=”true” autoDeploy=”true”
        xmlValidation=”false” xmlNamespaceAware=”false”>
      </Host>
    </Engine>
  </Service>
</Server> <Server port=”8005″ shutdown=”SHUTDOWN”>
  <Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
  <Listener className=”org.apache.catalina.core.JasperListener” />
  <Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
  <Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
  <Listener className=”org.apache.catalina.core.ThreadLocalLeakPreventionListener” />   <GlobalNamingResources>
    <Resource name=”UserDatabase” auth=”Container”
      type=”org.apache.catalina.UserDatabase”
      description=”User database that can be updated and saved”
      factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
      pathname=”conf/tomcat-users.xml” />
  </GlobalNamingResources>   <Service name=”Catalina”>     <Connector port=”8080″ protocol=”HTTP/1.1″
      connectionTimeout=”20000″
      redirectPort=”8443″ />
    <Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />     <Engine name=”Catalina” defaultHost=”localhost”>      <Realm className=”org.apache.catalina.realm.LockOutRealm”>
       <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
           resourceName=”UserDatabase”/>
     </Realm>      <Host name=”localhost” appBase=”webapps”
         unpackWARs=”true” autoDeploy=”true”>        <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” />      </Host>
    </Engine>
  </Service>
</Server> 

server.xml文件中可定义的元素非常多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。

常用组件详解

1. 顶层Server组件

  这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令,使用 telnet 连接8005 端口可以直接执行 SHUTDOWN 命令来关闭 Tomcat。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。

<Server port="8005" shutdown="SHUTDOWN" debug="0">
1>className: 指定实现org.apache.catalina.Server接口的完全限定类的名称.默认值为org.apache.catalina.core.StandardServer
2>port: 服务器等待关机命令的TCP/IP端口号。设置为-1以禁用关闭端口。默认仅允许通过本机访问,默认为8005;
3>shutdown: 必须通过TCP/IP连接接收到指定端口号的命令字符串,以关闭Tomcat。默认为SHUTDOWN
4>address: 服务器等待关机命令的TCP/IP地址。如果没有指定地址,则使用localhost。 测试:
telnet localhost 8005
输入:SHUTDOWN
结果:关闭tomcat

2. 顶层Service组件

  Service主要用于关联一个引擎和与此引擎相关的多个连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。 

**<Service name="Catalina"\>**
**<Service name="Apache"\>**
第一个<Service>处理所有直接由Tomcat服务器接收的web客户请求.
第二个<Service>处理所有由Apahce服务器转发过来的Web客户请求 .

1>className 指定实现org.apahce.catalina.Service接口的类.默认为org.apahce.catalina.core.StandardService
2>name: 定义此服务的名称,此名字也会在产生相关的日志信息时记录在日志文件当中。与特定服务器关联的每个服务的名称必须是唯一的。

3. Connector组件

  Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。

  进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IISNginx等;Tomcat作为独立服务器:请求来自于web浏览器;

  Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,

  常见于server.xml中的连接器类型通常有4种:1) HTTP连接器 2) SSL连接器 3) AJP 1.3连接器 4) proxy连接器;

  Tomcat 支持三种协议:HTTP/1.1、HTTP/2.0、AJP

(1) BIO HTTP/1.1 Connector配置

一个典型的配置如下:  
<Connector port=”8080” protocol=”HTTP/1.1” maxThreads=”150” conn ectionTimeout=”20000” redirectPort=”8443” />
其它一些重要属性如下:
acceptCount : 接受连接request的最大连接数目,默认值是10
address : 绑定IP地址,如果不绑定,默认将绑定任何IP地址
allowTrace : 如果是true,将允许TRACE HTTP方法
compressibleMimeTypes : 各个mimeType, 以逗号分隔,如text/html,text/xml
compression : 如果带宽有限的话,可以用GZIP压缩
connectionTimeout : 超时时间,默认为60000ms (60s)
maxKeepAliveRequest : 默认值是100
maxThreads : 处理请求的Connector的线程数目,默认值为200

如果是SSL配置,如下:
<Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol = "TLS"
address="0.0.0.0"
keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks"
keystorePass="changeit" />
其中,keystoreFile为证书位置,keystorePass为证书密码 (2) NIO HTTP/1.1 Connector配置 <Connector port=”8080” protocol=”org.apache.coyote.http11.Http11NioProtocol” maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”/>

(3) Native APR Connector配置
ARP是用C/C++写的,对静态资源(HTML,图片等)进行了优化。所以要下载本地库tcnative-1.dll与openssl.exe,将其放在%tomcat%\bin目录下。
下载地址是:http://tomcat.heanet.ie/native/1.1.10/binaries/win32/
在server.xml中要配置一个Listener,如下图。这个配置tomcat是默认配好的。

<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
配置使用APR connector
<Connector port=”8080” protocol=”org.apache.coyote.http11.Http11AprProtocol”
maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”/>
如果配置成功,启动tomcat,会看到如下信息: org.apache.coyote.http11.Http11AprProtocol init 
(4) AJP Connector配置
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

  Coyote HTTP/1.1 Connector

  在独立模式下,Tomcat会配置HTTP和HTTPS连接器,这可以使Tomcat看起来更像完整的web服务器以处理静态请求内容同时还委托Catalina引擎来处理动态内容。

  className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
<Connector
port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" /> port : 在端口号8080处侦听来自客户browser的HTTP1.1请求.如果把8080改成80,则只要输入http://localhost/即可
protocol:设定Http协议,默认值为HTTP/1.1,如果使用AJP处理器,该值必须为AJP/1.3.
minSpareThreads: 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
maxSpareThreads:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为
acceptCount
: 当现有线程已经达到最大数时,为客户请求排队.当队列中请求数超过时,后来的请求返回Connection refused错误
redirectport : 当客户请求是https时,把该请求转发到端口8443去,若连接器不支持SSL,如收到SSL请求,Catalina容器将会自动重定向到指定的端口号,让其处理。
enableLookups:若设为true,表示支持域名解析,把IP地址解析为主机名,false返回IP地址.WEB应用中调用request.getRemoteHost方法执行DNS查询返回客户机主机名.默认值为true。
connectionTimeout:定义建立客户连接超时的时间,以毫秒为单位,默认为60000=60秒,如果为-1,表示不限制建立客户连接的时间
allowTrace:是否允许HTTP的TRACE方法,默认为false
emptySessionPath:如果设置为true,用户的所有路径都将设置为/,默认为false。
maxPostSize:指定POST方式请求的最大量,没有指定默认为2097152。
proxyName:如这个连接器正在一个代理配置中被使用,指定这个属性,在request.getServerName()时返回
scheme:设置协议的名字,在request.getScheme()时返回,SSL连接器设为”https”,默认为”http”
secure:在SSL连接器可将其设置为true,默认为false
URIEncoding:用于解码URL的字符编码,没有指定默认值为ISO-8859-1
useBodyEncodingForURI:主要用于Tomcat4.1.x中,指示是否使用在contentType中指定的编码来取代URIEncoding,用于解码URI查询参数,默认为false
xpoweredBy:为true时,Tomcat使用规范建议的报头表明支持Servlet的规范版本,默认为false
bufferSize:设由连接器创建输入流缓冲区的大小,以字节为单位。默认情况下,缓存区大的大小为2048字节
compressableMimeType:MIME的列表,默认以逗号分隔。默认值是text/html,text/xml,text/plain
compression:指定是否对响应的数据进行压缩。off:表示禁止压缩、on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off
disableUploadTimeOut:允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
maxHttpHeaderSize:HTTP请求和响应头的最大量,以字节为单位,默认值为4096字节
maxKeepAliveRequest:服务器关闭之前,客户端发送的流水线最大数目。默认值为100
socketBuffer:设Socket输出缓冲区的大小(以字节为单位),-1表示禁止缓冲,默认值为9000字节
toNoDelay:为true时,可以提高性能。默认值为true
threadPriority:设JVM中请求处理线程优先级。默认值为NORMAL-PRIORITY

  AJP连接器:

  用于将Apache与Tomcat集成在一起,当Apache接收到动态内容请求时,通过在配置中指定的端口号将请求发送给在此端口号上监听的AJP连接器组件。

  在共享模式中,Tomcat扮演着对web服务器如Apache httpd、Nginx和微软的IIS支撑的角色。这里web服务器充当客户端通过Apache模块或者通过dll格式ISAPI模块来和Tomcat通信。当该模块判定一个请求需要传入Tomcat处理时,它将使用AJP协议来与Tomcat通信,该协议为二进制协议,在web服务器和Tomcat通信时比基于文本的Http协议更高效。  

<!—Define an AJP1.3 Connector on port 8089-->
<Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
<Connection port="8009" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" /> backlog:当所有可能的请求处理线程都在使用时,队列中排队的请求最大数目。默认为10,当队列已满,任何请求都将被拒绝
maxSpareThread:允许存在空闲线程的最大数目,默认值为50
maxThread:支持的最大并发连接数,默认值为200
minSpareThreads:设当连接器第一次启动时创建线程的数目,确保至少有这么多的空闲线程可用,默认值为4
port:服务端套接字的TCP端口号,默认值为8089(必须)
topNoDelay:为true时,可以提高性能,默认值为true
soTimeout:超时值

  

  SSL连接器:

下面定义了一个多属性的SSL连接器:
debug="0" 不启动调试模式 ;
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThread="75" enableLookups="false"
acceptCount="100" debug="0" scheme="HTTPs" secure="true" clientAuth="false" sslProtocol="TLS"/>
 <Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true" 
    maxThreads="150" scheme="https" secure="true" 
    clientAuth="false" sslProtocol = "TLS" 
    address="0.0.0.0" 
    keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks" 
    keystorePass="changeit" />

 其中,keystoreFile为证书位置,keystorePass为证书密码

  以下属性在标准的Connector(NIO, NIO2 和 APR/native)中有效 

acceptCount : 当最大请求连接maxConnections满时的最大排队大小,默认100。
         注意此属性和Executor中属性maxQueueSize的区别.
         这个指的是请求连接满时的堆栈大小,
         Executor的maxQueueSize指的是处理线程满时的堆栈大小
connectionTimeout:定义建立客户连接超时的时间,以毫秒为单位,默认为60000=60秒,如果为-1,表示不限制建立客户连接的时间
executor:指定配置的线程池名称
keepAliveTimeout:keeAlive超时时间,默认值为connectionTimeout配置值.-1表示不超时
maxConnections:最大连接数,连接满时后续连接放入最大为acceptCount的队列中. 对 NIO和NIO2连接,默认值为10000;对 APR/native,默认值为8192
maxThreads:支持的最大并发连接数,如果指定了Executor, 此属性忽略;否则为Connector创建的内部线程池最大值,默认200
minSpareThreads如果指定了Executor, 此属性忽略;否则为Connector创建线程池的最小活跃线程数,默认10
processorCache:协议处理器缓存Processor对象的大小,-1表示不限制.
          当不使用servlet3.0的异步处理情况下:
            如果配置Executor,配置为Executor的maxThreads;
            否则配置为Connnector的maxThreads.
          如果使用Serlvet3.0异步处理, 取maxThreads和maxConnections的最大值

4. Excutor组件

  Executor表示可以在Tomcat中的组件之间共享的线程池。 

<Service name="xxx">
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="300" minSpareThreads="25"/>
</Service> className: 这个类必须实现org.apache.catalina.Executor接口。默认 org.apache.catalina.core.StandardThreadExecutor
name : 线程池名称。要求唯一, 供Connector元素的executor属性使用
namePrefix: 线程名称前缀。
maxThreads: 最大活跃线程数。默认200
minSpareThreads: 最小活跃线程数。默认25
maxIdleTime: 当前活跃线程大于minSpareThreads时,空闲线程关闭的等待最大时间。默认60000ms
maxQueueSize: 线程池满情况下的请求排队大小。默认Integer.MAX_VALUE

5. 容器Engine组件

  Engine元素表示与特定的Catalina服务相关联的整个请求处理机器。它接收并处理来自一个或多个连接器的所有请求,并将完成的响应返回给连接器,以便最终传输回客户端。 

<Engine name=”Catalina” defaultHost=”localhost”>
defaultHost: 默认主机名,用于标识将处理指向此服务器上主机名称但未在此配置文件中配置的请求的主机。这个名字必须匹配其中一个嵌套的主机元素的名字属性。
name: 此引擎的逻辑名称,用于日志和错误消息。在同一服务器中使用多个服务元素时,每个引擎必须分配一个唯一的名称。

6. 容器Host组件

  Tomcat支持基于FQDN的虚拟主机,,位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机

  Host元素表示一个虚拟主机,它是一个服务器的网络名称(如“www.mycompany.com”)与运行Tomcat的特定服务器的关联。 

虚拟主机定义示例:
<Engine name=”Catalina” defaultHost=”localhost”>
<Host name=”localhost” appBase=”webapps” unpackWARs=”true” autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”>
<Context path=”” docBase=”ROOT”/>
<Context path=”/bbs” docBase=”/web/bss” reloadable=”true” crossContext=”true”/> #path定义在defaultHost之后
</Host> <Host name=”mail.magedu.com” appBase=”/web/mail”>
<Context path=”” docBase=”ROOT”/>
</Host>
</Engine> 主机别名定义:如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义,如下:
<Host name=”www.ttlsa.com” appBase=”webapps” unpackWARs=”true”>
<Alias>feiyu.com</Alias>
</Host> name: 名称,用于日志输出
appBase: 虚拟主机对应的应用基础路径(Host的webapps目录);可以是个绝对路径, 或CATALINABASE相对路径||xmlBase|虚拟主机XML基础路径,里面应该有Contextxml配置文件
createDirs 当appBase和xmlBase不存在时,是否创建目录 默认为true
autoDeploy: 是否周期性的检查appBase和xmlBase并deploy web应用和context描述符,默认为true
deployIgnore: 忽略deploy的正则
deployOnStartup: Tomcat启动时是否自动deploy,默认为true
failCtxIfServletStartFails: 配置为true情况下,任何load-on-startup >=0的servlet启动失败,则其对应的Contxt也启动失败,默认为false
unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

7. 容器Context组件

  Context元素表示一个Web应用程序,它在特定的虚拟主机中运行。每个Web应用程序都基于Web应用程序存档(WAR)文件,或者包含相应的解包内容的相应目录,如Servlet规范中所述。

<!– Tomcat Root Context –>
<Context path=”” docBase=”/web/webapps”/> <!– buzzin webapp –>
<Context path=”/bbs” docBase=”/web/threads/bbs” reloadable=”true”> </Context> <!– chat server –>
<Context path=”/chat” docBase=”/web/chat”/> <!– darian web –>
<Context path=”/darian” docBase=”darian”/> altDDName: web.xml部署描述符路径,默认 /WEB-INF/web.xml
docBase: Context的Root路径,和Host的appBase相结合, 可确定web应用的实际目录
failCtxIfServletStartFails: 同Host中的failCtxIfServletStartFails, 只对当前Context有效,默认为false
logEffectiveWebXml: 是否日志打印web.xml内容(web.xml由默认的web.xml和应用中的web.xml组成),默认为false
path: web应用的context path,如果为根路径,则配置为空字符串(""), 不能不配置
privileged: 是否使用Tomcat提供的manager servlet
reloadable:/WEB-INF/classes/ 和/WEB-INF/lib/ 目录中class文件发生变化是否自动重新加载,默认为false
swallowOutput: true情况下, System.out和System.err输出将被定向到web应用日志中,默认为false 

8. 嵌套Realm组件 

  一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。 

下面是一个常见的使用UserDatabase的配置:
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm” resourceName=”UserDatabase”/> 下面是一个使用JDBC方式获取用户认证信息的配置:
<Realm className=”org.apache.catalina.realm.JDBCRealm” debug=”99″
driverName=”org.gjt.mm.mysql.Driver”
connectionURL=”jdbc:mysql://localhost/authority”
connectionName=”test”
connectionPassword=”test”
userTable=”users”
userNameCol=”user_name”
userCredCol=”user_pass”
userRoleTable=”user_roles”
roleNameCol=”role_name” /> 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实现;

9. 嵌套Valve组件

  Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。

Tomcat6中实现了多种不同的Valve:
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则实现了仅允许本机访问/probe: <Context path=”/probe” docBase=”probe”>
<Valve className=”org.apache.catalina.valves.RemoteAddrValve” allow=”127\.0\.0\.1″/>
</Context> 其中相关属性定义有:
1) className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
2) allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny;
3) deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;

10. 嵌套GlobalNamingResources组件

  应用于整个服务器的JNDI映射,此可以避免每个Web应用程序都需要在各自的web.xml创建,这在web应用程序以WAR的形式存在时尤为有用。

  它通常可以包含三个子元素:Environment,Resource、ResourceEnvRef。

11. 嵌套WatchedResource组件

  WatchedResource可以用于Context中监视指定的webapp程序文件的改变,并且能够在监视到文件内容发生改变时重新装载此文件。

12. 嵌套Listener组件

  Listener用于创建和配置LifecycleListener对象,而LifecycleListener通常被开发人员用来创建和删除容器,监听生命周期。

13. 嵌套Loader组件

  Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖的类。Loader可以用于Context中控制java类的加载。

14. 嵌套Manager组件

  Manger对象用于实现HTTP会话管理的功能,Tomcat6中有5种Manger的实现:

  1) StandardManager:Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。

  2) PersistentManager:当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来说比较有用。

  3)DeltaManager:用于Tomcat集群的会话管理器,它通过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将所有会话的改变同步给集群中的每一个节点,也是在集群环境中用得最多的一种实现方式。

  4)BackupManager:用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同步给集群中的另一个而非所有节点。

  5)SimpleTcpReplicationManager:Tomcat4时用到的版本,过于老旧了。

15. 嵌套Stores组件

  PersistentManager必须包含一个Store元素以指定将会话数据存储至何处。这通常有两种实现方式:FileStore和JDBCStore。

16. 嵌套Resources组件

  经常用于实现在Context中指定需要装载的但不在Tomcat本地磁盘上的应用资源,如Java类,HTML页面,JSP文件等。

17. 嵌套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中配置同一通信信道上节点集群组中的成员情况,即监控加入当前集群组中的节点并在各节点间传递心跳信息,而且可以在接收不到某成员的心跳信息时将其从集群节点中移除。Tomcat6中Membership的实现是org.apache.catalina.tribes.membership.McastService。

  Sender:用于Channel中配置“复制信息”的发送器,实现发送需要同步给其它节点的数据至集群中的其它节点。发送器不需要属性的定义,但可以在其内部定义一个Transport元素。

  Transport:用于Sender内部,配置数据如何发送至集群中的其它节点。Tomcat6有两种Transport的实现:

    1) PooledMultiSender:基于Java阻塞式IO,可以将一次将多个信息并发发送至其它节点,但一次只能传送给一个节点。

    2)PooledParallelSener:基于Java非阻塞式IO,即NIO,可以一次发送多个信息至一个或多个节点。

  Receiver:用于Channel定义某节点如何从其它节点的Sender接收复制数据,Tomcat6中实现的接收方式有两种BioReceiver和NioReceiver。

 

参考网址

  1. Tomcat 快速入门
  2. 详解Tomcat 配置文件server.xml
  3. Tomcat中server.xml配置详解
  4. Tomcat 详解
  5. tomcat组件及原理详细分析
  6. tomcat架构

Tomcat系列(5)——Tomcat配置详细部分的更多相关文章

  1. Tomcat系列(4)——Tomcat 组件及架构详细部分

    核心部分   1. 定义 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta ...

  2. Tomcat系列(1)——Tomcat安装配置

    核心步骤 1. 安装JAVA(因为tomcat依赖于java) 配置:JAVA_HOME D:\Program Files (x86)\Java\jdk1.7.0 path  %JAVA_HOME%\ ...

  3. Tomcat系列(10)——Tomcat主要设计模式5种(外观,责任链,观察者,模板方法,命令模式)

    核心部分 外观模式: RequestFacade应用门面模式(facade)来封装HttpServletRequest. 观察者模式: 事件监听机制,控制组件生命周期的 Lifecycle .Serv ...

  4. Tomcat系列(9)——Tomcat 6方面调优(内存,线程,IO,压缩,缓存,集群)

    核心部分 内存 线程 IO 压缩 缓存 集群 一.JVM内存优化 Tomcat内存优化,包括内存大小,垃圾回收策略. Windows 下的catalina.bat,Linux 下的catalina.s ...

  5. Tomcat系列(6)——Tomcat处理一个HTTP请求的过程

    Tomcat的架构图   图三:Tomcat Server处理一个HTTP请求的过程 处理HTTP请求过程 假设来自客户的请求为:http://localhost:8080/test/index.js ...

  6. Tomcat系列(3)——Tomcat 组件及架构核心部分 4类主要组件(顶层,连接器,容器,嵌套)

    1.架构图 2. 定义 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta ...

  7. tomcat下的日志配置详细说明

    #可配置项(5类日志):catalina.localhost.manager.admin.host-manager handlers = 1catalina.org.apache.juli.FileH ...

  8. Tomcat系列(2)——Tomcat文件目录7个

    核心部分 bin (运行脚本) conf (配置文件) lib (核心库文件) logs (日志目录) temp (临时目录) webapps (自动装载的应用程序的目录) work (JVM临时文件 ...

  9. Tomcat系列(11)——Tomcat 部署web应用的4种方法

    核心内容 1.在Tomcat中有四种部署Web应用的方式,分别是: (1)利用Tomcat自动部署(项目直接拷贝OR WAR包拷贝 到webapps下) (2)利用控制台进行部署(tomcat的man ...

随机推荐

  1. vue echarts map的使用,页面多图动态自适应

    最近在vue中使用echarts时,遇到了一些坑,在此记录一下. 1:echarts map的使用 2:页面多图自适应,只有一个图生效 3:根据设备的dpr,动态的修改了meta标签中的initial ...

  2. android开发中调用python代码(带参数)

    android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法, ...

  3. Winserver-默认以管理员运行程序

    打开secpol.msc 打开本地安全策略找到安全设置--本地策略--安全选项用户账户控制:以管理员批准模式运行所有管理员---改为禁用保存设置重启电脑

  4. C#自定义控件添加到工具箱

    1.在需要使用这个自定义控件的项目中,在引用中,右键,添加引用,浏览,找到dll(如:ComButton.dll),进行添加,这时候,控件应该是能够自动添加到工具箱的. 2.在Visual Studi ...

  5. WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  6. 利用ZYNQ SOC快速打开算法验证通路(6)——LWIP实现千兆TCP/IP网络传输

    一.前言 之前ZYNQ与PC之间的网络连接依赖于外接硬件协议栈芯片,虽然C驱动非常简单,但网络带宽受限.现采用LWIP+PS端MAC控制器+PHY芯片的通用架构.关于LWIP库,已经有很多现成的资料和 ...

  7. 一天一个Linux命令--nmcli

    nmcli命令连接和删除SSID nmcli d wifi                                                                        ...

  8. day20 hashlib、hmac、subprocess、configparser模块

    hashlib模块:加密 import hashlib# 基本使用cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8'))print(cipher.h ...

  9. 在Bootstrap开发框架中使用Grid++报表

    之前在随笔<在Winform开发中使用Grid++报表>介绍了在Winform环境中使用Grid++报表控件,本篇随笔介绍在Bootstrap开发框架中使用Grid++报表,也就是Web环 ...

  10. 【C语言】位运算

    编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: ...