本文由 伯乐在线 - 唐尤华 校稿。未经许可,禁止转载!
英文出处:examples.javacodegeeks.com。
几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构。基本上,其中的每个元数据或者配置都是容器完成初始化所需要的。正是由于这些内容都是可配置的,使得软件设计者或架构师可以在容器运行时或销毁时(停止)的情况下注入需要的服务。明白这一点,其重要性不亚于明白代码或软件的工作机制。
对于这篇文章,我们将通过分析 server.xml 文件来理解和配置 appache tomcat 服务器。
准备工作:
安装教程可以点击这里。
===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
安装完成 的tomcat,被放在了你的本地存储中。对于 windows ,通常在 “ Program Files ” 文件夹下,对于 Mac 或者 Linux,可能在 /user/var/opt 或 /User/<>/Application 文件夹下。进入该目录,可以看到下面这几个文件和文件夹:
bin:Tomcat 二进制启动脚本。
conf:应用于所有 webapp 的全局配置。默认会提供如下配置:
catalina.properties
和 logging.properties ,
每个引擎在conf 目录下都有一个对应的子目录,例如Catalina,反过来对于每个 host 都有一个二级子目录,比如localhost。可以将上下文信息配置放在这里(类似于 context.xml ,但是对于每个在 host 下的 webapp ,该文件命名为 webapp.xml )。
lib:确保目录下的 JAR-file 对于所有 webapp 都有效。默认安装包括 servlet-api.jar(Servlet),jasper.jar(JSP)和 jasper-el.jar(EL)。外部的 JAR 文件也可以放在这里,如 MySQL JDBC 驱动(mysql-connector-java-5.1.{xx}-bin.jar )和 JSTL(jstl.jar 和 standard.jar)。
logs:包括引擎日志文件 Catalina.{yyyy-mm-dd}.log ,host 日志文件 localhost.{yyyy-mm-dd}.log,和其它应用的日志文件,如 manager 和 host-manager。访问日志(由 AccessLogValve 创建)也放在这里。
webapps:默认为 appBase – web应用的根目录。
temp:临时文件。
Tomcat 是一个 HTTP 服务器。也是一个servlet 容器,可以执行 Java Servlet,将 JavaServer Page(JSP)和 JavaServerFaces(JSF)转换为 Java Servlet。Tomcat 采用了层次化和模块化的架构,如下:
Figure 1.0 Tomcat Architecture
图片1.0 Tomcat 架构
“server.xml” 是 Tomcat 的主配置文件,在
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-
server-.xml 是一个自定义的文件,包含了对于一个指定 app 需要隔离的配置变化。所有这种格式的文件都会在 server.xml 文件之后被调用。
不推荐这么做,但如果想满足下自己好奇心的除外,你可以通过编辑 catalina.bat 文件来使用你自己的 server.xml 作为替代。
1
catalina.bat start -config confserver-<
name
>.xml
总的来讲,无论是 serve.xml 还是你自己的 server-
手机扫一扫
移动阅读更方便
你可能感兴趣的文章