Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在 Tomcat中得到体现。
尽管Tomcat也可以作为独立的Java Web服务器,但在对静态资源(HTML、图像文件等)的处理速度,Web服务器管理等方面都不如Apache、IIS服务器等其他专业的HTTP服务器,因此在实际应用中,常常把Tomcat与其他的HTTP服务器集成使用。对于不支持Servlet/JSP的HTTP服务器,可以通过Tomcat服务器来运行Servlet/JSP组件。
当Tomcat与其他HTTP服务器集成时,Tomcat服务器的工作模式通常为进程外的Servlet容器,Tomcat服务器与其他HTTP服务器之间通过专门的插件来通信。
1.1 Tomcat的目录结构
$CATALINA_HOME Tomcat安裝目录下面有
- bin: 启动和关闭Tomcat脚本文件。
- conf: Tomcat服务器的各种配置文件,包括:server.xml、web.xml、catalina.policy等。
- lib: Tomcat服务器和所有web应用可以访问的jar包。
- logs: Tomcat的日志文件。
- webapps: Tomcat自带的两个web应用:admin和manager,用来管理Tomcat的Web服务。
- work: JSP经过Tomcat编译后生成的Servlet。
- temp: Tomcat运行时的临时文件。
server.xml:Tomcat中最重要的配置文件,定义了tomcat的体系结构,包括连接器端口、连接数、集群、虚拟目录、访问日志等的设置。编码方式是在Connector连接器的属性:URIEncoding="utf-8"
context.xml:全局context的配置文件,包括JNDI等信息的配置。
tocmat-users.xml:Tocmat管理员身份的配置文件,关键是设置管理员账号的密码。
logging.properties:Tocmat日志配置文件,可以修改默认的Tocmat日志路径和名称。
1.4 日志的配置
1.4.1 访问日志
缺省配置下,Tomcat是不记录访问日志的,可以通过如下配置允许Tomcat记录访问日志:
修改$CATALINA_HOME/server.xml,在Host标签下,找到如下配置信息,去掉两端的注释就会启用访问日志记录功能:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
通过对pattern项的修改,可以改变日志输出的内容。该项值可以为: common 与 combined,对应的日志输出内容如下所示:
common: %h %l %u %t %r %s %b
combined: %h %l %u %t %r %s %b %{Referer}i %{User-Agent}i
pattern 也可以根据需要自由组合, 例如 pattern="%h %l",对 于各 fields 字段的含义请参照Tomcat官方文档。
在不同的环境下,需要设置不同的日志级别,在生产环境中,为了提高效率和稳定性,一般会将日志级别设置为相对较高的级别,而开发环境中为了跟踪程序流程,可以将日志级别调整为较低的级别。不同日志框架有不同的日志级别,
常用的日志框架对应级别如下:
Java.util.logging对应的日志级别由高到低分别为:
severe > warning > info > config > fine > finer > finest
org.apache.log4j对应的日志级别由高到低分别为:
fatal > error > warn > info > debug > trace
在缺省配置下,Tomcat采用Java.util.logging日志框架,对应的配置文件为$CATALINA_HOME/ logging.properties,常用的日志级别设定方法如下:
Catalina日志
默认日志框架:
设置catalina日志的级别为:FINE
catalina.org.apache.juli.FileHandler.level = FINE
禁用catalina日志的输出:
catalina.org.apache.juli.FileHandler.level = OFF
设置catalina所有的日志消息均输出:
catalina.org.apache.juli.FileHandler.level = ALL
Log4j日志框架替换Tomcat缺省采用的java.util.logging日志框架,步骤如下:
a. 创建log4j配置文件log4j.properties ,保存在$CATALINA_HOME/lib 下。
b. 下载log4j.jar、tomcat-juli-adapters.jar、tomcat-juli.jar(下载地址:从Apache官网Log4J项目下载Log4J(1.2版本以后),从Apache官网Tomcat项目下载tomcat-juli.jar和tomcat-juli-adapters.jar。)
c. 复制log4j.jar、tomcat-juli-adapters.jar到$CATALINA_HOME/lib下,
用tomcat-juli.jar覆盖$CATALINA_HOME/bin下的同名文件。
d. 删除Tomcat的缺省日志配置文件$CATALINA_HOME/conf/ logging.properties,以避免生成一些冗余的空日志文件。
<Server>................................Server层
<Service>............................Service层
<Connector/>
<Engine>..........................Engine层
<Host>.........................Host层
<Context/>...............Context层
</Host>
</Engine>
</Service>
<Server>
Server层
对应Server组件,表示整个Tomcat(Catalina Servlet容器),它处于Tomcat顶层,可以包含一个或多个Service层。
Service层
对应Service组件,是Server层中的一个逻辑功能层,包含一个Engine层,以及一个或多个Connector,Service组件将一个或多个Connector组件绑定到Engine层上,Connector组件侦听端口,获得用户请求,并将请求转发到Engine层处理,同时把处理结果转发给用户,从而实现一个特定的功能。
Engine层
对应Engine组件,负责请求分发处理,可以连接多个Connector,它从Connector接收请求后,解析出可以完成用户请求的URL,根据URL可以把请求匹配到正确的Host上,当Host处理完用户请求后,Engine层把结果返回给适合连接器,再由连接器传输给用户。
Host层
对应Host组件,表示一个虚拟主机,一个Engine层可以包含多个Host层,每个Host层可以包含一个或多个Context层,对应不同的web应用。
Context层
对应Context组件,代表某个虚拟主机上的实际目录或一个WAR,即单个Web应用程序,它运行在特定的虚拟主机中,使用最为频繁。一个Host层包含多个Context层,每一个Context都有唯一的路径,Host层接到请求后,根据用户请求的URL,将请求定位到Context层。
1.参数说明
minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10
maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75
acceptCount:允许的最大连接数,应大于等于 maxProcessors ,默认值为 100
enableLookups:是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false
connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为30000 毫秒。
其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是1000 个左右。
2.Tomcat中的配置示例
Xml代码
- <Connector port="9027"
- protocol="HTTP/1.1"
- maxHttpHeaderSize="8192"
- minProcessors="100"
- maxProcessors="1000"
- acceptCount="1000"
- redirectPort="8443"
- disableUploadTimeout="true"/>
调整连接器connector的并发处理能力方案
1.参数说明
maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
2.Tomcat中的配置示例
Xml代码
- <Connector port="9027"
- protocol="HTTP/1.1"
- maxHttpHeaderSize="8192"
- maxThreads="1000"
- minSpareThreads="100"
- maxSpareThreads="1000"
- minProcessors="100"
- maxProcessors="1000"
- enableLookups="false"
- URIEncoding="utf-8"
- acceptCount="1000"
- redirectPort="8443"
- disableUploadTimeout="true"/>
B 虚拟主机Host配置详解1.参数说明
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
2.Tomcat中的配置示例
Xml代码![]()
- <Connector port="9027"
- protocol="HTTP/1.1"
- maxHttpHeaderSize="8192"
- maxThreads="1000"
- minSpareThreads="100"
- maxSpareThreads="1000"
- minProcessors="100"
- maxProcessors="1000"
- enableLookups="false"
- compression="on"
- compressionMinSize="2048"
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
- connectionTimeout="20000"
- URIEncoding="utf-8"
- acceptCount="1000"
- redirectPort="8443"
- disableUploadTimeout="true"/>
有3个web项目,都已打成了war包,分别是aaa.war、bbb.war、ccc.war。
打算配置3个tomcat虚拟主机,分别绑定域名aaa.com、bbb.com、ccc.com。
配置方法如下:
1、在tomcat安装目录,与目录平级的地方,建立3个文件夹,分别是webapps_1/war、webapps_2/war、webapps_3/war,把3个war包分别放入3个war文件夹中。
这里不可以使用tomcat自带的webapps目录,不可以把3个war包放入同一个webapps文件夹,否会导致tomcat加载多次web项目(本例是3次),造成重复启动。
2、修改sever.xml,内容如下:
- <Engine name="Catalina" defaultHost="wwww.aaa.com">
- <Host name="www.aaa.com" appBase="webapps_1" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
- <Alias>aaa.com</Alias>
- <Context path="/" docBase="./war/aaa.war" reloadable="true" />
- </Host>
- <Host name="www.bbb.com" appBase="webapps_2" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
- <Context path="/" docBase="./war/bbb.war" reloadable="true" />
- </Host>
- <Host name="www.ccc.com" appBase="webapps_3" autoDeploy="true" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
- <Context path="/" docBase="./war/ccc.war" reloadable="true" />
- </Host>
- </Engine>
3、关键属性说明:
defaultHost="wwww.aaa.com" 的作用是,如果使用ip来访问,默认进入www.aaa.com网站。
name="www.aaa.com" 的作用是,为当前Host绑定域名www.aaa.com。
appBase="webapps_1" 的作用是,指定应用程序(网站)的基本路径 ,这里可以存放多个程序(网站)。一般是相对路径,相对于tomcat的安装目录。
<Alias>aaa.com</Alias> 的作用是,为一个Host,绑定多个域名。
<Context docBase="./war/aaa.war" 的作用是,aaa.war会被tomcat解包为aaa目录或ROOT目录(具体哪个目录取决于后面的 path参数),docBase作用就是指向aaa目录,这里是相对路径,是相对于前面指定的webapps_1目录。也可以是绝对路径。这里如果不使用子目录,会导致应用程序被启动两次。
<Context path="/" 的作用是,指定 Web应用的 上下文根,本例是Web应用的 上下文根是 /。
windows环境(tomcat6.0.18):如果设置为path="",tomcat会在webappa_1目录中自动生成ROOT目录(里面有还有与aaa目录一样一样的内容),要设置为path=""。
Linux环境(tomcat6.0.33):如果设置为path="",tomcat不会在webappa_1目录中自动生成ROOT目录。而是生成 aaa目录。要设置为path="/"。(有待试验,今天凌晨验证到关键时刻,试验环境出问题了,未继续)。
4、运行过程
tomcat启动时,解压webapps_1/war/aaa.war包到webapps_1/ROOT目录中。
在tomcat下部署项目主要有如下三种方式:
第一种:直接拷贝。将项目下的WebRoot文件夹复制到$CATALINA_HOME\webapps路劲下,命名为qyzygl,启动服务即可,这种方式非常简单,也是想我这样的初学者经常用到的方式。访问地址如下: http://localhost:8080/qyzygl
第二种:这种方式并不需要将项目拷贝到webapps路径下,可以直接F:/路径下部署。方法如下:更改$CATALINA_HOME\conf\server.xml文件,在<host>标签内添加<Context>标签,内容如下:<Context docBase="D:/creator/workspace/qyzygl/WebRoot" reloadable="false" path="/ qyzygl "/>。其中reloadable="false"表示当应用程序中的内容发生更改之后服务器不会自动加载,这个属性在开发阶段通常都设为true,方便开发,在发布阶段应该设置为false,提高应用程序的访问速度。docBase为路径,可以使用绝对路径,也可以使用相对路径,相对路径相对于webapps。 path属性的值是访问时的根地址。访问地址如下: http://localhost:8080/qyzygl
第三种:CATALINA_HOME\conf\Catalina\localhost中添加一个xml文件,如qyzygl.xml,内容如下:<Context docBase="F:/qyzygl" reloadable="false" />大家可能发现和第二种方式差不多,但是缺少了path属性,这种方式服务器会使用.xml的名字作为path属性的值。访问地址如下: http://localhost:8080/qyzygl/
第四种:使用.war文件包
其实前面三种我们一直都是将qyzygl文件部署在服务器中,其实我们可以将应用程序打包成.war包,然后再部署在服务器上。打包步骤如下:
打开cmd命令提示符。
在命令提示框中进入D:/creator/workspace/qyzygl文件中,然后输入如下命令:jar cvf qyzygl.war */.然后提示框会出现非常多的类似于xxx写入之类的,这个过程就是在将qyzygl文件中的内容打包成.war文件,完成之后会在该目录下生成qyzygl.war文件。
部署.war文件非常简单,将.war文件拷贝到webapps文件路径下或者将docBase=” D:/creator/workspace/qyzygl/WebRoot”更改为docBase="F:\qyzygl.war"即可。重写启动服务就可以完成部署了。