(原创)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,port为Tomcat监听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 on到resource 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请求,在需要安全通信的场命,将把客户请求转发至SSL的redirectPort端口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/classes和Web-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文件,等再整理好上传。