Apache Tomcat是由Apache软件基金会(ASF)开发的开源web服务器和servlet容器。Tomcat实现了几个javaee规范,包括javaservlet、javaserverpages(JSP)、javael和WebSocket,并为Java代码提供了一个“纯Java”的httpweb服务器环境。
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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
让我们从内到外讨论tomcat配置文件的功能组件,以便更好地将它们联系起来。
Context上下文
Context是一组称为容器的Tomcat组件的最内部元素,它表示单个web应用程序。Tomcat在加载应用程序时自动实例化和配置标准上下文。作为配置的一部分,Tomcat还处理\WEB-INF\web.xml中定义的属性应用程序文件夹的文件,并使其可供应用程序使用。
Connector[第16–19行]
连接器处理与客户机的通信。Tomcat有多个可用的连接器,例如用于大多数HTTP通信的HTTP连接器和实现将Tomcat连接到另一个web服务器(如Apache HTTPD服务器)时使用的AJP协议的AJP连接器。
Tomcat的默认配置包括处理HTTP通信的连接器。默认情况下,此连接器等待来自端口8080的请求。这就是为什么我们示例的url总是以http://localhost:8080/
. 请注意,所有应用程序的请求都通过此连接器的一个实例。每个新请求都会导致实例化一个新线程,该线程在请求期间在连接器中保持活动状态。
connectionTimeout
属性设置为20000表示会话在5小时33分20秒的非活动状态后终止,而redirectPort=“8443”
表示需要安全套接字层(SSL)传输的传入请求被重定向到端口8443。
AJP连接器允许Tomcat只处理动态web页面,并允许纯HTML服务器(例如apacheweb服务器)处理对静态页面的请求。这最大限度地提高了处理请求的效率。您可能会注释掉这个连接器,因为tomcat本身现在非常快,或者如果您不打算与tomcat一起使用web服务器的话。
Host[第25–30行]
Host是网络名称的关联,例如www.yourdomain.com
到Tomcat服务器。主机可以包含任意数量的上下文(即应用程序)。您可以在同一台服务器上定义多个主机。例如,如果您已注册域yourdomain.com
,可以定义主机名,例如w1.yourdomain.com
和w2.yourdomain.com
. 请记住,只有当域名服务器将其名称映射到您计算机的IP地址时,才能从Internet访问它。
Tomcat的默认配置包括名为localhost的主机。localhost和您的计算机之间的关联是通过在文件C:\Windows\System32\drivers\etc\hosts
中写入一个条目来完成的。
主机属性“appBase”定义了Tomcat安装文件夹中的应用程序目录。然后,每个应用程序通过其在该目录中的路径进行标识。唯一的例外是路径根,它被映射到空字符串。localhost的应用程序基目录是webapps。这意味着目录“C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT\
”中的应用程序由空字符串标识。因此,其URL为“http://localhost:8080/
“. 对于驻留在根目录以外的目录中的其他应用程序,如“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”
意味着如果在Tomcat运行时将应用程序放到appBase目录中,它将被自动部署。
Engine[第20行]
引擎表示特定服务的请求处理管道。由于一个服务可能有多个连接器,引擎接收并处理来自这些连接器的所有请求,将响应传递回相应的连接器以传输给客户端。
引擎必须包含一个或多个主机,其中一个被指定为默认主机。默认的Tomcat配置包括引擎Catalina,其中包含主机localhost(显然指定为默认主机,因为它是唯一的主机)。Catalina引擎处理通过HTTP连接器接收的所有传入请求,并发回相应的响应。它根据请求头中包含的信息将每个请求转发到正确的主机和上下文。
Service[第15行]
Service是一个中间组件,它位于服务器内部,并将一个或多个连接器连接到一个引擎上。Tomcat的默认配置包括Catalina服务,它将HTTP和AJP连接器与Catalina引擎相关联。因此,连接器和引擎是服务元素的子元素。
服务元素很少由用户定制,因为默认的实现是简单而充分的。
Server[第2行]
服务器是最上面的组件,它表示Tomcat的一个实例。它可以包含一个或多个服务,每个服务都有自己的引擎和连接器。
现在我们来讨论一下上面提到的其他一些概念server.xml.
Listener[第3-7行]
侦听器是一个Java对象,通过实现网址:apache.catalina.LifecycleListener
接口,能够响应特定事件。
- AprLifecycleListener:启用Apache可移植运行时(APR)库。这个库为tomcat提供操作系统级的支持。
- JasperListener:启用Jasper,它是JSP引擎。此侦听器使重新编译已更新的JSP文档成为可能。
- JreMemoryLeakPreventionListener:处理可能导致内存泄漏的不同已知情况。
- GlobalResourcesLifecycleListener:负责实例化与全局Java命名和目录接口(JNDI)关联的托管bean。
- ThreadLocalLeakPreventionListener:还处理可能导致内存泄漏的不同已知情况。
Global Naming Resources
GlobalNamingResources
元素只能在服务器组件内部定义。它定义了可在整个服务器中访问的JNDI资源。默认值中定义的唯一资源server.xml
是通过conf/tomcat文件定义的基于用户和密码内存的tomcat-users.xml
.
Realm[第21-24行]
领域组件可以出现在任何容器组件(引擎、主机和上下文)中。它表示用户、密码和用户角色的数据库。它的目的是支持基于容器的身份验证。
除了UserDatabaseRealm
之外,还提供以下领域类:jdbcream
(通过其JDBC驱动程序连接到关系数据库)、datasourcealm
(通过JNDI连接到名为JDBC的JDBC数据源)、jndiream
(连接到轻量级目录访问协议目录)和MemoryRealm
(在内存中加载XML文件)。
Valve[线路27-29]
Valve是一个类似拦截器的元素,当插入容器(上下文、主机或引擎)时,它会在所有传入的HTTP请求到达应用程序之前拦截它们。这使您能够预处理定向到特定应用程序、虚拟主机中运行的应用程序或引擎中运行的所有应用程序的请求。
Valve可以有多种用途,例如。
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"/>
当包含在主机容器中时,单点登录阀的作用是只需要对该主机的所有应用程序进行一次身份验证。如果没有这个阀门,用户必须在使用每个单独的应用程序之前输入他的ID和密码。
<Valve className="org.apache.catalina.valves.SingleSignOn"/>
这些都是为了这个有限的元素介绍里面server.xml
. 我将在将来介绍更多与tomcat服务器相关的任务/概念。
参考文献:http://tomcat.apache.org/tomcat-7.0-doc/architecture/overview.html
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1524.html
暂无评论