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 "%r" %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, IIS, Nginx等;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%in目录下。 下载地址是: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:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200
acceptCount : 当现有线程已经达到最大数75时,为客户请求排队.当队列中请求数超过100时,后来的请求返回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"/>
其中,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。