Tomcat 之 架构和server.xml配置

我们已经了解在服务器上部署Web应用程序并通过浏览器进行访问时,Web服务器通常如何工作。现在让我们学习服务器内部可能在日常工作中不会使用的东西,但是当您初次配置应用程序时,它们肯定会为您提供帮助。我长期以来一直在使用tomcat服务器,因此我将其用作教程。将来,只要时间允许,我将尝试在其他服务器上分享我的经验。

Apache Tomcat是由Apache Software Foundation(ASF)开发的开源Web服务器和servlet容器。Tomcat的器具几个Java EE规范包括的Java Servlet,JavaServer页面(JSP), Java EL,和WebSocket的,并提供了一个“纯Java” HTTP的Java代码运行在web服务器环境。[维基 ]

Tomcat的架构

Tomcat的体系结构由一系列功能组件组成,可以根据定义明确的规则进行组合。

Tomcat架构
Tomcat架构

(通过这些功能组件)每个服务器安装的结构在文件中定义,该文件server.xml位于Tomcat的安装文件夹/conf子目录中。让我们详细讨论这些组件。

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配置文件的功能组件,以更好地关联事物。

语境

上下文是一组称为容器的Tomcat组件的最内部元素,它表示单个Web应用程序。Tomcat在加载应用程序时自动实例化并配置标准上下文。作为配置的一部分,Tomcat还处理在\WEB-INF\web.xml应用程序文件夹的文件中定义的属性,并使它们可用于应用程序。

连接器[16-19行]

连接器处理与客户端的通信。 Tomcat有多个连接器,例如用于大多数HTTP通信的HTTP连接器和AJP连接器,该连接器实现了将Tomcat连接到另一个Web服务器(例如Apache HTTPD服务器)时使用的AJP协议。

Tomcat的默认配置包括一个用于处理HTTP通信的连接器。默认情况下,此连接器等待通过端口8080发出的请求。这就是我们示例的网址始终以开头的原因http://localhost:8080/。请注意,对所有应用程序的请求都通过此连接器的单个实例。每个新请求都会导致实例化一个新线程,该新线程在请求​​期间将保持活动状态。Internet上有关Tomcat的文章通常将此连接器称为“ Coyote”。

connectionTimeout属性集至20,000表示会话为5小时,33分钟,和不活动的20秒后终止,而redirectPort =” 8443“意味着,需要安全套接字层(SSL)输送到来的请求被重定向到端口8443。

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

主持人[第25-30行]

主机是网络名称(例如,www.yourdomain.com)与Tomcat服务器的关联。主机可以包含任意数量的上下文(即应用程序)。您可以在同一服务器上定义多个主机。例如,如果您已经注册了域yourdomain.com,则可以定义主机名,例如w1.yourdomain.comw2.yourdomain.com。请记住,只有当域名服务器将其名称映射到计算机的IP地址时,才可以从Internet访问它。

Tomcat的默认配置包括名为localhost的主机本地主机和您的计算机之间的关联是通过在文件中写入一个条目来完成的C:\Windows\System32\drivers\etc\hosts

Host属性“ appBase ”定义了Tomcat安装文件夹中的应用程序目录。然后,每个应用程序通过该目录中的路径进行标识。唯一的例外是路径ROOT,该路径已映射到空字符串。本地主机的应用程序基本目录是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”表示,如果将WAR文件拖放到appBase目录中,Tomcat将自动将其扩展到普通文件夹中。如果将此属性设置为false,则应用程序将直接从WAR文件运行。这显然意味着应用程序的执行速度较慢,因为Tomcat需要在执行时解压缩WAR文件。

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

引擎[第20行]

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

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

服务[第15行]

服务是服务器内部的一个中间组件,将一个或多个连接器与一个引擎紧密相连。Tomcat的默认配置包括服务Catalina,该服务将HTTP和AJP连接器与Catalina引擎相关联。因此,连接器和引擎是Service元素的子元素。

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

服务器[第2行]

服务器是最重要的组件,代表Tomcat的实例。它可以包含一个或多个服务,每个服务都有自己的引擎和连接器。

现在让我们讨论上面使用的其他一些概念server.xml

听众[3-7行]

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

  • AprLifecycleListener:启用Apache可移植运行时(APR)库。该库为tomcat提供了操作系统级别的支持。
  • JasperListener:启用Jasper,它是JSP引擎。该侦听器使重新编译已更新的JSP文档成为可能。
  • JreMemoryLeakPreventionListener:处理可能导致内存泄漏的各种已知情况。
  • GlobalResourcesLifecycleListener:负责实例化与全局Java命名和目录接口(JNDI)相关联的托管Bean。
  • ThreadLocalLeakPreventionListener:还处理可能导致内存泄漏的各种已知情况。

全球命名资源

GlobalNamingResources元素只能在Server组件内部定义。它定义了可在整个服务器上访问的JNDI资源。默认情况下定义的唯一资源server.xml是通过file定义的基于用户和密码内存的数据库conf/tomcat-users.xml

境界[21-24行]

Realm组件可以出现在任何容器组件(Engine,Host和Context)内。它代表用户,密码和用户角色的数据库。其目的是支持基于容器的身份验证。

此外UserDatabaseRealm,还提供以下领域类:(JDBCRealm用于通过其JDBC驱动程序连接到关系数据库),DataSourceRealm(用于连接通过JNDI命名的JDBC数据源),JNDIRealm(用于连接到轻型目录访问协议目录)和MemoryRealm(在内存中加载XML文件)。

阀门[27-29行]

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 valve,包括在主机容器中时,有需要一种身份验证该主机的所有应用程序的影响。如果没有此阀,则用户必须在使用每个单独的应用程序之前输入其ID和密码。

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

仅此而已server.xml。将来我将介绍与tomcat服务器有关的更多任务/概念。

saigon has written 1440 articles

Leave a Reply