Tomcat – 架构以及 server.xml 配置

Tomcat – 架构以及 server.xml 配置

原文地址:Tomcat – Architecture and server.xml configuration

Tomcat的架构

Tomcat 的架构由一系列按妥善定义的规则所结合的功能组件构成。
Tomcat的结构
每个Server实例的结构,都由在位于Tomcat安装路径下、/conf子路径中的文件 server.xml 中定义。现在讨论这些组件的细节。

server.xml

默认情况下, server.xml 文件有以下配置,让我们现在详细地研究。先看一下文件中的完整内容。

<?xml version='1.0' encoding='utf-8'?>

<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>

现在从 tomcat 配置文件里的功能组件,由内而外地进行探讨,以更好地建立它们之间的关系。

上下文 Context

上下文是一组称为容器(containers)的Tomcat 组件中、位于最内层的元素;它对应着一个网页应用。
Tomcat自动地在加载你的应用过程中进行实例化、并配置一个标准的上下文。作为配置的一部分,Tomcat也读取在你应用路径下 \WEB-INF\web.xml 文件中定义的属性,让它们对此应用有效。

连接器 Connector

连接器(Connector)处理与客户端之间的连接。Tomcat有几种可用的连接器,例如:用于大部分HTTP访问的HTTP连接器;实现了AJP协议、在将Tomcat与另一个像是Apache HTTPD服务器的网页服务连接时,使用的AJP连接器。

Tomcat 默认的配置里,包括了一个处理 HTTP 通信的连接器。默认情况下,这个连接器等待来自8080端口的请求。这就是我们的示例中总是从 http://localhost:8080/ 开始的原因。

注意,对于所有应用的请求,都通过这个连接器的单一实例。每个新的请求会导致一个新线程建立;线程在整个请求期间,于连接器中保持存活。网络上关于Tomcat的文章通常将此连接器称呼为 “Coyote” 。

连接的超时(Timeout)属性设置为20,000代表一个会话在交互了5小时33分钟20秒后终止;重定向端口(redirectPort)设置为“8443”代表要求安全套接字传输的来访请求,会被重定向到8443端口。

AJP连接器让Tomcat仅处理动态网页,让纯HTML服务器(例如,Apache Web Server)处理对静态页面的请求。这最大化了请求被处理的效率。在Tomcat自身速度已经相当快的今天,你可以注释这个连接器。

宿主 Host

一个宿主,是一个形如 www.yourdomain.com 的网络名称,与 Tomcat 服务器之间的关联关系。 一个宿主可以包含任意数量的上下文(即应用)。你可以在同一个服务器上定义多个宿主。例如,如果你已经注册了域 yourdomain.com ,你可以定义宿主名称为 w1.yourdomain.com,以及 w2.yourdomain.com。记住,只有当域名解析服务器将这些名称与你的电脑IP地址进行了映射,这些地址在互联网上才可以访问。

Tomcat 的默认配置包括了名为 localhost 的宿主。要在 file C:\Windows\System32\drivers\etc\hosts 文件中写入一行记录,以建立 localhost 与你电脑之间的关联。

宿主的“appBase”属性定义了在Tomcat安装位置中,应用所在的目录。每个应用被它在目录下的路径所标识。唯一的例外是路径 ROOT ,这被映射到空字符串。应用在 localhost 的基本目录是 webapps。这代表在目录“C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\”下的应用被空字符串所标识。因此,它的URL就是“ http://localhost:8080/ ” 。对于存在于非 ROOT 的其它路径下的其它应用,比如“ C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\myapp\ ”,其URL就会是 “http://localhost:8080/myapp/ ”。

unpackWARs属性设置为“ true ”,表示如果你在 appBase 路径下放入一个 WAR 文件,Tomcat 会自动地展开它为一个普通的目录。如果你设置该属性为 false ,应用会直接从 WAR 文件开始运行。这显然意味着应用会更慢地运行,因为 Tomcat 需要在执行期间解压 WAR 文件。

autoDeploy属性设置为 true ,代表如果你在Tomcat运行期间,又在 appBase 目录中放置一个应用,它会自动地被部署。

引擎 Engine

引擎对应一个指定服务对请求的处理管线。由于一个服务可能有多个连接器,引擎从所有这些连接器接收并处理所有请求,将响应处理返回到合适的连接器,用于向客户端的传递。

一个引擎必须包含一个或多个宿主;其中一个被指定为默认宿主。默认的 Tomcat 配置包括了引擎 Catalina ,它包含了宿主 localhost (显然这是默认宿主,因为它是唯一存在的那个)。 Catalina 引擎 处理所有通过 HTTP 连接器到来的请求,并且发送回对应的响应。它以在请求头中包含的信息为基础,将每个请求转发至正确的宿主与上下文。

服务 Service

服务,是一个中间位置的组件;它存在于一个服务器中,将一个或多个连接器精确地关联到一个引擎上。 Tomcat 的默认配置中,包括了服务 Catalina ,将HTTP 和AJP 连接器关联到 Catalina 引擎。因此,连接器和引擎都是服务元素的子元素。

服务元素很少由用户定制,因为其默认的实现已经简单而高效。

服务器 Server

服务器是顶层组件,代表了一个 Tomcat 实例。它可以包含一个或多个服务,每个服务都可以有其自己的引擎与连接器。

现在,让我们讨论在上面 server.xml 文件中,出现的其它概念。

监听器 Listener

监听器是一个 通过实现 org.apache.catalina.LifecycleListener 接口的Java 对象,可以响应特定的事件。

AprLifecycleListener : 启用 the Apache Portable Runtime (APR) 库。这个库提供了操作系统层对 tomcat 的支持。
JasperListener : 启用 Jasper, 这是 JSP引擎。这个监听器让已经被更新过的JSP文档重新编译成为可能。
JreMemoryLeakPreventionListener : 处理已知的,会导致内存泄露的不同情形。
GlobalResourcesLifecycleListener : 负责实例化关联到全局 Java 命名及目录接口(JNDI)的受管对象。
ThreadLocalLeakPreventionListener : 同样用于处理已知的,会导致内存泄露的不同情形。

全局命名资源 Global Naming Resources

全局命名资源元素可以仅在服务器(Server)组件中被定义。它定义了在整个服务器可访问的JNDI资源。
在默认的 server.xml 文件中,唯一被定义的资源,是通过 conf/tomcat-users.xml 文件所定义的、 基于内存的用户及口令数据库。

区域 Realm

区域组件可以出现在任何容器组件的内部(引擎,宿主,上下文)。它代表一个用户、口令、角色的数据库。它的目的是支持基于容器的权限。

除了 UserDatabaseRealm,以下的区域类也是可用的: JDBCRealm(通过它的JDBC驱动,连接到关系型数据库),DataSourceRealm(通过JNDI,连接到一个JDBC数据源),JNDIRealm(连接到一个轻量目录读取协议(LDAP)的目录),以及MemoryRealm(在内存中加载XML文件)

阀门 Valve

阀门可以理解为拦截器:当将其插入到一个容器(上下文、宿主、或者引擎)中时,对于所有到来的HTTP请求,在其到达应用之前拦截(并进行处理)。对于指向特定应用、运行在虚拟宿主中的所有应用、或者在一个引擎里运行的所有应用的请求,你都具备了进行预处理的能力。

阀门可以有多重用途,例如:

RemoteAddrValve 让你可以基于源IP地址,选择性地允许或阻塞请求。它支持两个属性:允许(allow)和阻塞(block)。

<Valve className="org.apache.catalina.valves.RemoteAddrValve" block="192\.168.*"/>

RemoteHostValve 类似远程地址过滤,但是基于客户端的宿主名称,而不是客户端的IP地址。

<Valve className="org.apache.catalina.valves.RemoteHostValve" deny=".*badweb\.com"/>

RequestDumperValve 记录关于来访请求的细节,对于调试相当有用。

<Valve className="org.apache.catalina.valves.RequestDumperValve"/>

单点登陆(single sign on),当其在一个宿主容器中包含时,可以为宿主中的所有应用仅要求一次认证。没有这个阀门,用户需要在使用每个单独应用前,都输入他的ID和口令。

<Valve className="org.apache.catalina.valves.SingleSignOn"/>

以上即是对 server.xml 中元素的有限介绍。
祝你学习愉快!哥们!

猜你喜欢

转载自blog.csdn.net/u010930289/article/details/81051794
今日推荐