Tomcat的server.xml配置节点简介
tomcat 的server.Xml 中的各个节点
Server 节点:
Server 代表整个Catalina servlet 容器。在server.xml 配置文件中必须是顶层元素且唯一,给它配置的属性代表整个容器的属性。
Service 节点:
service 由连接器connector 和共享的处理引擎(Engine)。
Connector 节点:
Connector 分为http connector 和ajp3 connector,http connector 用 Http/1.1 协议 Connector 接侦听来自客户端浏览器的http 请求,此时tomcat 作为独立的web 服务器;ajp3 connector用ajp3 协议侦听来自其它Web 服务器的请求,此时tomcat 只作为servlet 容器。
Engine 节点:
处理引擎(Engine)代表一个Service 所属的请求处理机,它接受所有连接器传递过来的客户端请求,将处理结果返回给连接器,由连接器将最终响应返回给客户端。Engine 必须配置在Service 组件下。处理引擎下 可以配置多个虚拟主机(Virtual Host),每个虚拟主机都有一个域名。当处理引擎获得一个请求时,它把该请求匹配到某个虚拟主机上,把请求交给该虚拟主机来处理。处理引擎有一个默认虚拟主机,当请求无法匹配到任何一个虚拟主机上时,交给默认虚拟主机来处理。
Host 节点:
代表一个虚拟主机,每个虚拟主机和某个网络域名(Domain Name)相匹配。每个虚拟主机下都可以部署(deploy)一个或者多个Web 应用程序(Web Application),每个Web 应用程序对应于一个Context,有一个Context path。当虚拟主机获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理。匹配的方法是“最长匹配”,一个path=""的Context将成为该虚拟主机的默认Context。所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。在许多情况下,系统管理员希望将多个网络域名绑定到同一个虚拟主机,这就需要使用“主机别名”技术来实现。
Context节点:
一个Context对应于一个Web应用程序,一个Web应用程序由一个或者多个Servlet组成。Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml 和$WebApp/Web-INF/web.xml 载入Servlet类。当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类。如果找到,则执行该类,获得请求的响应,并返回。
Cluster中的各个属性节点
tomcat 集群各节点通过建立tcp 链接来完成Session的拷贝,拷贝有同步和异步两种模式。在同步模式下,对客户端的响应必须在Session拷贝到其他节点完成后进行;异步模式无需等待Session拷贝完成就可响应。异步模式更高效,但是同步模式可靠性更高。同步异步模式由channelSendOptions参数控制,默认值是8,为异步模式,4是同步模式。在异步模式下,可以通过加上拷贝确认(Acknowledge)来提高可靠性,此时channelSendOptions设为10。
Manager节点:
用来在节点间拷贝Session,默认使用DeltaManager,DeltaManager采用的一种all-to-all的工作方式,即集群中的节点会把Session数据向所有其他节点拷贝,而不管其他节点是否部署 了当前应 用。当集群中 的节点数 量很多并且部 署着不同 应用时,可以 使用BackupManager,BackManager仅向部署了当前应用的节点拷贝Session。但是到目前为止BackupManager并未经过大规模测试,可靠性不及DeltaManager。
Channel节点:
负责对tomcat 集群的IO 层进行配置。Membership用于发现集群中的其他节点,这里的address用的是组播地址(Multicast address,),使用同一个组播地址和端口的多个节点同属一个子集群,因此通过自定义组播地址和端口就可将一个大的tomcat 集群分成多个子集群。Receiver用于各个节点接收其他节点发送的数据,在默认配置下tomcat 会从4000-4100间依次选取一个可用的端口进行接收,自定义配置时,如果多个tomcat节点在一台物理服务器上注意要使用不同的端口。Sender用于向其他节点发送数据,具体实现通过Transport配置,PooledParallelSender是从tcp 连接池中获取连接,可以实现并行发送,即集群中的多个节点可以同时向其他所有节点发送数据而互不影响。Interceptor有点类似下面将要解释的Valve,起到一个阀门的作用,在数据到达目的节点前进行检测或其他操作,如TcpFailureDetector用于检测在数据的传输过程中是否发生了tcp 错误。
Valve节点:
用于在节点向客户端响应前进行检测或进行某些操作,ReplicationValve就是用于用于检测当前的响应是否涉及Session数据的更新,如果是则启动Session拷贝操作,filter用于过滤
请求,如客户端对图片,css,js 的请求就不会涉及Session,因此不需检测,默认状态下不进行过滤,监测所有的响应。JvmRouteBinderValve会在前端的Apache mod_jk发生错误时
保证同一客户端的请求发送到集群的同一个节点,tomcat 官方文档并未解释如何实现这一点。
Deployer节点:
用于集群的farm 功能,监控应用中文件的更新,以保证集群中所有节点应用的一致性,如某个用户上传文件到集群中某个节点的应用程序目录下,Deployer会监测到这一操作并把这一文件拷贝到集群中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能,不过很遗憾,tomcat 集群目前并不能做到这一点,开发人员正在努力实现它,这里的配置只是预留了一个接口。
Listener节点:
用于跟踪集群中节点发出和收到的数据,也有点类似Valve的功能。
一个样例,直接贴上来:
<? xml version='1.0' encoding='utf-8' ?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --> < Server port ="8005" shutdown ="SHUTDOWN" > <!-- APR library loader. Documentation at /docs/apr.html --> < Listener className ="org.apache.catalina.core.AprLifecycleListener" SSLEngine ="on" /> <!-- Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> < Listener className ="org.apache.catalina.core.JasperListener" /> <!-- Prevent memory leaks due to use of particular java/javax APIs --> < Listener className ="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> < Listener className ="org.apache.catalina.mbeans.ServerLifecycleListener" /> < Listener className ="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> < GlobalNamingResources > <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> < 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 > <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> < Service name ="Catalina" > <!-- The connectors can use a shared executor, you can define one or more named thread pools --> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 --> < Connector port ="8080" protocol ="HTTP/1.1" connectionTimeout ="20000" redirectPort ="8443" /> <!-- A "Connector" using the shared thread pool --> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation --> <!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> --> <!-- Define an AJP 1.3 Connector on port 8009 --> < Connector port ="8009" protocol ="AJP/1.3" redirectPort ="8443" /> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> < Engine name ="Catalina" defaultHost ="localhost" > <!-- For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- The request dumper valve dumps useful debugging information about the request and response data received and sent by Tomcat. Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.valves.RequestDumperValve"/> --> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> < Realm className ="org.apache.catalina.realm.UserDatabaseRealm" resourceName ="UserDatabase" /> <!-- Define the default virtual host Note: XML Schema validation will not work with Xerces 2.2. --> < Host name ="localhost" appBase ="webapps" unpackWARs ="true" autoDeploy ="true" xmlValidation ="false" xmlNamespaceAware ="false" > <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> --> </ Host > </ Engine > </ Service > </ Server >