1 Tomcat目录结构
要部署使用tomcat,则必须了解tomcat的目录结构以及各目录的作用。这里以tomcat7为例,进入tomcat安装目录下:
|-- bin 执行脚本目录;
| |-- bootstrap.jar tomcat启动时所依赖的一个类,在启动tomcat时会发现Using CLASSPATH: 是加载的这个类;
| |-- catalina-tasks.xml 定义tomcat载入的库文件,类文件;
| |-- catalina.bat
| |-- catalina.sh tomcat单个实例在Linux平台上的启动/关闭脚本;
| |-- commons-daemon-native.tar.gz jsvc工具,可以使tomcat以守护进程方式运行,需单独编译安装;
| |-- commons-daemon.jar jsvc工具所依赖的java类;
| |-- configtest.bat
| |-- configtest.sh tomcat检查配置文件语法是否正确的Linux平台脚本;
| |-- cpappend.bat
| |-- daemon.sh tomcat已守护进程方式运行时的,启动,停止脚本;
| |-- digest.bat
| |-- digest.sh
| |-- setclasspath.bat
| |-- setclasspath.sh
| |-- shutdown.bat
| |-- shutdown.sh tomcat服务在Linux平台下关闭脚本;
| |-- startup.bat
| |-- startup.sh tomcat服务在Linux平台下启动脚本;
| |-- tomcat-juli.jar
| |-- tomcat-native.tar.gz 使tomcat可以使用apache的apr运行库,以增强tomcat的性能需单独编译安装;
| |-- tool-wrapper.bat
| |-- tool-wrapper.sh
| |-- version.bat
| |-- version.sh 查看tomcat以及JVM的版本信息;
|-- conf 顾名思义,配置文件目录;
| |-- catalina.policy Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力,比如:配置tomcat对文件系统中目录或文件的读、写执行等权限,及对一些内存,session等的管理权限;
| |-- catalina.properties Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat在启动时会事先读取此文件的相关设置;
| |-- context.xml tomcat的默认context容器,所有host的默认配置信息;
| |-- logging.properties Tomcat通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;
| |-- server.xml tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;
| |-- tomcat-users.xml Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;
| |-- web.xml 为不同的Tomcat配置的web应用设置缺省值的文件,遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
|-- lib 运行需要的库文件(JARS),包含被Tomcat使用的各种各样的jar文件。在Linux/UNIX上,任何这个目录中的文件将被附加到Tomcat的classpath中;
|-- logs 日志文件默认存放目录;
| |-- localhost_access_log.2013-09-18.txt 访问日志;
| |-- localhost.2013-09-18.log 错误和其它日志;
| |-- manager.2013-09-18.log 管理日志;
| |-- catalina.2013-09-18.log Tomcat启动或关闭日志文件;
|-- temp 临时文件存放目录;
| |-- safeToDelete.tmp
|-- webapps tomcat默认存放应用程序的目录,好比apache的默认网页存放路径是/var/www/html一样;
| |-- docs tomcat文档;
| |-- examples tomcat自带的一个独立的web应用程序例子;
| |-- host-manager tomcat的主机管理应用程序;
| | |-- META-INF 整个应用程序的入口,用来描述jar文件的信息;
| | | |-- context.xml 当前应用程序的context容器配置,它会覆盖tomcat/conf/context.xml中的配置;
| | |-- WEB-INF 用于存放当前应用程序的私有资源;
| | | |-- classes 用于存放当前应用程序所需要的class文件;
| | | |-- lib 用于存放当前应用程序所需要的jar文件;
| | | |-- web.xml 当前应用程序的部署描述符文件,定义应用程序所要加载的servlet类,以及该程序是如何部署的;
| |-- manager tomcat的管理应用程序;
| |-- ROOT 指tomcat的应用程序的根,如果应用程序部署在ROOT中,则可直接通过http://ip:port 访问到;
|-- work 用于存放JSP应用程序在部署时编译后产生的class文件;
2 Tomcat模块结构
前端请求被tomcat直接接收或者由前端的代理,通过HTTP,或者AJP代理给Tomcat,此时请求被tomcat中的connector接收,不同的connector和Engine被service组件关联起来,在一个Engine中定义了许多的虚拟主机,由Host容器定义,每一个Host容器代表一个主机,在各自的Host中,又可以定义多个Context,用此来定义一个虚拟主机中的多个独立的应用程序。
3 Tomcat server.xml配置
Tomcat Server的结构图如下:
3.1 conf/server.xml配置
www.test.com
看上去很复杂。其实,大部分都是注释。下面是一个简图说明了各组件之间的关系!
|-- Server
| |-- Listener
| |-- GlobalNamingResources
| | |-- Resource
| |-- Service
| | |-- Connector
| | |-- Engine
| | | |-- Realm
| | | |-- Host
| | | | |-- Alias
| | | | |-- Context
| | | | |-- Value
上面列出的比较常用的组件元素,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等等。
由以上配置不难看出存在的一个问题。如果我们想要对其中一个应用程序的配置做一些修改,那么就必须重新启动tomcat,那样势必就会影响到另外两个应用程序的正常服务。因此以上配置是不适合线上使用的,因此需要将其配置为多实例,每个实例只跑一个独立的应用程序,那样我们应用程序之间就不会在互相受到影响。但是我们将面临这样一个问题,80端口只能被一个HTTP/1.1 Connector监听,而三个tomcat实例则至少需要3个HTTP/1.1 Connector,这样我们就需要一个前端代理做分发处理,接收HTTP 80端口的请求,按域名通过每个tomcat实例的AJP/1.3 Connector传递请求。而前端的代理选择apache,基于这样的思路,我们还可以做到tomcat的负载均衡,而且apache会将接收的HTTP超文本传输报文重新封装成二进制格式通过AJP/1.3 协议传递给后端的tomcat处理,在效率上也是有明显的提升。
3.2 server.xml组件元素
元素
这会让Tomcat启动一个server实例(即一个JVM),它监听在8005端口以接收shutdown命令。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。这个端口的定义用于为管理员提供一个关闭此实例的便捷途径,因此,管理员可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过,基于安全角度的考虑,这通常不允许远程进行。
该元素代表整个容器,是Tomcat实例的顶层元素。由org.apache.catalina.Server接口来定义。它包含一个或多个
className:指定实现org.apache.catalina.Server接口的类。默认值为: org.apache.catalina.core.StandardServer;
port:指定Tomcat监听shutdown命令端口。终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令。该属性是必须的;
shutdown:指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串。该属性必须设置;
元素
Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站请求交将其转发至关联的引擎进行处理。因此,Service要包含一个引擎、一个或多个连接器。
该元素由org.apache.catalina.Service接口定义,它包含一个
// 第一个处理所有直接由Tomcat服务器接收的web客户请求
// 第二个处理所有由Apahce服务器转发过来的Web客户请求
className:指定实现org.apahce.catalina.Service接口的类。默认为:org.apahce.catalina.core.StandardService;
name:定义Service的名字,此名字也会在产生相关的日志信息时记录在日志文件当中,默认为Catalina;
元素
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。
每个Service元素只能有一个Engine元素。元素处理在同一个
className:指定实现Engine接口的类,默认值为StandardEngine;
defaultHost:指定处理客户的默认主机名,在
中的 子元素中必须定义这一主机;定义一个接收所有发往非明确定义虚拟主机的请求的host组件; name:定义Engine的名字;
在
可以包含如下元素 , , , , ;
元素
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机。
它由Host接口定义。一个Engine元素可以包含多个
className:指定实现Host接口的类。默认值为StandardHost
appBase:指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于
的相对目录。如果没有此项,默认为 /webapps; autoDeploy:如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用;
unpackWARs:如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行。如果设为false将直接运行为WAR文件;
alias:指定主机别名,可以指定多个别名;
deployOnStartup:如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用;
如果Web应用中的server.xml没有相应的
元素,将采用Tomcat默认的Context; name:定义虚拟主机的名字;
在
元素中可以包含如下子元素: , , , ;
元素
Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序。
它由Context接口定义。是使用最频繁的元素。每个
className:指定实现Context的类,默认为StandardContext类;
docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系,比如,如果appBase为deploy,而docBase绝不能为deploy-bbs类的名字;
path:指定访问Web应用的URL入口,注意/myweb,而不是myweb了事;
reloadable:如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classes和Web-INF/lib目录CLASS文件的改动。如果监视到有class文件被更新,服务器自重新加载Web应用;
cookies:指定是否通过Cookies来支持Session,默认值为true;
useNaming:指定是否支持JNDI,默认值为了true;
在
元素中可以包含如下元素: , , , ;
元素
由Connector接口定义。
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
HTTP连接器
SSL连接器
AJP 1.3连接器
proxy连接器
Connector元素共用属性:
className:指定实现Connector接口的类;
enableLookups:如果设为true,表示支持域名解析,可以把IP地址解析为主机名。WEB应用中调用request.getRemoteHost方法返回客户机主机名。默认值为true;
redirectPort:指定转发端口。如果当前端口只支持non-SSL请求,在需要安全通信的场命,将把客户请求转发至SSL的redirectPort端口;
HttpConnector元素的属性:
className:指定实现Connector的类;
port:设定Tcp/IP端口,默认值为8080,如果把8080改成80,则只要输入
http://localhost
即可,因为TCP/IP的默认端口是80;address:如果服务器有二个以上ip地址,此属性可以设定端口监听的ip地址。默认情况下,端口会监听服务器上所有的ip地址;
bufferSize:设定由端口创建的输入流的缓存大小。默认值为2048byte;
protocol:设定Http协议,默认值为HTTP/1.1;
maxThreads:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目。默认值为200;
acceptCount:设定在监听端口队列的最大客户请求数量,默认值为10。如果队列已满,客户必须等待;
connectionTimeout:定义建立客户连接超时的时间。如果为-1,表示不限制建立客户连接的时间;
AJP Connector的属性:
className:指定实现Connector的类;
port:设定AJP端口号;
protocol:必须设定为AJP/1.3;
4 Tomcat一个服务,配置多个端口号
即一个service配置多个端口,项目可以通过多个端口访问。修改tomcat-home\conf下的server.xml,在Service下配置多个
在这个应用里,可以用8080端口号访问服务,也可以用8099端口号来访问服务; 服务放置的路径由host决定,上例中服务放在webapps下。
5 Tomcat多个服务,配置不同端口号
即配置多个service,每个service可以配置多个端口。修改tomcat-home\conf下的server.xml,添加多个Service即可。
注意:Service name、Engine name、appBase,端口号别忘了修改,以免重复。
以上三个service,发布的路径不同,项目分别发布在webapps、webapps1、webapps2下,访问不同的项目的方法:
http://localhost:8080/项目名称1
http://localhost:8099/项目名称2
http://localhost:8088/项目名称3
6 Tomcat优化配置
6.1 精简Tomcat和配置文件
- 删除不需要的管理应用和帮助应用,提高tomcat安全性
删除webapps下所有文件:rm –fr $CATALINA_HOME/webapps/*
删除server/webapps下所有文件:rm –fr $CATALINA_HOME/server/webapps/*
- 精简sever.xml配置文件
使用tomcat发布版本中的最小配置文件,提高性能,如果有功能上的需求,在逐个的加入功能配置。
备份原来的server.xml为server.xml_bak:mv server.xml server.xml_bak
复制server-minimal.xml为server.xml:cp server-minimal.xml server.xml
6.2 连接器优化
在$CATALINA_HOME/conf/server.xml配置文件中的Connetctor节点,和连接数相关的参数配置和优化。
- maxThreads
Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。 可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。
- acceptCount
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。
- minSpareThreads
Tomcat初始化时创建的线程数。默认值4。
- maxSpareThreads
一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。
- enableLookups
是否反查域名,默认值为true。为了提高处理能力,应设置为false。
- connnectionTimeout
网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
- maxKeepAliveRequests
保持请求数量,默认值100。
- bufferSize
输入流缓冲大小,默认值2048 bytes。
- compression
压缩传输,取值on/off/force,默认值off。
其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
配置示例:
6.3 JVM优化
Tomcat默认可以使用的内存为128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS="$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]"
# 或设置环境变量
export JAVA_OPTS="$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]
一般说来,你应该使用物理内存的 80% 作为堆大小。如果本机上有Apache服务器,可以先折算Apache需要的内存,然后修改堆大小。建议设置为70%;建议设置[初始化内存大小]等于[可以使用的最大内存],这样可以减少频繁分配堆而降低性能。
6.4 其他优化配置
- Tomcat中如何禁止和允许列目录下的文件
在$CATALINA_HOME/conf/web.xml中,把listings参数设置成false即可,如下:
default
org.apache.catalina.servlets.DefaultServlet
debug
0
listings
false
1
参考
WEB请求处理四:Tomcat配置实践