Tomcat 详解

一,Tomcat简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,它早期的名称为catalina,后来由Apache、Sun 和其余一些公司及我的共同开发而成,并改名为Tomcat。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是不少的场合下被广泛使用,是开发和调试JSP 程序的首选,由于Tomcat 技术先进、性能稳定,成为目前比较流行的Web 应用服务器。Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,但它是独立运行的。目前最新的版本为Tomcat 8.0.24 Released。前端

Tomcat不是一个完整意义上的Jave EE服务器,它甚至都没有提供对哪怕是一个主要Java EE API的实现;但因为遵照apache开源协议,tomcat却又为众多的java应用程序服务器嵌入本身的产品中构建商业的java应用程序服务器,如JBoss和JOnAS。尽管Tomcat对Jave EE API的实现并不完整,然而很企业也在渐渐抛弃使用传统的Java EE技术(如EJB)转而采用一些开源组件来构建复杂的应用。这些开源组件如Structs、Spring和Hibernate,而Tomcat可以对这些组件实现完美的支持。java

 

Tomcat的架构:node

Tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,通常可分为如下四类:mysql

顶级组件:位于配置层次的顶级,而且彼此间有着严格的对应关系;linux

链接器:链接客户端(能够是浏览器或Web服务器)请求至Servlet容器,nginx

容器:包含一组其它组件;web

被嵌套的组件:位于一个容器当中,但不能包含其它组件;正则表达式

各常见组件:sql

一、服务器(server):Tomcat的一个实例,一般一个JVM只能包含一个Tomcat实例;所以,一台物理服务器上能够在启动多个JVM的状况下在每个JVM中启动一个Tomcat实例,每一个实例分属于一个独立的管理端口。这是一个顶级组件。数据库

二、服务(service):一个服务组件一般包含一个引擎和与此引擎相关联的一个或多个链接器。给服务命名能够方便管理员在日志文件中识别不一样服务产生的日志。一个server能够包含多个service组件,但一般情下只为一个service指派一个server。

链接器类组件:

三、链接器(connectors):负责链接客户端(能够是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,一般指的是接收客户发来请求的位置及服务器端分配的端口。默认端口一般是HTTP协议的8080,管理员也能够根据本身的须要改变此端口。一个引擎能够配置多个链接器,但这些链接器必须使用不一样的端口。默认的链接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2链接器。

容器类组件:

四、引擎(Engine):引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每个请求的HTTP首部信息以辨别此请求应该发往哪一个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来讲,容器没必要非得经过引擎来实现,它也能够是只是一个容器。若是Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而若是Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,由于Web服务器自身就能肯定将用户请求发往何处。一个引擎能够包含多个host组件。

五、主机(Host):主机组件相似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。

六、上下文(Context):Context组件是最内层次的组件,它表示Web应用程序自己。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器可以将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实如今用户访问发生错误时提供友好的提示信息。

被嵌套类(nested)组件:

这类组件一般包含于容器类组件中以提供具备管理功能的服务,它们不能包含其它组件,但有些却能够由不一样层次的容器各自配置。

七、阀门(Valve):用来拦截请求并在将其转至目标以前进行某种处理操做,相似于Servlet规范中定义的过滤器。Valve能够定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术一般被称做请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。

八、日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context以外的任何容器中。日志记录的功能可被继承,所以,一个引擎级别的Logger将会记录引擎内部全部组件相关的信息,除非某内部组件定义了本身的Logger组件。

九、领域(Realm):用于用户的认证和受权;在配置一个应用程序时,管理员能够为每一个资源或资源组定义角色及权限,而这些访问控制功能的生效须要经过Realm来实现。Realm的认证能够基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍布整个引擎或顶级容器,所以,一个容器内的全部应用程序将共享用户资源。同时,Realm能够被其所在组件的子组件继承,也能够被子组件中定义的Realm所覆盖。

引擎(Engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接收请求并响应请求。它检查每个请求的HTTP首部信息以辨别此请求应该发往哪一个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来讲,容器没必要非得经过引擎来实现,它也能够是只是一个容器。若是Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而若是Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,由于Web服务器自身就能肯定将用户请求发往何处。一个引擎能够包含多个host组件。

Tomcat链接器架构:

基于Apache作为Tomcat前端的架构来说,Apache经过mod_jk、mod_jk2或mod_proxy模块与后端的Tomcat进行数据交换。而对Tomcat来讲,每一个Web容器实例都有一个Java语言开发的链接器模块组件,在Tomcat6中,这个链接器是org.apache.catalina.Connector类。这个类的构造器能够构造两种类别的链接器:HTTP/1.1负责响应基于HTTP/HTTPS协议的请求,AJP/1.3负责响应基于AJP的请求。但能够简单地经过在server.xml配置文件中实现链接器的建立,但建立时所使用的类根据系统是支持APR(Apache Portable Runtime)而有所不一样。

APR是附加在提供了通用和标准API的操做系统之上一个通信层的本地库的集合,它可以为使用了APR的应用程序在与Apache通讯时提供较好伸缩能力时带去平衡效用。
同时,须要说明的是,mod_jk2模块目前已经再也不被支持了,mod_jk模块目前还apache被支持,但其项目活跃度已经大大下降。所以,目前更经常使用 的方式是使用mod_proxy模块。

若是支持APR:

1
2
HTTP / 1.1org . apache . cotote . http11 . Http11AprProtocol
AJP / 1.3org . apache . coyote . ajp . AjpAprProtocol

若是不支持APR:

1
2
HTTP / 1.1 : org . apache . coyote . http11 . Http11Protocol
AJP / 1.3 : org . apache . jk . server . JkCoyoteHandler

链接器协议:

Tomcat的Web服务器链接器支持两种协议:AJP和HTTP,它们均定义了以二进制格式在Web服务器和Tomcat之间进行数据传输,并提供相应的控制命令。

AJP(Apache JServ Protocol)协议:目前正在使用的AJP协议的版本是经过JK和JK2链接器提供支持的AJP13,它基于二进制的格式在Web服务器和Tomcat之间传输数据,而此前的版本AJP10和AJP11则使用文本格式传输数据。

HTTP协议:诚如其名称所表示,其是使用HTTP或HTTPS协议在Web服务器和Tomcat之间创建通讯,此时,Tomcat就是一个彻底功能的HTTP服务器,它须要监听在某端口上以接收来自于商前服务器的请求。

二,安装Tomcat

Tomcat的官方站点为http://tomcat.apache.org/,要安装Tomcat,首先须要安装JDK。

如下安装平台为CentOS release 6.6 (Final) 32位平台上,JDK 版本为jdk-6u45-linux-i586-rpm.bin ,tomcat 使用 apache-tomcat-7.0.63.tar.gz。

1,安装

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[ root @ localhost tomcat ] # ls -l
total 75676
- rw - r -- r -- . 1 root root    8850470 Aug 12 02 : 08 apache - tomcat - 7.0.63.tar.gz
- rw - r -- r -- . 1 root root 68637258 Apr    6    2014 jdk - 6u45 - linux - i586 - rpm . bin
[ root @ localhost tomcat ] # chmod +x jdk-6u45-linux-i586-rpm.bin
[ root @ localhost tomcat ] # ./jdk-6u45-linux-i586-rpm.bin
[ root @ localhost tomcat ] # tar xf  apache-tomcat-7.0.63.tar.gz -C  /usr/local/
[ root @ localhost tomcat ] # ln -s /usr/local/apache-tomcat-7.0.63/  /usr/local/tomcat
[ root @ node1 tomcat ] # vim /etc/profile.d/java.sh     #设置java环境变量
export JAVA_HOME = / usr / java / latest
export PATH = $ PATH : $ JAVA_HOME / bin
[ root @ node1 conf ] # .  /etc/profile.d/tomcat.sh
[ root @ node1 tomcat ] # vim /etc/profile.d/tomcat.sh       #设置tomcat环境变量
export CATALINA_HOME = / usr / local / tomcat
export PATH = $ PATH : $ CATALINA_HOME / bin
[ root @ node1 conf ] # catalina.sh version    
Using CATALINA_BASE :    / usr / local / tomcat
Using CATALINA_HOME :    / usr / local / tomcat
Using CATALINA_TMPDIR : / usr / local / tomcat / temp
Using JRE_HOME :          / usr / java / jdk1 . 6.0_45
Using CLASSPATH :        / usr / local / tomcat / bin / bootstrap . jar : / usr / local / tomcat / bin / tomcat - juli . jar
Server version : Apache Tomcat / 7.0.63
Server built :    Jun 30 2015 08 : 08 : 33 UTC
Server number :    7.0.63.0
OS Name :          Linux
OS Version :      2.6.32 - 504.el6.i686
Architecture :    i386
JVM Version :      1.6.0_45 - b06
JVM Vendor :      Sun Microsystems Inc .
[ root @ localhost tomcat ] # vim /etc/init.d/tomcat    #提供启动脚本
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME = / usr / java / latest
CATALINA_HOME = / usr / local / tomcat
export JAVA_HOME CATALINA_HOME
case $ 1 in
start )
   exec $ CATALINA_HOME / bin / catalina . sh start ; ;
stop )
   exec $ CATALINA_HOME / bin / catalina . sh stop ; ;
restart )
   $ CATALINA_HOME / bin / catalina . sh stop
   sleep 2
   exec $ CATALINA_HOME / bin / catalina . sh start ; ;
configtest )
   exec $ CATALINA_HOME / bin / catalina . sh configtest ; ;
* )
   exec $ CATALINA_HOME / bin / catalina . sh * ; ;
esac
[ root @ localhost tomcat ] # chmod +x  /etc/init.d/tomcat
[ root @ localhost tomcat ] # chkconfig --add tomcat
[ root @ node1 tomcat ] # catalina.sh start
[ root @ node1 tomcat ] # jps      #显示Bootstrap启动则表示启动成功
29145 Bootstrap                           
29163 Jps

三,配置文件详解

Tomcat的配置文件:

Tomcat的配置文件默认存放在/usr/local/tomcat/conf目录中,主要有如下几个

1
2
3
[ root @ localhost conf ] # ls
catalina . policy       context . xml         server . xml         web . xml
catalina . properties   logging . properties   tomcat - users . xml

server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;

web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为全部的Web应用程序提供包括MIME映射等默认配置信息;

tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认状况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将经过编辑此文件实现;

catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;

catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对经过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;

logging.properties: Tomcat6经过本身内部实现的JAVA日志记录器来记录操做相关的日志,此文件即为日志记录器相关的配置信息,能够用来定义日志记录的组件级别以及日志文件的存在位置等;

context.xml:全部host的默认配置信息;

1
1server . xml

Tomcat以面向对象的方式运行,它能够在运行时动态加载配置文件中定义的对象结构,这有点相似于apache的httpd模块的调用方式。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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
< Server port =8005shutdown =SHUTDOWN>
 
   < Listener className =org . apache . catalina . core . JasperListener/ >
   < Listener className =org . apache . catalina . mbeans . ServerLifecycleListener/ >
   < Listener className =org . apache . catalina . mbeans . GlobalResourcesLifecycleListener/ >
 
   < GlobalNamingResources >
    < Resource name =UserDatabaseauth =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 =8080protocol =HTTP / 1.1
       maxThreads =150connectionTimeout =20000
       redirectPort =8443/ >
 
     < Engine name =CatalinadefaultHost =localhost>
 
       < Host name =localhostappBase =webapps
         unpackWARs =trueautoDeploy =true
         xmlValidation =falsexmlNamespaceAware =false>
       < / Host >
     < / Engine >
   < / Service >
< / Server >
 
< Server port =8005shutdown =SHUTDOWN>
   < Listener className =org . apache . catalina . core . AprLifecycleListenerSSLEngine =on/ >
   < Listener className =org . apache . catalina . core . JasperListener/ >
   < Listener className =org . apache . catalina . core . JreMemoryLeakPreventionListener/ >
   < Listener className =org . apache . catalina . mbeans . GlobalResourcesLifecycleListener/ >
   < Listener className =org . apache . catalina . core . ThreadLocalLeakPreventionListener/ >
 
   < GlobalNamingResources >
     < Resource name =UserDatabaseauth =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 =8080protocol =HTTP / 1.1
       connectionTimeout =20000
       redirectPort =8443/ >
     < Connector port =8009protocol =AJP / 1.3redirectPort =8443/ >
 
     < Engine name =CatalinadefaultHost =localhost>
 
      < Realm className =org . apache . catalina . realm . LockOutRealm>
        < Realm className =org . apache . catalina . realm . UserDatabaseRealm
            resourceName =UserDatabase/ >
      < / Realm >
 
      < Host name =localhostappBase =webapps
          unpackWARs =trueautoDeploy =true>
 
        < Valve className =org . apache . catalina . valves . AccessLogValvedirectory =logs
            prefix =localhost_access_log .suffix =. txt
            pattern =% h % l % u % t & quot ; % r & quot ; % s % b/ >
 
      < / Host >
     < / Engine >
   < / Service >
< / Server >

server.xml文件中可定义的元素很是多,包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等。

下面简单介绍几个经常使用组件:

一、Server组件

如上面示例文件中定义的:

<Server port=”8005” shutdown=”SHUTDOWN”>

这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令,使用 telnet 链接8005 端口能够直接执行 SHUTDOWN 命令来关闭 Tomcat。各Server的定义不能使用同一个端口,这意味着若是在同一个物理机上启动了多个Server实例,必须配置它们使用不一样的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,所以,管理员能够直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这一般不容许远程进行。

Server的相关属性:

className: 用于实现此Server容器的彻底限定类的名称,默认为org.apache.catalina.core.StandardServer;

port: 接收shutdown指令的端口,默认仅容许经过本机访问,默认为8005;

shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;

2Service组件:

Service主要用于关联一个引擎和与此引擎相关的链接器,每一个链接器经过一个特定的端口和协议接收入站请求交将其转发相当联的引擎进行处理。困此,Service要包含一个引擎、一个或多个链接器。

如上面示例中的定义:

<Service name=”Catalina”>

这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。

Service相关的属性:

className: 用于实现service的类名,通常都是org.apache.catalina.core.StandardService。

name:此服务的名称,默认为Catalina;

3Connector组件:

进入Tomcat的请求能够根据Tomcat的工做模式分为以下两类:

Tomcat做为应用程序服务器:请求来自于前端的web服务器,这多是Apache, IISNginx等;

Tomcat做为独立服务器:请求来自于web浏览器;

Tomcat应该考虑工做情形并为相应情形下的请求分别定义好须要的链接器才能正确接收来自于客户端的请求。一个引擎能够有一个或多个链接器,以适应多种请求方式。

定义链接器可使用多种属性,有些属性也只适用于某特定的链接器类型。通常说来,常见于server.xml中的链接器类型一般有4种:

1) HTTP链接器 2) SSL链接器 3) AJP 1.3链接器 4) proxy链接器

如上面示例server.xml中定义的HTTP链接器:

<Connector port=”8080″ protocol=”HTTP/1.1″
maxThreads=”150″ connectionTimeout=”20000″
redirectPort=”8443″/>

定义链接器时能够配置的属性很是多,但一般定义HTTP链接器时必须定义的属性只有“port“,定义AJP链接器时必须定义的属性只有”protocol”,由于默认的协议为HTTP。如下为经常使用属性的说明:

1) address:指定链接器监听的地址,默认为全部地址,即0.0.0.0; 能够本身指定地,如
2) maxThreads:支持的最大并发链接数,默认为200;
3) port:监听的端口,默认为0;
4) protocol:链接器使用的协议,默认为HTTP/1.1,定义AJP协议时一般为AJP/1.3;
5) redirectPort:若是某链接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
7) enableLookups:是否经过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true; 进行反解的,能够设置为false
8) acceptCount:设置等待队列的最大长度;一般在tomcat全部处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;

 下面是一个定义了多个属性的链接器
<Connector port=”8443″

maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” acceptCount=”100″ debug=”0″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS” />

4Engine组件:

Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine须要defaultHost属性来为其定义一个接收全部发往非明肯定义虚拟主机的请求的host组件。如前面示例中定义的:

<Engine name=”Catalina” defaultHost=”localhost”>

经常使用的属性定义:

defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机能够经过在Engine容器中定义多个不一样的Host组件来实现;但若是此引擎的链接器收到一个发往非非明肯定义虚拟主机的请求时则须要将此请求发往一个默认的虚拟主机进行处理,所以,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;

name:Engine组件的名称,用于日志和错误信息记录时区别不一样的引擎;

Engine容器中能够包含Realm、Host、Listener和Valve子容器。

5Host组件:

位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:

<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>

经常使用属性说明:

1) appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可使用基于$CATALINA_HOME的相对路径;
2) autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;
3) unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

虚拟主机定义示例:

<Engine name=”Catalina” defaultHost=”localhost”>
<Host name=”localhost” appBase=”webapps”>
<Context path=”” docBase=”ROOT”/>
<Context path=”/bbs” docBase=”/web/bss”  #path路径是定义在defaultHost背后的
reloadable=”true” crossContext=”true”/>
</Host>

<Host name=”mail.magedu.com” appBase=”/web/mail”>
<Context path=”” docBase=”ROOT”/>
</Host>
</Engine>

主机别名定义:

若是一个主机有两个或两个以上的主机名,额外的名称都可以以别名的形式进行定义,以下:
<Host name=”www.ttlsa.com” appBase=”webapps” unpackWARs=”true”>
<Alias>feiyu.com</Alias>
</Host>

6Context组件:

Context在某些意义上相似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;以下面的定义:

<!– Tomcat Root Context –>
<Context path=”” docBase=”/web/webapps”/>

<!– buzzin webapp –>
<Context path=”/bbs”
docBase=”/web/threads/bbs”
reloadable=”true”>
</Context>

<!– chat server –>
<Context path=”/chat” docBase=”/web/chat”/>

<!– darian web –>
<Context path=”/darian” docBase=”darian”/>

在Tomcat6中,每个context定义也可使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf//。能够用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

经常使用的属性定义有:

1) docBase:相应的Web应用程序的存放位置;也可使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,好比,若是appBase为deploy,而docBase毫不能为deploy-bbs类的名字;
2) path:相对于Web服务器根路径而言的URI;若是为空“”,则表示为此webapp的根路径;若是context定义在一个单独的xml文件中,此属性不须要定义,有多是别名;
3) reloadable:是否容许从新加载此context相关的Web应用程序的类;默认为false;

 

7Realm组件:

一个Realm表示一个安全上下文,它是一个受权访问某个给定Context的用户列表和某用户所容许切换的角色相关定义的列表。所以,Realm就像是一个用户和组相关的数据库。定义Realm时唯一必需要提供的属性是classname,它是Realm的多个不一样实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。

JAASRealm:基于Java Authintication and Authorization Service实现用户认证;
JDBCRealm:经过JDBC访问某关系型数据库表实现用户认证;
JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;
MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;
UserDatabaseRealm:基于UserDatabase文件(一般是tomcat-user.xml)实现用户认证,它实现是一个彻底可更新和持久有效的MemoryRealm,所以可以跟标准的MemoryRealm兼容;它经过JNDI实现;

下面是一个常见的使用UserDatabase的配置:

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

下面是一个使用JDBC方式获取用户认证信息的配置:

<Realm className=”org.apache.catalina.realm.JDBCRealm” debug=”99″
driverName=”org.gjt.mm.mysql.Driver”
connectionURL=”jdbc:mysql://localhost/authority”
connectionName=”test” connectionPassword=”test”
userTable=”users” userNameCol=”user_name”
userCredCol=”user_pass”
userRoleTable=”user_roles” roleNameCol=”role_name” />

8Valve组件:

Valve相似于过滤器,它能够工做于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内能够创建多个Valve,并且Valve定义的次序也决定了它们生效的次序。Tomcat6中实现了多种不一样的Valve:

AccessLogValve:访问日志Valve
ExtendedAccessValve:扩展功能的访问日志Valve
JDBCAccessLogValve:经过JDBC将访问日志信息发送到数据库中;
RequestDumperValve:请求转储Valve;
RemoteAddrValve:基于远程地址的访问控制;
RemoteHostValve:基于远程主机名称的访问控制;
SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
JvmRouteBinderValve:在配置多个Tomcat为以Apache经过mod_proxy或mod_jk做为前端的集群架构中,当指望中止某节点时,能够经过此Valve将用记请求定向至备用节点;使用此Valve,必须使JvmRouteSessionIDBinderListener;
ReplicationValve:专用于Tomcat集群架构中,能够在某个请求的session信息发生更改时触发session数据在各节点间进行复制;
SingleSignOn:将两个或多个须要对用户进行认证webapp在认证用户时链接在一块儿,即一次认证便可访问全部链接在一块儿的webapp;
ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,须要结合ClusterSingleSignOnListener进行工做;
 

 

RemoteHostValve和RemoteAddrValve能够分别用来实现基于主机名称和基于IP地址的访问控制,控制自己能够经过allow或deny来进行定义,这有点相似于Apache的访问控制功能;以下面的Valve则实现了仅容许本机访问/probe:

<Context path=”/probe” docBase=”probe”>
<Valve className=”org.apache.catalina.valves.RemoteAddrValve”
allow=”127\.0\.0\.1″/>
</Context>

其中相关属性定义有:

1) className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;

2) allow:以逗号分开的容许访问的IP地址列表,支持正则表达式,所以,点号“.”用于IP地址时须要转义;仅定义allow项时,非明确allow的地址均被deny;

3) deny: 以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;

9GlobalNamingResources

应用于整个服务器的JNDI映射,此能够避免每一个Web应用程序都须要在各自的web.xml建立,这在web应用程序以WAR的形式存在时尤其有用。它一般能够包含三个子元素:Environment,Resource、ResourceEnvRef。

10WatchedResource

WatchedResource能够用于Context中监视指定的webapp程序文件的改变,而且可以在监视到文件内容发生改变时从新装载此文件。

11Listener

Listener用于建立和配置LifecycleListener对象,而LifecycleListener一般被开发人员用来建立和删除容器。

12Loader

Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖的类。Loader能够用于Context中控制java类的加载。

13Manager

Manger对象用于实现HTTP会话管理的功能,Tomcat6中有5种Manger的实现:

1) StandardManager

Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫SESSION.ser的文件,并在Tomcat下次启动时读取此文件。

2) PersistentManager

当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧的应用环境来讲比较有用。

3)DeltaManager

用于Tomcat集群的会话管理器,它经过将改变了会话数据同步给集群中的其它节点实现会话复制。这种实现会将全部会话的改变同步给集群中的每个节点,也是在集群环境中用得最多的一种实现方式。

4)BackupManager

用于Tomcat集群的会话管理器,与DeltaManager不一样的是,某节点会话的改变只会同步给集群中的另外一个而非全部节点。

5)SimpleTcpReplicationManager

Tomcat4时用到的版本,过于老旧了。

14Stores

PersistentManager必须包含一个Store元素以指定将会话数据存储至何处。这一般有两种实现方式:FileStore和JDBCStore。

15Resources

常常用于实如今Context中指定须要装载的但不在Tomcat本地磁盘上的应用资源,如Java类,HTML页面,JSP文件等。

16Cluster

专用于配置Tomcat集群的元素,可用于Engine和Host容器中。在用于Engine容器中时,Engine中的全部Host均支持集群功能。在Cluster元素中,须要直接定义一个Manager元素,这个Manager元素有一个其值为org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className属性。同时,Cluster中还须要分别定义一个Channel和ClusterListener元素。

16.一、Channel

用于Cluster中给集群中同一组中的节点定义通讯“信道”。Channel中须要至少定义Membership、Receiver和Sender三个元素,此外还有一个可选元素Interceptor。

16.二、Membership

用于Channel中配置同一通讯信道上节点集群组中的成员状况,即监控加入当前集群组中的节点并在各节点间传递心跳信息,并且能够在接收不到某成员的心跳信息时将其从集群节点中移除。Tomcat6中Membership的实现是org.apache.catalina.tribes.membership.McastService。

16.三、Sender

用于Channel中配置“复制信息”的发送器,实现发送须要同步给其它节点的数据至集群中的其它节点。发送器不须要属性的定义,但能够在其内部定义一个Transport元素。

16.4 Transport

用于Sender内部,配置数据如何发送至集群中的其它节点。Tomcat6有两种Transport的实现:

1) PooledMultiSender

基于Java阻塞式IO,能够将一次将多个信息并发发送至其它节点,但一次只能传送给一个节点。

2)PooledParallelSener

基于Java非阻塞式IO,即NIO,能够一次发送多个信息至一个或多个节点。

16.5 Receiver

用于Channel定义某节点如何从其它节点的Sender接收复制数据,Tomcat6中实现的接收方式有两种BioReceiver和NioReceiver。

 web.xml文件

web.xml基于Java Servlet规范,可被用于每个Java servlet容器,一般有两个存放位置,$CATALINA_BASE/conf和每一个Web应用程序(一般是WEB-INF/web.xml)。Tomcat在deploy一个应用程序时(包括重启或从新载入),它首先读取conf/web.xml,然后读取WEB-INF/web.xml。

Tomcat 的配置层次,各组件之间的关系

<server>
<service>
<connector /> 简单组件,不须要封装
<engine>
<host>
<context>
</context>
</host>
<host>
</host>
</engine>
</service>
</server>

顶级组件:位于整个配置的顶层;<server>

容器类:能够包含其它组件的组件;<service>

链接器组件:链接用户请求至tomcat;<connector />

被嵌套类的组件:位于一个容器当中,不能包含其它组件;

容器类:

engine: 核心容器,catalina引擎,负责经过connector接收用户请求

host: 相似于httpd中的虚拟主机;支持基于FQDN的虚拟主机

context: 最内层的容器类组件,一个context表明一个web应用程序;配置context的主要目的,指定对应的webapp的根目录;还能为webapp指定额外的属性,如部署方式等;

服务:service, 将链接器关联至engine;所以一个service内部能够有多个connector,但只能有一个engine;

顶级组件:server,表示一个运行于JVM中的tomcat实例;

嵌套类组件:

valve: 拦截请求并在将其转至对应的webapp以前进行某种处理操做;能够用于任何容器中;

access log valve: 响应前先记录日志

remote address filter value: 基于IP作访问控制

logger: 日志记录器,用于记录组件 内部的状态信息;

可用于除context以外的任何容器中

realm: 能够用于任何容器类的组件中,关联一个用户认证库,实现认证和受权;

UserDatabaseRealm: 使用JNDI自定义的用户认证库;

MemoryRealm: tomcat-users.xml中

JDBCRealm: 基于JDBC链接至数据库中查找用户;

webapp体系结构:

webapp有特定的组织格式,是一种层次型目录结构;一般包含了servlet代码文件、jsp页面文件、类文件、部署描述符文件等等,通常会打包成归档格式;

/: web应用程序的根目录 ,ROOT为根目录

/WEB-INF: 包含当前webapp的deploy描述符,如全部的servlets和JSP等动态文件的详细信息,会话超时时间和数据源等;所以,其也一般用于定义当前webapp特有的资源,一般web.xml和context.xml均放置于此目录;

/WEB-INF/classes: 包含全部服务器端类及当前应用程序相关的其它第三方类等;;

/WEB-INF/lib: 包含JSP所用到的JAR文件,此webapp自有可以被打包为jar格式的类;

Tomcat的链接器分为两类:HTTP链接器和Web服务器链接器。

Tomcat的HTTP链接器有三种:

1) 基于java的HTTP/1.1链接器,这也是Tomcat6默认使用的链接器,即Coyote;它是Tomcat做为standalone模式工做时所用到的链接器,可直接响应来自用户浏览器的关于JSP、servlet和HTML的请求;此链接器是一个Java类,定义在server.xml当中,默认使用8080端口;

2) Java开发的高性能NIO HTTP/1.1链接器,它支持非阻塞式IO和Comnet,在基于库向tomcat发起请求时,此链接器表现不俗;但其实现不太成熟,有严重bug存在;

3) C/C++开发的native APR HTTP/1.1链接器;在负载较大的场景中,此链接器能够提供很是好的性能;APR即Apache Portable Runtime,它是一个能让开发者采用与平台无关的风格的方式来开发C/C++代码本地库,它可以很好的跨Windows, Linux和Unix平台工做。此链接器从三个主要方面优化了系统性能并提高了系统的伸缩能力:

(1)使用sendfile()内核模式调用发送大的静态文件;

(2) 仅使用一个native code保持大量的链接;

(3) 使用可以加速SSL请求处理的OpenSSL本地代码;

启用APR链接器的条件:

1) 将链接器的protocol属性设定为org.apache.coyote.http11.Http11AprProtocol,即 2) APR的库文件已经在系统库文件的搜索路径内,必须额外编译安装apr;

基于链接器提升Tomcat性能的方法:

1) 设置tcpNoDelay属性值为“true”;

2) 经过maxKeepAliveRequest属性调整容许keep-alive功能的请求的最大数目,值为1时表示禁用;

3) 调整socketBuffer属性的值以改变套接字缓冲的大小;

4) 将enableLookups设置为false以禁用DNS反解;

5) Tomcat是一个多线程的Servlet容器,使用线程池能对服务器性能带去很大影响;这主要经过maxThreads、maxSpareThreads和minSpareThreads来定义;

6) 经过JAVA_OPTS,如-Xms和-Xmx设定JVM相关的参数以定义其使用内存的能力;

AJP(Apache JServ Protocol)链接器 :AJP是面向数据包的基于TCP/IP的协议,它在Apache和Tomcat的实例之间提供了一个专用的通讯信道。目前经常使用AJP协议的版本是1.3,它主要有如下特征:

1) 在快速网络有着较好的性能表现,支持数据压缩传输;

2) 支持SSL,加密及客户端证书;

3) 支持Tomcat实例集群;

4) 支持在apache和tomcat之间的链接的重用;

四,配置Tomcat

定义虚拟主机,将虚拟主机定义在/www/webapps 下,在配置文件中的 Engine 组件中添加:

<Host name=”ttlsa.com” appBase=”/www/webapps”
unpackWARs=”true” autoDeploy=”true”>
<Context path=”” docBases=”” />
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”ttlsa_access_log.” suffix=”.txt”
pattern=”%h %l %u %t &quot;%r&quot; %s %b” />
</Host>

注释掉上面的虚拟主机,修改server.xml,做以下修改,在/webapps/目录下建立test目录,并添加测试页面index.jsp:

<Host name=”buy.ttlsa.com” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”>
<Context path=”” docBase=”test” reloadable=”true” />

<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”prefix=”buy_access_log.” suffix=”.txt”pattern=”%h %l %u %t &quot;%r&quot; %s %b” /></Host>

相关文章
相关标签/搜索