(原创)tomcat 的优化配置

Tomcat 的优化配置

一,简化应用:

webapps与server/wenapps下的应用,减少启动的应用,提高安全性。

 

# 删除webapps下所有文件

# rm –fr $CATALINA_HOME/webapps/*

# 删除server/wenapps下所有文件

# rm –fr $CATALINA_HOME/server/webapps/*

二,精简server.xml配置文件:

原始server.xml配置文件

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <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 name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>
    </Engine>
  </Service>
</Server>

1部分:<Server>

1,portTomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.

2,shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置

 

 

2部分:<Listener>

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

 

 

3部分:<GlobalNamingResources>定义服务器的全局JNDI资源

其中<Environment>元素,<Resource>元素,<Resourceparams>元素

<Environment>元素的有效属性所如下:

属性

描述

description

环境条目的文字描述(可选)

name

环境条目的名称,相对于java:comp/env context

override

如果不希望/WEB-INF/web.xml中具有相同名称的<env-entry>覆盖这里指定的值,设为false。缺省值为true

type

环境条目的Java类名的全称./WEB-INF/web.xml中,<env-entry-type>必须是如下的值:java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, or java.lang.String.

value

通过JNDI context请求时,返回给应用的参数值。这个值必须转换成type属性定义的Java类型

配置命名的值,这些值作为环境条目资源(Environment Entry Resource),对整个web应用可见。

 

<Resource>元素的有效属性如下:

Attribute

Description

auth

指定是web应用代码本身sign on到对应的resource mananger,还是由container代表web应用sign onresource manager。该属性的值必须是Application或者Container。如果在web application deployment descriptor中使用<resource-ref>,这个属性是必需的,如果使用<resource-env-ref>,这个属性是可选的。

description

资源的文字描述(可选)

name

资源的名称,相对于java:comp/env context

scope

指定通过这个resource manager得到的连接是否共享。该属性的值必须是Shareable或者Unshareable。缺省情况下,假定连接是共享的。

type

web应用查找该资源的时候,返回的Java类名的全称。

定义资源的特性;类似于/WEB-INF/web.xml中定义资源的特性

使用JNDI查找<resource-ref><resource-env-ref>元素时,这些特性被返回。对同一资源名称,还必须定义资源参数(见下面“资源参数”小节),这些参数用来配置对象工厂(object factory)以及对象工厂的属性。

比如,你可以按照如下方式创建资源定义:

<GlobalNamingResources ...> 
... 
<Resource name="jdbc/EmployeeDB" auth="Container"   
  type="javax.sql.DataSource" 
  description="Employees Database for HR Applications"/> 
... 
</GlobalNamingResources> 

 

 

  

这等价于在/WEB-INF/web.xml中包含如下元素:

 

区别是,前者不需要修改deployment descriptor来定制这个值。

 

 

<Resourceparams>元素的有效属性如下:

属性

描述

name

配置的资源名称,相对于java:comp/env context。这个名称必须与$CATALINA_HOME/conf/server.xml中某个<Resource>元素定义的资源名称匹配,或者在/WEB-INF/web.xml中通过<resource-ref>或者<resource-env-ref>元素应用。

资源参数(Resource Parameters

资源参数用来配置资源管理器(resource manager,或对象工厂,object factory)。在做JNDI查找时,资源管理器返回查找的对象。在资源可以被访问之前,对<Context><DefaultContext>元素的每个<Resource>元素,或者/WEB-INF/web.xml中定义的每个<resource-ref><resource-env-ref>元素,都必须定义资源参数。

资源参数是用名称定义的,使用的资源管理器(或者object factory)不同,参数名称的集合也不一样。这些参数名和工厂类的JavaBeans属性相对应。JNDI实现通过调用对应的JavaBeans属性设置函数来配置特定的工厂类,然后通过lookup()调用使得该实例可见。

 

一个JDBC数据源的资源参数可以按照如下方式定义:

 

  

如果你需要为某个特定的资源类型指定工厂内的Java类名,在<ResourceParams>元素中嵌套一个叫做factory<parameter>条目。 

 

 

4部分:<Service>

该元素由org.apache.catalina.Service接口定义,它包含一个<Engine>元素,以及一个或多个<Connector>,这些Connector元素共享用同一个Engine元素

 

 

5部分:<Connector>

每个Service元素只能有一个Engine元素.元素处理在同一个<Service>中所有<Connector>元素接收到的客

户请求.org.apahce.catalina.Engine接口定义.

Connector接口定义.<Connector>元素代表与客户程序实际交互的给件,它负责接收客户请求,以及向客户返回响应结果.

 

<Connector port ="8080" maxThread ="50" 
  minSpareThreads ="25" maxSpareThread ="75" 
  enableLookups ="false" redirectPort ="8443" 
  acceptCount ="100" debug ="0" 
  connectionTimeout ="20000" 
  disableUploadTimeout ="true" /> 

<Connection port ="8009" enableLookups ="false" 
  redirectPort ="8443" debug ="0" protocol ="AJP/1.3" />

 

 

 第一个Connector元素定义了一个HTTP Connector,它通过8080端口接收HTTP请求;第二个Connector元素定义了一个JD Connector,它通过8009端口接收由其它服务器转发过来的请求.

Connector元素共用属性

1>    className指定实现Connector接口的类

2>    enableLookups如果设为true,表示支持域名解析,可以把IP地址解析为主机名.WEB应用中调用request.getRemoteHost方法返回客户机主机名.默认值为true

3>    redirectPort指定转发端口.如果当前端口只支持non-SSL请求,在需要安全通信的场命,将把客户请求转发至SSLredirectPort端口HttpConnector元素的属性

4>    className实现Connector的类

5>    port设定Tcp/IP端口,默认值为8080,如果把8080改成80,则只要输入http://localhost 即可因为TCP/IP的默认端口是80

6>    address如果服务器有二个以上ip地址,此属性可以设定端口监听的ip地址.默认情况下,端口会监听服务器上所有的ip地址

7>    bufferSize设定由端口创建的输入流的缓存大小.默认值为2048byte

8>    protocol设定Http协议,默认值为HTTP/1.1

9>    maxThreads设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200

10>acceptCount设定在监听端口队列的最大客户请求数量,默认值为10.如果队列已满,客户必须等待.

11>connectionTimeout定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间

 

JkConnector的属性

1>    className实现Connector的类

2>    port设定AJP端口号

3>    protocol必须设定为AJP/1.3

 

 

6部分:<Engine>

< Engine  name ="Catalina"  defaultHost ="localhost"  debug ="0" >

1>    className指定实现Engine接口的类,默认值为StandardEngine

2>    defaultHost指定处理客户的默认主机名,<Engine>中的<Host>子元素中必须定义这一主机

3>    name定义Engine的名字在<Engine>可以包含如下元素<Logger>, <Realm>, <Value>, <Host> 

 

 

<Host>元素
它由Host接口定义.一个Engine元素可以包含多个<Host>元素.每个<Host>的元素定义了一个虚拟主机.
包含了一个或多个Web应用.

  < Host  name ="localhost"  debug ="0"  appBase ="webapps"  unpackWARs ="true"  autoDeploy ="true" >

1>    className指定实现Host接口的类.默认值为StandardHost

2>    appBase指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于   <CATALINA_HOME>的相对目录.如果没有此项,默认为<CATALINA_HOME>/webapps

3>    autoDeploy如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用

4>    unpackWARs如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件

5>    alias指定主机别名,可以指定多个别名

6>    deployOnStartup如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用中的server.xml没有相应的<Context>元素,将采用Tomcat默认的Context

7>    name定义虚拟主机的名字在<Host>元素中可以包含如下子元素<Logger>, <Realm>, <Value>, <Context>

 

<Context>元素

它由Context接口定义.是使用最频繁的元素.每个<Context元素代表了运行在虚拟主机上的单个Web应用.

一个<Host>可以包含多个<Context>元素.每个web应用有唯一的一个相对应的Context代表web应用自身.servlet容器为第一个web应用创建一个ServletContext对象.

< Context  path ="/sample"  docBase ="sample"  debug ="0"  reloadbale ="true" >

1>    className指定实现Context的类,默认为StandardContext

2>    path指定访问Web应用的URL入口,注意/myweb,而不是myweb了事

3>    reloadable如果这个属性设为true, Tomcat服务器在运行状态下会监视在WEB-INF/classesWeb-INF/lib目录CLASS文件的改运.如果监视到有class文件被更新,服务器自重新加载Web应用

4>    cookies指定是否通过Cookies来支持Session,默认值为true

5>    useNaming指定是否支持JNDI,默认值为了true<Context>元素中可以包含如下元素

<Logger>, <Realm>, <Resource>, <ResourceParams>

三,优化JDK
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%;建议设置[[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。

本例使用加入环境变量的方式:
# vi /etc/profile

加入:export JAVA_OPTS=”$JAVA_OPTS -Xms700 –Xmx700
# source /etc/profile

实际完整的server.xml文件,等再整理好上传。

 

 

猜你喜欢

转载自ciding.iteye.com/blog/1198791