1. Tomcat简介
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运行时的临时文件。
1.2 启动时的jdk和jvm参数:
在catalina.bat文件的开头设置如下
set JAVA_HOME=jdk路径
set JAVA_OPTS =jvm参数
一般情况下,设置-Xms=-Xmx、-XX:PermSize=-XX:MaxPermSize,正式服务器必须设置以上参数,以尽可能压榨服务器性能。相关参数取值需要根据实际情况考虑,不要超过(物理内存-其他程序内存)的80%即可。
例如:
set JAVA_HOME=C:\Java\jdk1.8.0_25
set JAVA_OPTS =-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
1.3 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
1.4.2 运行日志:
在缺省配置下,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,以避免生成一些冗余的空日志文件。
2. server.xml的结构图
<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层。
3. server.xml配置详解
<?xml version='1.0' encoding='utf-8'?>
<!--每个tomcat的server.xml中只有这么一个Server结点,属于顶层类元素,旗下主要元素是service-->
<Server port="8005" shutdown="SHUTDOWN">
<
Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- 安全监听器. Documentation at /docs/config/listeners.html
<
Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<
Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- 防止内存泄露 java/javax APIs-->
<
Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<
Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<
Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- 配置全局JNDI-->
<GlobalNamingResources>
<Resource name="UserDatabase" auth="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旗下主要有两个非常重要的元素结点:Connector(连接器)和Engine(引擎)-->
<
Service name="Catalina">
<!--连接器主要有两类:HTTP Connector 和 JK Connector
第一个主要是用来直接接收web HTTP请求的
第二个主要是用来接收其他HTTP服务器转发过来的客户请求
-->
<!--1. 普通 HTTP/1.1 协议的 Connector,这个是最常用的连接器, 它是用来接受客户请求的,可以在这个元素里面配置超时,重定向等等-->
<
Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!--安全的 SSL HTTP/1.1协议的 Connector,这个和上一个普通HTTP/1.1的Connector不能同时存在-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!--2. AJP/1.3协议的 Connector,这个是用来处理Apache服务器转发过来的web客户请求-->
<
Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--这个 Engine 不清楚 啥作用-->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<!--3. 引擎是用来处理同一个<Service>下面所有的<Connector>接收到的客户端请求,引擎旗下最重要的结点是虚拟主机即:Host-->
<
Engine name="Catalina" defaultHost="localhost">
<!--配置tomcat集群请参考如下文档
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--集群类名
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- 配置LockOutRealm,防止暴力破解用户密码 -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--4. 虚拟主机Host-->
<!--Host可以配置的元素:
className: 指定实现org.apache.catalina.Host接口的类,默认是org.apache.catalina.core.StandarHost
appBase: 指定虚拟机的主目录,可以使绝对路径也可以是相对于<CATALINA_HOME>的相对路径, 默认是
<CATALINA_HOME>/webapps
uppackWARs: 设置为true时,表示tomcat服务器会先把web应用解压位目录后在运行,如果设置为false则将直接运行war文件
autoDeploy: 设置位true时,表示当tomcat处于运行状态时能够监测appBase目录下的文件如果有新的web应用加入,tomcat会自动发布这个应用
alias: 虚拟主机的别名,可以设置多个。
deployOnStartup: 默认为true,设置为true时表示tomcat启动时会自动发布appBase下的所有的Web应用,如果应用没有在server.xml配置相应的<Context>元素,将会采用默认的Context。
name: 虚拟主机的名字
-->
<
Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--5.
Context 的配置属性解释:
path:web应用的访问URL入口
reloadable: 设置位true时,tomcat服务器运行时会监控WEB_INF/classes 和WEB_INF/lib下的文件改动,如果class文件被更新,服务器会自动重启重新加载Web应用。
cookies: 指定是否通过Cookies来支持Session,默认为true
useNaming: 指定是否支持JNDI,默认为true
-->
<Context path="/officeOA" docBase="webApp文件路径" debug="0" reloadable="true" crossContext="true" workDir="路径" cookies="true" useNaming="true">
<!-- SingleSignOn 共享认证,详细参考
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
4. Tomcat优化
概要:tomcat优化配置主要是优化 两个节点的配置:一个是优化并发能力,通过配置连接器Connector,另一个是优化访问IP,即不通过IP来访问,而是通过域名来访问,这个主要是设置虚拟主机Host。
A: 连接器的配置详解:
Connector基本配置方案
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中的配置示例
- <Connector port="9027"
-
- protocol="HTTP/1.1"
-
- maxHttpHeaderSize="8192"
-
- minProcessors="100"
-
- maxProcessors="1000"
-
- acceptCount="1000"
-
- redirectPort="8443"
-
- disableUploadTimeout="true"/>
调整连接器connector的并发处理能力方案
1.参数说明
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
2.Tomcat中的配置示例
- <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"/>
Tomcat缓存优化方案
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"/>
B 虚拟主机Host配置详解
有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,内容如下:
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目录中。
5. 在tomcat下部署项目
在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"即可。重写启动服务就可以完成部署了。