随笔-13  评论-6  文章-0  trackbacks-0

Tomcat服务器配置参考

Host容器

概述

Host元素代表一个虚拟主机,虚拟主机将服务器的网络名(比如www.mycompany.com)和运行Catalinade的某个特定服务器联系起来。为了生效,网络名称必须在管理你所在的Internet域的DNS服务器进行登记---请联系你的网络管理员。

在许多情况下,系统管理员可能希望为同一个虚拟主机或应用关联多个网络名称(比如www.mycompany.com和company.com)。这可以利用下面讨论的Host Name Alias特征来完成。

在Engine元素中可以嵌套一个或多个Host元素。在Host元素中可以嵌套context元素。在与每个Engine相关联的所有Host中,必须有一个Host的名称与Engine的defaultHost属性匹配。

以下的描述使用变量$CATALINA_HOME来指Tomcat 5安装的目录。大多数的相对路径都是以该目录为基准。但是,通过设置CATALINA_BASE目录,可以运行多个Tomcat 5实例,这时你应该使用$CATALINA_BASE来作为目录基准,而不是使用$CATALINA_HOME。

属性
公共属性

所有Host的实现必须支持如下属性:

属性 描述
appBase

虚拟主机的Applicaton Base目录。这是在该虚拟主机上发布web应用的目录路径。你可以指定绝对路径,或者使用相对于$CATALINA_HOME的路径。有关web应用的自动识别和发布的更多信息,请参考应用自动发布。

autoDeploy

这个标志表示,在Tomcat运行的时候,放到appBase目录下的新的web应用是否自动发布。缺省为true。这方面的更多信息参考应用自动发布

backgroundProcessorDelay

这个值代表在该host及其子容器(包括所有的wrappers)上调用backgroundProcess方法的延时,以秒为单位。如果延时值非负,子容器不会被调用,这意味着子容器使用自己的处理线程。如果该值为正,会创建一个新的线程。在等待指定的时间以后,该线程在Host及其子容器上调用backgroundProcess方法。Host使用后台处理进行与web应用实时发布有关的操作。如果没有指定,缺省值是-1,说明host依赖其所属的Engine的后台处理。

className

实现的Java类名。该类必须实现org.apache.catalina.Host接口。如果没有指定,使用标准实现(在下面定义)

deployOnStartup

这个标志表明这个host的web应用是否由host configurator 自动发布。缺省为true。这方面的更多信息参考自动应用发布。

name

虚拟主机的网络名称,也就是在DNS服务器上注册的名称。嵌套在Engine的所有Host中,必须有一个Host的名字与Engine的defaultHost属性相同。如果想为同一个虚拟主机指定多个网络名称,参考主机名别名。

 

标准实现

Host的标准实现是org.apache.catalina.core.StandardHost。它还支持如下的附加属性

属性 描述
debug

与Engine相关联的Logger的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省值为0。

deployXML

如果不想使用Context XML配置文件来发布web应用,设为false。同时也失去了利用manager应用程序安装web应用或者“.war”文件的能力(这些web应用或.war文件不在Host的配置基准目录$CATALINA_HOME/conf/[engine_name]/[host_name]下面)

web应用使用catalina的安全许可发布,如果需要让不可信的用户管理web应用,这个值可以设为false。缺省为true。

errorReportValveClass

Host使用的错误报告valve的Java类名。这个valve的责任是输出错误报告。设置这个值可以定制Tomcat产生的错误页面的格式。这个类必须实现org.apache.catalina.Valve接口。如果没有指定,使用缺省值

og.apache.catalina.valvees.ErrorReportValve.

unpackWARs

如果希望将位于appBase目录下的WAR文件解压缩成对应的目录结构,设为true。如果希望直接从WAR文件运行web应用,设为false。更多信息参考应用自动发布。

workDir

Host的web应用使用的临时目录的路径。每个应用都有自己的子目录,用于临时的读写。如果在Context中设置了workDir属性,它将会覆盖Host的workDir属性。如Servlet Specification中所述,通过servlet context的属性javax.servlet.context.tempdir,这个目录可以被servlet使用。如果没有指定,使用$CATALINA_HOME/work下面的合适的目录。

嵌套组件

可以在Host元素中嵌套一个或者多个Context元素,每个Context元素代表这个虚拟主机下的一个不同的web应用。同时,你可以嵌套一个DefaultContext元素,用来定义后续发布的web应用的缺省值

可以在Host元素中选择嵌套一个DefaultContext元素,用来定义自动发布的web应用的缺省特性。

下列元素可以嵌套在Host元素中,但至多只能嵌套一个实例:

  • Logger - 配置一个logger,用来接收和处理Host的所有日志消息,以及这个Host的所有Context的日志消息(除非被低一级的Logger配置覆盖)
  • Realm -配置一个realm,Realm的用户数据库以及用户角色被这个Host的所有Context共享(除非被低一级的Realm配置覆盖)
专有特征
访问日志

正常情况下,运行web服务器会生成访问日志。访问日志以标准格式为每个请求输出一行信息。Catalina包含一个可选的Valve实现,可以用标准格式生成日志,还可以使用任意定制的格式。

通过在Engine,Host或者Context中嵌套一个Valve元素,Catalina会为该容器处理的所有请求创建访问日志,如下所示:

<Host name="localhost" ...>
  ...
  <Valve className="org.apache.catalina.valves.AccessLogValve"
         prefix="localhost_access_log." suffix=".txt"
         pattern="common"/>
  ...
</Host>
参考Access Log Valve,以获得更多配置属性的信息;
应用自动发布

如果使用标准的Host实现,当Catalina第一次启动时,如果deployOnStartup属性为true,tomcat会自动采取如下的步骤:

  • 假定$CATALINA_HOME/conf/[engine_name]/[host_name]目录中的任何XML文件都包含一个Context元素(以及它的相关的子元素),通常情况下,这个<Context>的docBase属性指向一个web应用目录的绝对路径,或者是WAR文件的绝对路径。
  • 如果WAR文件对应的目录不存在,则这个WAR文件会被自动展开,除非unpackWARs属性设为false。在重新发布更新后的WAR文件时,重新启动Tomcat之前一定要删除展开后的目录,这样更新后的WAR文件才会被重新展开(如果使能了auto deployer,它会自动完成这项工作)
  • application base目录下的任何子目录,如果包含/WEB-INF/web.xml文件,Tomcat认为这个一个展开后的web应用,会为这个目录自动产生一个Context元素,即使这个目录没有在conf/server.xml文件中出现。产生的Context会使用DefaultContext中的属性来配置。自动产生的Context的context路径是“/”后面跟上目录名,除非目录名是ROOT,这种情况下context路径是空字符串(“”);

除了启动时候的自动发布以外,在Tomcat运行的时候,当新的XML 配置文件,WAR文件或者子目录(包含新的web应用)放到appBase目录下,或者当XML配置文件放到$CATALINA_HOME/conf/[engine_name]/[host_name]目录)的时候,该web应用被自动发布。auto deployer也负责跟踪web应用的如下变化:

  • 如果更新了WEB-INF/web.xml文件,会触发web应用的重载;
  • 如果WAR文件被更新,并且WAR文件已经展开,首先删除展开的web应用,然后发布更新的WAR文件;
  • 如果XML配置文件被更新,首先删除该应用(但是不删除任何展开以后的目录),然后发布相关的web应用
主机名别名

在许多服务器环境中,多个网络名称可能指向同一个IP地址(比如,www.mycompany.com和company.com都指向192.168.1.1)。正常情况下,每个网络名称应该在conf/server.xml中对应一个Host元素,每个Host元素有自己的一套web应用。

但是,有些情况下,可能希望两个或者更多网络名称解析到同一个虚拟主机上,运行相同的一套web应用。这种情况的典型用途是公司网站。用户可以使用www.mycompany.com和company.com访问同样的内容和应用。

通过在Host元素中嵌套一个或者多个Alias元素,可以完成上述功能。

 

<Host name="www.mycompany.com" ...>
  ...
  <Alias>mycompany.com</Alias>
  ...
</Host>

为了使这个策略生效,所有的网络名称必须在DNS服务器登记,指向运行Catalina实例的同一台计算机。

 

生命期Listeners

如果一个Java对象需要知道Context什么时候启动,什么时候停止,可以在这个对象中嵌套一个Listener元素。该Listener元素必须实现了org.apache.catalina.LifecycleListener接口,在发生对应的生命期事件的时候,通知该Listener。可以按照如下的格式配置这样的Listener:

<Host name="localhost" ...>
  ...
  <Listener className="com.mycompany.mypackage.MyListener" ... >
  ...
</Host>
注意,一个listener可以具有任意多的附加属性。属性名与JavaBean的属性名相对应,使用标准的属性命名方法。
请求过滤器
对每个发送到Engine,Host或者Context的请求,可以要求Catalina检查IP地址或主机名称。Catalina使用一系列配置好的“接受”或者“拒绝”过滤器对客户端的地址或者主机名进行检查,过滤器是按照正则表达式语法定义的,由Jakarta Regexp正则表达式库支持。不被接受的请求会返回一个HTTP“Forbidden”错误。下面是过滤器的定义。
<Host name="localhost" ...>
  ...
  <Valve className="org.apache.catalina.valves.RemoteHostValve"
         allow="*.mycompany.com,www.yourcompany.com"/>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         deny="192.168.1.*"/>
  ...
</Host>

 

如果想知道过滤器支持的更多选项的信息,参考Remote Address Filter和Remote Host Filter

单次登录(Single Sign On

在许多环境尤其是门户环境下,对特定虚拟主机上的一套web应用,只希望对用户进行一次认证。这可以在Host元素中嵌套如下的元素完成:

<Host name="localhost" ...>
  ...
  <Valve className="org.apache.catalina.authenticator.SingleSignOn"
         debug="0"/>
  ...
</Host>

单次登录根据如下规则运作:

  • 这个虚拟主机的所有web应用必须共享同一个Realm。在实际情况中,这意味着你可以在这个Host元素中嵌套Realm元素(或者是Engine元素),但不能在web应用对应的Context中嵌套Realm元素
  • 如果用户只访问这个虚拟主机上任意web应用的没有加保护的资源,他们不会被要求认证;
  • 一旦用户访问这个虚拟主机下的任意web应用的保护资源,用户会被要求认证。使用正在访问的web应用的login方法;
  • 一旦认证通过,与这个用户相关联的角色决定了它对所有的web应用的访问控制权限;而不需要对每个应用单独认证;
  • 一旦用户从某个web应用注销(比如,如果使用了基于表单的login,对应的session过期或者无效),用户在所有web应用的session都会失效;任何后续的对保护资源的访问会要求对用户重新认证;
  • 单次登录特征使用HTTP cookies传输令牌,将每个请求和用户身份联系起来,因此客户端必须支持cookies;
用户Web应用

许多web服务器会自动将以"~"和用户名开始的URI映射到用户主目录下的某个目录(通常为public_html)。在Catalina中,通过使用特殊的Listener元素,可以完成上述功能

在利用/etc/password来标识有效用户的Unix系统下使用如下配置:

<Host name="localhost" ...>
  ...
  <Listener className="org.apache.catalina.startup.UserConfig"
            directoryName="public_html"
            userClass="org.apache.catalina.startup.PasswdUserDatabase"/>
  ...
</Host>

在不使用/etc/password的服务器上,可以要求Catalina将指定的基准目录下的所有目录(比如c:\homes)看成是用户主目录:

<Host name="localhost" ...>
  ...
  <Listener className="org.apache.catalina.startup.UserConfig"
            directoryName="public_html"
            homeBase=c:\Homes"
            userClass="org.apache.catalina.startup.HomesUserDatabase"/>
  ...
</Host>

如果某个名为craigmcc的用户的主目录已经设置好,通过使用如下URL,可以浏览它的内容:

http://www.mycompany.com:8080/~craigmcc

 

使用这个特征需要注意如下几个问题:

  • 每个用户web应用会使用该Host的DefaultContext元素定义的特征发布;
  • 包含多个Listener元素的实例也是有效的。但是,这只在你希望配置多个homeBase目录情况下才有意义;
  • 执行Catalina的用户名对每个用户的web应用目录以及它的所有内容必须有读的权限;
posted on 2006-02-16 17:05 java之海 阅读(3036) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: