您的位置:首页 > 运维架构 > Tomcat

Tomcat结构介绍,server.xml配置详解,连接器并发,乱码解决,虚拟主机配置,项目部署方式。

2014-11-11 15:09 856 查看
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中的配置示例

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"/>

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"即可。重写启动服务就可以完成部署了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: