导读 | tomcat安装配置详解第三部分,配置文件详解及tomcat配置 |
三,配置文件详解html
四、Engine组件前端
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine须要defaultHost属性来为其定义一个接收全部发往非明肯定义虚拟主机的请求的host组件。如前面示例中定义的:java
<Engine name=”Catalina” defaultHost=”localhost”>mysql
经常使用的属性定义:linux
defaultHost:Tomcat支持基于FQDN的虚拟主机,这些虚拟主机能够经过在Engine容器中定义多个不一样的Host组件来实现;但若是此引擎的链接器收到一个发往非非明肯定义虚拟主机的请求时则须要将此请求发往一个默认的虚拟主机进行处理,所以,在Engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名;web
name:Engine组件的名称,用于日志和错误信息记录时区别不一样的引擎;正则表达式
Engine容器中能够包含Realm、Host、Listener和Valve子容器。sql
五、Host组件数据库
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:apache
<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>
六、Context组件:
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。
七、Realm组件
一个Realm表示一个安全上下文,它是一个受权访问某个给定Context的用户列表和某用户所容许切换的角色相关定义的列表。所以,Realm就像是一个用户和组相关的数据库。定义Realm时唯一必需要提供的属性是classname,它是Realm的多个不一样实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
<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” />
八、Valve组件
Valve相似于过滤器,它能够工做于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内能够创建多个Valve,并且Valve定义的次序也决定了它们生效的次序。Tomcat6中实现了多种不一样的Valve: AccessLogValve:访问日志Valve ExtendedAccessValve:扩展功能的访问日志Valve JDBCAccessLogValve:经过JDBC将访问日志信息发送到数据库中; RequestDumperValve:请求转储Valve; RemoteAddrValve:基于远程地址的访问控制; RemoteHostValve:基于远程主机名称的访问控制; SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;
<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;
九、GlobalNamingResources
应用于整个服务器的JNDI映射,此能够避免每一个Web应用程序都须要在各自的web.xml建立,这在web应用程序以WAR的形式存在时尤其有用。它一般能够包含三个子元素:Environment,
Resource、
ResourceEnvRef。
十、WatchedResource
WatchedResource能够用于Context中监视指定的webapp程序文件的改变,而且可以在监视到文件内容发生改变时从新装载此文件。
十一、Listener
Listener用于建立和配置LifecycleListener对象,而LifecycleListener一般被开发人员用来建立和删除容器。
十二、Loader
Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖的类。Loader能够用于Context中控制java类的加载。
1三、Manager
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时用到的版本,过于老旧了。
1四、Stores
PersistentManager必须包含一个Store元素以指定将会话数据存储至何处。这一般有两种实现方式:FileStore和JDBCStore。
1五、Resources
常常用于实如今Context中指定须要装载的但不在Tomcat本地磁盘上的应用资源,如Java类,HTML页面,JSP文件等。
1六、Cluster
专用于配置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 "%r" %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 "%r" %s %b” /> </Host>
本文原创地址:https://www.linuxprobe.com/tomcat-install-configure3.html