nescafeboy1 发表于 2017-1-22 11:03:13

Tomcat架构和server.xml

Tomcat实质上是Web服务器,执行Java servlet的应用程序,将JSP页面和文档转换为Java servlet的应用程序。Tomcat的最新版本是运行在 Java SE 5上的6.0.14,它实现了Servlet 2.5和JSP 2.1规范并且支持UEL。代码清单7-1 默认的server.xml图7-1所示为主要Tomcat组件是如何分层组织的。上下文(Context)Context是一组被叫做容器的Tomcat组件中的最里层元素,它代表单个Web应用程序。Tomcat会自动实例化并配置一个标准context以着手加载你的应用程序。Tomcat也会处理在应用程序文件夹下WEB-INF\web.xml文件中定义的特性,使它们可被应用程序所用。连接器Connector是一个与处理引用程序和客户端(像远程浏览器)之间通信的TCP端口相关联的组件。Tomcat的默认配置包括一个处理HTTP通信的连接器。http://localhost:8080/。所有应用程序的请求都是通过一个连接器实例处理的,每个新请求都会导致在连接器内实例化一个新线程,在请求存在的整个过程中这个线程都会保持激活状态。默认情况下tomcat还定义了另一个连接器 ——Apache JServ Protocol(AJP)——用来和类似于Apache HTTP server这样的Web服务器通信。这个连接器允许Tomcat只处理动态Web页面,并允许纯HTML服务器(像Apache Web Server)来处理静态页面请求。主机Host容器代表一个虚拟主机,www.myDomain.com这样的名称和服务器关联起来。一个主机可以包含任意数量的上下文(也就是应用程序)。同一服务器上可以定义多个主机。Host的appBase属性定义了在Tomcat安装文件夹中的应用程序目录。然后,每个应用程序将其在此目录下的路径作为标识符。唯一的例外是路径ROOT,它被映射到空字符串。对于 localhost来说,应用程序的基本目录为webapps。这意味着在下面目录中的应用程序:是由空字符串标识的。因此,它的URL是http://localhost:8080/。你也可以为appBase赋一个绝对路径。属性unpackWARs="true"代表如果你在appBase目录中放入一个WAR文件,Tomcat会自动将其展开为标准文件夹。如果你将该属性设置为false,应用程序会直接从WAR文件运行。这显然会减慢应用程序的执行速度,因为在其执行时需要解压缩。属性autoDeploy="true"代表如果你在Tomcat运行时向appBase中放入一个应用程序,这个应用程序会自动部署。实际上,这个定义是多余的,因为autoDeploy的默认值就是true。属性xmlValidation="false"和 xmlNamespaceAware="false"涉及到了在主机中用到的web.xml文件。如果你将xmlValidation设置为true而将 xmlNamespaceAware设置为false,将会限制验证因为DTD/schema会被忽略。我们建议你将两个属性都设置为false。你最好是使用像Eclipse这样的工具来检查XML,它们可以提前告诉你问题的所在,而不是依靠Tomcat在运行时显示堆栈跟踪信息。引擎Engine是最高级别的容器。可以包含多个主机但不能被任何其他的容器组件包含。一个引擎必须包含一个或多个主机,其中一个被指定为默认主机。Tomcat默认配置包括引擎Catalina,其中包含主机localhost。Catalina引擎处理通过HTTP连接器接收的所有传入请求,并返回相应的响应。它以请求头中包含的信息为基础,将每个请求转到正确的主机和上下文中。Catalina引擎就是servlet引擎。服务Service组件的目的是将一个或多个连接器关联到特定的引擎上。Tomcat默认设置中包括服务Catalina,用于把HTTP和AJP连接器关联到Catalina引擎上。因此,Connector和Engine是Service元素的子元素。服务器Server是代表Tomcat实例的顶级组件。它可以包含一个或多个服务,每个服务有自己的引擎和连接器。监听器Listener是一个实现了org.apache.catalina.LifecycleListener接口的Java对象,它能够对确定的事件做出响应。第一个监听器用于启用Apache可移植运行库(Apache Protable Runtime,APR)。这个程序库提供的功能整合了操作系统(对我们来说就是Microsoft Windows)所提供的功能。它的目的是增加跨操作系统的可移植性。这个程序包中的一个功能是,当SSLEngine属性设置为on时(这是默认设置)支持OpenSSL。第二个监听器用于启用JSP引擎Jasper。例如,这个监听器使得重编译被更新的JSP文档成为可能。第三个监听器用于启用Java管理扩展(Java Management Extensions,JMX)。这是包含在Java SE中的一项技术,它使得远程监控管理系统对象、应用程序、网络和设备成为可能。第四个也是最后一个监听器用于启用全局资源。例如,它使我们在Eshopf中使用JNDI访问MySQL数据库成为可能(见代码清单5-19)。最主要的是这些监听器改进或提供了一些Tomcat功能,因此应该保持原封不动。全局命名资源GlobalNamingResources元素只能定义在Server组件中。它定义的JNDI资源在整个服务器上都是可用的。包含在默认server.xml中的唯一资源是通过文件conf/tomcat-users.xml定义的用户密码内存数据库。领域Realm组件可以出现在任何容器组件(Engine、Host和Context)里面。它代表一个用户、密码和用户角色的数据库,其作用是支持基于容器的认证。换句话说,你可以为每个应用程序、主机或者引擎制定一个认证数据库。在默认的server.xml中定义的唯一领域位于Catalina引擎中(见代码清单7-1第19~20行)。它指向了被定义为JNDI全局资源的用户数据库。除了UserDatabaseRealm,还有下列领域类:JDBCRealm(通过JDBC驱动连接一个关系数据库)、DataSourceRealm(连接一个通过JNDI指定的JDBC数据源)、 JNDIRealm(连接一个LDAP目录)和MemoryRealm(加载一个XML文件到内存中)。集群Tomcat通过以下3种功能提供服务器集群。跨越集群服务器复制会话。确保在一个服务器上打开的会话在所有其他服务器上都有效复制上下文属性。这使得你在所有的服务器上访问上下文属性成为可能。通过WAR文件集群范围部署。确保同一个应用程序在一个集群的所有服务器上执行。你可以将Cluster元素放在Engine或Host容器中。阀门Valve是一个元素,当将其插入到一个 Container(Context、Host或者Engine)中时,会在所有传入HTTP请求到达应用程序之前拦截住它们。这使你有能力预处理指向某个特定应用程序、指向运行在一个虚拟主机上的应用程序,或者指向运行在一个引擎中的所有应用程序的请求。你可能要使用的其中一个阀门是访问日志阀门,它允许你将请求日志入口定制到选择的文件中。远程地址过滤(remote address filter)阀门允许你以请求源的IP地址为基础,选择性地阻断请求。这个阀门支持两个属性——allow和deny——它们都接受正则表达式作为值。例如,下面的阀门允许从地址段192.168.*.*发送的所有请求,并拒绝其他所有请求。另一方面,使用deny="84.74.97.75",将会允许除了从IP地址84.74.97.75发来的请求之外的所有请求。远程主机过滤(remote host filter)阀门的操作和远程地址过滤阀门类似,只是用客户端主机名称代替了客户端IP地址。例如,下面的阀门只允许从属于myweb.com域的主机发来的请求。请求记录(request dumper)阀门用于把传入请求的详细信息记入日志,因此其可用于调试。下面是你如何定义它。单点登录(single sign on)阀门(可以包含在Host容器中),其作用是对这个主机中的所有应用程序只需要一次认证。没有这个阀门,用户就必须在使用每个单独应用程序之前,输入他的ID和密码;下面是其使用方法。加载器和管理器通过在Context元素中定义一个Loader元素,你可以用自己的加载器代替应用程序中的标准类加载机制。如果你想代替默认的会话管理,可以定义一个Manager。
页: [1]
查看完整版本: Tomcat架构和server.xml