目录
当前位置: 首页 > 教程 > Tomcat >

Tomcat体系结构

精华
小牛编辑
146浏览
2023-03-14

Tomcat的体系结构由一系列功能组件组成。

这些功能组件在每个Tomcat服务器安装目录中定义,具体来说放在Tomcat的安装文件夹的/conf子目录下,有个命名为server.xml的文件。下面我们来详细讨论这些组件的作用。

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

让我们从内到外讨论server.xml文件的功能组件。

1.1 Context(上下文)

Context是server.xml文件中最里面的元素,它表示单个Web应用程序。Tomcat在加载应用程序时自动实例化并配置标准Context上下文。另外,Tomcat还将加载在Web应用下\WEB-INF\web.xml文件中定义的配置,并使这些配置可用于应用程序。

1.2 Connector(连接器)

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

Tomcat的默认配置包括一个用于处理HTTP通信的连接器。默认情况下,此连接器等待通过端口8080发出的请求。这就是Tomcat默认欢迎页面的访问URL为http://localhost:8080/的原因。请注意,对所有应用程序的请求都通过此连接器的单个实例进行。每个新请求都会创建一个新线程,该新线程在请求​​期间将保持活动状态。

Connector的connectionTimeout属性值为20000,表示会话超时时长为5小时33分钟,或者不活动后的20秒后终止,而redirectPort="8443"配置意味着,需要安全套接字层(SSL)输送到来的请求被重定向到端口8443。

AJP连接器使Tomcat只处理动态网页,而让纯HTML服务器(例如Apache Web服务器)处理对静态页面的请求。这样可以最大程度地处理请求。您可能可以注释掉此连接器,因为tomcat本身今天非常快,或者仅当您不打算将Web服务器与Tomcat一起使用时,才可以对其进行注释。

1.3 Host(主机)

Host(主机)是网络名称(例如,www.xnip.cn)与Tomcat服务器的关联。Host中可以包含多个Context上下文(即Web应用程序)。您可以在同一服务器上定义多个Host主机。例如,如果您已经注册了域名xnip.cn,则可以定义主机名,例如tools.xnip.cn和book.xnip.cn。请记住,只有当域名服务器将其名称映射到计算机的IP地址时,才可以从互联网上访问它。

Tomcat的默认配置包括名为localhost的主机。本地主机域名和IP的关联可以在这个系统文件中修改:C:\Windows\System32\drivers\etc\hosts。

Host的appBase属性,定义了Tomcat安装文件夹中的应用程序目录。然后,每个应用程序通过该目录中的路径进行标识。唯一的例外是路径ROOT,该路径已映射到空字符串。本地主机的应用程序根目录是webapps。这意味着目录“"C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\ROOT\" 中的应用程序由空字符串标识。因此,其URL为"http://localhost:8080/"。对于存放在ROOT以外的目录中的其他应用程序,如“"C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\myapp\",URL类似于"http://localhost:8080/myapp/"。

unpackWARs ="true"属性表示,如果将WAR文件存放到appBase目录中,Tomcat将自动将其解压。如果将此属性设置为false,则应用程序将直接运行该WAR文件。但是,因为以WAR文件方式运行的访问速度较慢,所以通常Tomcat需要在执行时解压缩WAR文件,意味unpackWARs 属性值为true。

autoDeploy ="true"属性表示,如果appBase在Tomcat运行时将应用程序存放到目录中,它将自动进行部署。

1.4 Engine(引擎)

Engine(引擎)代表特定服务的请求处理管道。由于服务可能具有多个连接器,因此引擎会接收并处理来自这些连接器的所有请求,并将响应传递回适当的连接器以传输给客户端。

引擎必须包含一个或多个主机,其中一个主机被指定为默认主机。Tomcat的默认配置包括引擎Catalina,该引擎包含主机localhost(显然是默认主机,因为它是唯一的主机)。Catalina引擎处理通过HTTP连接器收到的所有传入请求,并发回相应的响应。它根据请求标头中包含的信息将每个请求转发到正确的主机和上下文。

1.5 Service(服务)

Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。

用户很少修改Service元素,因为默认实现很简单并且足够。

1.6 Server(服务器)

Server(服务器)是最重要的组件,代表Tomcat的实例。Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。

Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。

1.7 Listener(监听器)

Listener(侦听器)是一个Java对象,通过实现org.apache.catalina.LifecycleListener接口,可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止。。

  • AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成。
  • JasperListener:在Web应用启动之前初始化Jasper,Jasper是JSP引擎,把JVM不认识的JSP文件解析成java文件,然后编译成class文件供JVM使用。
  • JreMemoryLeakPreventionListener:与类加载器导致的内存泄露有关。
  • GlobalResourcesLifecycleListener:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。
  • ThreadLocalLeakPreventionListener:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。

1.8 GlobalNamingResources与Realm

Engine组件下定义了Realm组件:

<Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
</Realm>

Realm,可以把它理解成“域”;Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用。在本例中,Realm的配置使用name为UserDatabase的资源实现。而该资源在Server元素中使用GlobalNamingResources配置:conf/tomcat-users.xml。

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

GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的。