http://www.importnew.com/17124.html 原文连接css
几乎全部容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上,其中的每一个元数据或者配置都是容器完成初始化所须要的。正是因为这些内容都是可配置的,使得软件设计者或架构师能够在容器运行时或销毁时(中止)的状况下注入须要的服务。明白这一点,其重要性不亚于明白代码或软件的工做机制。html
对于这篇文章,咱们将经过分析 server.xml 文件来理解和配置 appache tomcat 服务器。前端
准备工做:java
安装教程能够点击这里。mysql
安装完成 的tomcat,被放在了你的本地存储中。对于 windows ,一般在 “ Program Files ” 文件夹下,对于 Mac 或者 Linux,可能在 /user/var/opt 或 /User/<>/Application 文件夹下。进入该目录,能够看到下面这几个文件和文件夹:web
catalina.properties
和 logging.properties ,
每一个引擎在conf 目录下都有一个对应的子目录,例如Catalina,反过来对于每一个 host 都有一个二级子目录,好比localhost。能够将上下文信息配置放在这里(相似于 context.xml ,可是对于每一个在 host 下的 webapp ,该文件命名为 webapp.xml )。正则表达式
Catalina
), host name (localhost
), webapp name, followed by the Java classes package structure.Tomcat 是一个 HTTP 服务器。也是一个servlet 容器,能够执行 Java Servlet,将 JavaServer Page(JSP)和 JavaServerFaces(JSF)转换为 Java Servlet。Tomcat 采用了层次化和模块化的架构,以下:sql
图片1.0 Tomcat 架构数据库
server.xmlapache
“server.xml” 是 Tomcat 的主配置文件,在 <CATALINA_HOME>conf 目录下能够看到。重构后(删掉注释和格式化后)的默认”server.xml“文件以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?
xml
version
=
'1.0'
encoding
=
'utf-8'
?>
<
Server
port
=
"8005"
shutdown
=
"SHUTDOWN"
>
<
Listener
className
=
"org.apache.catalina.core.JasperListener"
/>
<
Listener
className
=
"org.apache.catalina.core.AprLifecycleListener"
SSLEngine
=
"on"
/>
<
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
>
|
Server(第二行)是顶级组件,表明一个 Tomcat 实例。能够包含一个或多个 Services ,其中每一个 Service 都有本身的 Engines 和 Connectors。
1
|
<
Server
port
=
"8005"
shutdown
=
"SHUTDOWN"
> ...... </
Server
>
|
Server 能够包含几个监听器。一个监听器监听指定事件,并对其做出响应。
JasperListener 做用于 Jasper JSP 引擎,该引擎负责对更新后的 JSP 页面进行重编译。
1
|
Listener className="org.apache.catalina.core.JasperListener" />
|
GlobalResourcesLifecycleListener 做用于全局资源,保证 JNDI 对资源的可达性,好比数据库。
1
|
<
Listener
className
=
"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"
/>
|
9到15行的元素定义了 JNDI(Java 命名和目录接口)资源,其容许 Java 软件客户端经过名称搜寻和查找数据。
默认配置经过10到14行的元素定义了一个名称为 UserDatabase 的 JNDI,经过”conf/tomcat-users.xml“获得了一个用于用户受权的内存数据库。
1
2
3
4
5
6
7
|
<
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
>
|
你也能够定义其它全局化JNDI资源来实现链接池,好比 MySQL 数据库。
一个 Service 能够链接一个或多个 Connectors 到一个引擎。默认配置定义了一个名为“Catalina”的 Service ,链接了两个 Connectors:HTTP 和 AJP 到当前的引擎。
1
|
<
Service
name
=
"Catalina"
> ...... </
Service
>
|
一个 Connector 关联到一个 TCP 端口,负责处理 Service 与客户端之间的交互。默认配置定义了两个 Connectors。
HTTP/1.1:处理 HTTP 请求,使得 Tomcat 成为了一个 HTTP 服务器。客户端能够经过 Connector 向服务器发送 HTTP 请求,接收服务器端的 HTTP 响应信息。
1
|
<
Connector
port
=
"8080"
protocol
=
"HTTP/1.1"
connectionTimeout
=
"20000"
redirectPort
=
"8443"
/>
|
与生产服务默认使用80端口不一样,Tomcat HTTP 服务默认在 TCP 端口8080上运行 。你能够选择1024到65535之间的任意数字做为端口号来运行 Tomcat 服务器,前提是该端口没有被任何其它应用使用。connectionTimeOut 属性定义了这个 connector 在连接得到赞成以后,得到请求 URI line(请求信息)响应的最大等待时间毫秒数。默认为20秒。redirect 属性会把 SSL 请求重定向到 TCP 的8443端口。AJP/1.3:Apache JServ Protocol connector 处理 Tomcat 服务器与 Apache HTTP 服务器之间的交互。
1
|
<
Connector
port
=
"8009"
protocol
=
"AJP/1.3"
redirectPort
=
"8443"
/>
|
能够将 Tomcat 和 Apache HTTP 服务运行在一块儿,Apache HTTP 服务器处理静态请求和 PHP;Tomcat 服务器负责处理 Java Servlet/JSP 。能够参阅“Tomcat 与 Apache 协同工做如何配置”。
包含了 Engine、Host、Context和 Cluster 的 Tomcat 称为容器。最高级的是 Engine,最底层的是 Context。某些组件,好比 Realm 和 Valve,也能够放在容器中。
引擎是容器中最高级别的部分。能够包含一个或多个 Host。Tomcat 服务器能够配置为运行在多个主机名上,包括虚拟主机。
1
|
<
Engine
name
=
"Catalina"
defaultHost
=
"localhost"
/>
|
Catalina 引擎 从 HTTP connector 接收 HTTP 请求,并根据请求头部信息中主机名或 IP 地址重定向到正确的主机上。
一个 Realm(域)就是一个包含 user、password 和 role 认证(好比访问控制)的数据库。你能够在任何容器中定义 Realm ,例如 Engine、Host、Context 和 Cluster。
1
2
3
|
<
Realm
className
=
"org.apache.catalina.realm.LockOutRealm"
>
<
Realm
className
=
"org.apache.catalina.realm.UserDatabaseRealm"
resourceName
=
"UserDatabase"
/>
</
Realm
>
|
默认配置定义了一个 Catalina Engine 的 Realm(UserDatabaseRealm),对用户访问 engine 的权限进行控制。其使用定义在 GlobalNamingResources 中,名字为 UserDatabase 的 JNDI。
除了 UserDatabaseRealm 之外,还有:JDBCRealm(受权用户是否能够经过 JDBC 驱动连接到关系型数据库);DataSourceRealm(经过 JNDI 连到数据源);JNDIRealm(链接到一个 LDAP 目录)和 MemoryRealm (将 XML 文件加载到内存)。
一个 Host 定义了在 Engine 下的一个虚拟机,反过来其又支持多个 Context(web 应用)。
1
|
<
Host
name
=
"localhost"
appBase
=
"webapps"
unpackWARs
=
"true"
autoDeploy
=
"true"
/>
|
默认配置定义了一个名为 localhost 的主机。appBase 属性定义了全部 webapp 的根目录,在这种状况下是 webapps。默认状况下,每个 webapp 的 URL 和它所在的目录名称相同。例如,默认的 Tomcat 安装目录的 webapps 下提供了四个 web 应用:docs、examples、host-manager 和 manager。只有 ROOT 是个例外,它用一个空字符串定义。也就是说,它的 URL 是 http://localhost:8080/。unpackWARs 属性指定了放到 webapps 目录下的 WAR-file 是否应该被解压。对于 unpackWARs=”false“,Tomcat 将会直接从 WAR-file 运行应用,而不解压,这可能致使应用运行变慢。autoDeploy 属性指定了是否自动部署放到 webapps 目录下的应用。
Tomcat 支持服务器集群。它能够复制整个集群的会话和上下文属性。也能够部署一个 WAR 文件到全部的集群上。
Valve (阀门)做为请求的前置处理程序,能够在请求发送到应用以前拦截 HTTP 请求。能够定义在任何容器中,好比 Engine、Host、Context和 Cluster。默认配置中,AccessLogValve 会拦截 HTTP 请求,并在日志文件中建立一个日志切入点,以下:
1
2
3
|
<
Valve
className
=
"org.apache.catalina.valves.AccessLogValve"
directory
=
"logs"
prefix
=
"localhost_access_log."
suffix
=
".txt"
pattern
=
"%h %l %u %t "
%r" %s %b" />
|
如下是其它一些 valve:
更多信息见于 server.xml 文件的顶层和嵌套级别的元素和属性,能够在这里查看。
如今,若是咱们想要为应用修改 server.xml 文件该怎么作?不能仅仅由于一个应用修改 server.xml 文件,由于它可能会对全部应用部署的初始化产生影响。对于指定的应用如何隔离指定的变化?
答案就是:建立一个 server-<name>.xml
server-.xml 是一个自定义的文件,包含了对于一个指定 app 须要隔离的配置变化。全部这种格式的文件都会在 server.xml 文件以后被调用。
不推荐这么作,但若是想知足下本身好奇心的除外,你能够经过编辑 catalina.bat 文件来使用你本身的 server.xml 做为替代。
1
|
catalina.bat start -config confserver-<
name
>.xml
|
总的来说,不管是 serve.xml 仍是你本身的 server-<name>.xml 文件,都是 container 的核心配置。对于应用开发者和发布管理员来说,是一种在部署 J2EE 应用的容器中放入资源文件的补充策略。其它不管以何种方式实现的 J2EE 标准容器(厂商),都有相同的配置文件,容许自定义注入和绑定,同时容许在部署、从新部署和卸载时控制哪些服务是有效的。