01Tomcat配置

当Tomcat做事器安装好并开始运行后,须要对做事器进行一些基本配置,常日关于Tomcat做事器的配置包括两部分:

第一:编辑Tomcat的XML配置文件;

jsp指定表格大小涨薪技巧0到1学会机能测试第53课Tomcat设置装备摆设 NoSQL

第二:确定适当的环境变量;

1) XML配置文件

关于XML配置文件,Tomcat做事器有两个很主要的XML配置文件须要配置:server.xml和web.xml。
常日情形下这两个文件存放Tomcat安装目录下的conf文件夹中。

server.xml文件是Tomcat最紧张的配置文件,该文件紧张是指定Tomcat启动时的初时配置,并定义Tomcat启动和构建的办法。
server.xml文件中包含五类基本种别:顶层元素、连接器、容器、嵌套组件和全局设置
这些种别都有着很多属性,在配置过程中可以对这些值进行微调,常日包括以下几部分的内容:

顶层元素(Top Level Elements)

关于顶层元素紧张包括做事器和做事两类,做事器紧张定义一个单个的Tomcat做事器,紧张包括Logger和ContextManager配置,此外还包括做事器支持的“端口”、“关机”和“类名”属性。
做事则是一个元素,该元素嵌套在一个做事器中,做事包含一个或多个用于共享相同引擎的组件,该组件紧张功能是定义一个单一做事器的组件,做事的名称在“name”属性中指定。

连接器(Connectors)

在做事器标签中可以定义一个或多个连接器,通过Catalina从这些端口向引擎组件发送要求,Tomcat许可定义HTTP和AJP两种连接器,关于这两种连接器将在连接器部分的内容中进行详细先容。

容器(Containers)

这些元素利用Catalina直接处理设备的要求。

高下文(Context)

此元素是一个单一的web运用,并且包含如果查找到最适宜的运用程序资源的路径信息,当Catalina吸收到一个要求后,它利用context去匹配最长的URL,直到找到精确的做事要求元素,context元素为每个元素设置一个最大的嵌套实例,虽然可以通过修正server.xml文件来修正context的内容,但一样平常情形下不应该修正context内容,由于这些配置如果不重启Tomcat做事器不能被加载。

主机(Host)

这个元素嵌套在引擎元素中,用于关联Catalina做事器所在网络中的网络做事器名,这个元素的功能只有在虚拟机注册DNS管理域的过程中才能精确利用,该元素最大的浸染是嵌套别名,可以为同一个虚拟机定义多个不同的别名。

集群(Cluster)

集群元素能够供应高下文属性复制、WAR支配、会话复制并且将其嵌套在一个引擎或主机元素中,虽然可以对这个元素进行配置,但一样平常情形下缺省设置就可以知足用户的需求。

全局命名资源(Global Naming Resources)

这个元素紧张是为一个指定做事器指定全局Java名和目录接口资源,可以在该元素中定义和的查找特色并且可以利用进行链接。
如果利用该技能定义其它的参数,那么必须指定和配置工具属性。

范围(Realm)

这个元素可以被嵌套在任何容器元素中,用于定义数据库用户名、密码和容器的角色,如果嵌套在主机或引擎元素中,那么Realm元素的特色将会继续低级别容器的特性。
Realm元素中最生要的属性是“classmate”,其紧张供应不同类型容器的安全性,并且实现的办法有多种。

资源(Resources)

这个元素紧张是用于通过web运用程序勾引Catalina的静态资源,常见的静态资源有:类、HTML和JSP文件等。

Web.xml文件

Web.xml文件屈服Servlet规范,其紧张包含的信息用于支配和配置web运用程序,如果是第一次配置Tomcat,那么紧张是定义Servlet映射到紧张的部件(如JSP)。
在Tomcat中,这个文件以同样的办法在Servlet规范中描述这些功能。

2) 环境变量

在第一次配置Tomcat时,有几个环境须要进行适当的修正,紧张包括:JAVA_OPTS、CATALINA_HOME、CATALINA_OPTS。

JAVA_OPTS

利用该变量可以定义JVM中堆的大小,堆大小是一个很主要的指标,当在支配一个新的运用程序时,须要设置一个适当的堆大小的值,否则会影响系统性能,同时可以肃清或减小OOME。

CATALINA_HOME

该变量用于指定Tomcat的安装位置,当Tomcat脚本启动时会自动去检讨这个变量的值,以确定设置是否精确,避免运行过程中涌现问题。

CATALINA_OPTS

该变量用于设置Tomcat指定的不同的选项。

除了以上一些配置外,还有两个干系的配置会影响系统性能:DNS查找和JSP编译。

DNS查找

如果web运用做事器须要得到客户真个日志信息,那么常日有两种办法:

一是:记录客户端机器的IP地址;

二是:在DNS中查找客户端主机名信息;

而DNS查询须要网络流量,在查询过程中可能会经历多个做事器的来回查找,但也可能不须要,这样就会导致涌现延迟相应的情形,如果须要肃清这些延迟相应,就必须关闭DNS查询,在HTTP工具中有一个getRemoteHost的方法,通过这个方法可以找到一个唯一的IP地址,关于DNS的选项设置在server.xml文件中的connector(连接器)中设置,源代码如下:

<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --><Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443" acceptCount="10" debug="0" connectionTimeout="20000" useURIValidationHack="false" />

如果须要关闭DNS查找,那么将该选项设置为“false”。
除非须要指定一个完全的主机名去访问网站,否则都须要将该选项设置为“false”,这样不但可以节约带宽、查找韶光和内存。
当然对付低流量的网站,这个设置项可能不会有明显的效果,但是不能打消它某天变成了一个高流量的网站。

JSP编译

在一个JSP页面第一次被访问时,它须要转换为Java servlet源码,并且编译在JAVA字节码,而当许多不同用户同时访问JSP页面时,做事器可能会被处于一种高负载状态,以是该当改进网站对JSP页面的处理方法,进而优化JSP的性能。

1) Tomcat如何处理JSP页面

JSP是Java servlet代码与HTML标记的组合,Tomcat处理JSP是利用一个称为Jasper 2的引擎,该引擎包括各种处理和解析JSP的组件,以及JSP的编译器。
在一个JSP页面第一次被访问时,Jasper引擎会将源码转换为Java servlet源码,并且利用JAVA编译器将其编译成JAVA字节码。

2) 审核动态内容

JSP性能改进的第一步是采纳剖析网站的构造、预期负载和JSP页面须要实现的功能,如果创建的网站中殽杂着动态和静态,当网站可以完成定期更新静态内容时,那么该当是动态处理结束后才多的去处理静态内容,例如网站的标题,这是一个动态的内容,但是一天可能才处理一两次。

现在办理动态审核问题不完备是利用,现在有一些开源于JAVA模板来办理这个问题(如Velocity或Freemarker),在未来可能会成为一个新的功能。

3) JSP预编译技能

当做事器运行JSP页面时做事器会利用最大的性能来编译JSP页面,如果缓解这一问题,一样平常会对JSP进行预编译操作,而不是等运行时才进行实时的编译。
常日有以下三种预编译的方法来提高系统的性能。

第一:利用要求进行预编译

预编译的一次最大略的方法是,在发送要求的过程中进行预编译,由于在第一次发送要求时,JSP会自动进行编译,这样在第一个真实的用户访问该JSP页面时就不须要再编译了,如果只少数JSP页面,并且不须要频繁的启动做事器,这样可以在做事器启动时,利用一个小脚本自动爬行所有的JSP页面,这样可以大大的提高性能。
这个方法在开拓过程中很有用,由于这种方法可以查找是那些用户第一韶光访问JSP页面,并且可以纠正一些缺点。

第二:启动时进行预编译

JAVA中有一个Java servlet的模块,它包括JSP指定的一些功能和语法元素,这些语法在Web运用程序启动时会指定JSP进行编译,在“WEB-INF/web.xml”文件中可以对JSP进行预编译设置,如以下实例:

<web-app ...> <servlet> <servlet-name> YourJSP.jsp </servlet-name> <jsp-file> /path/to/yourjsp.jsp </servlet-name> <load-on-startup> 1 </load-on-startup> </servlet> </web-app>

整数“1”是用来指定编译序顺的,以是可以为预编译创建一个层次构造,这样可以肃清第一个用户访问预编译页面的韶光延迟,降落web程序重启的所须要的资源。

第三:在编译过程中进行预编译

在编译过程中进行预编译是指在构建Web运用程序时,利用JspC进行预编译JSP代码,而不是在Tomcat做事器上进行动态编译,在一些情形中下这种技能可以提高4%的系统性能。

JSP最佳实践

前面先容了通过修正Tomcat配置文件来提高JSP性能,而遵守一些编码规则也可以提高JSP的性能,常日有两种方法:高效缓存和工具掌握。

第一:在代码中如何有效提高JSP原始的缓存数据可以有效的提高性能,即如何有效的利用缓存中的数据或如何高效利用缓存方法来处理数据。

第二:目标掌握,紧张包括会话长度/范围、线程池配置和缓存区大小。

1) JSP数据缓存

如果JSP页面已经产生了一些静态或动态内容,那么这种情形不要它再涌现,由于它可以通过会话或运用程序调用缓存数据,为了得到安全的动态内容,这样会重复利用所有活动会话。

天生静态文件利用了一次_jsplnit()方法,同时利用_jspService方法对数据进行备份,但不在每次要求页面时利用out.print()。
缓存中的动态数据有4个持久机制,Tomcat原始的持久机制、cookies、URL重写和隐蔽区域。

常日的一个办理方案是,平衡客户端和做事器间的负载、安全缓存(Tomcat持续支持安全的存储数据)和处理隐蔽区域。

2) 工具掌握

在关闭会话、重新利用标签和配置缓存区时,很随意马虎摧残浪费蹂躏做事器CPU韶光周期,特殊是在清理JSP代码时须要考虑这个问题,以是可以考虑移除大数据和关闭会话、工具。
在全体页面天生过程中一次性移除大数据(如图片),常日利用flush()方法移除,并且该当考虑设置缓存大小。
在掌握工具时,JSP包括处理会话、伶仃工具和饥饿内存的处理机制,如超时和序列化。

02连接器配置

接连器元素是Tomcat用于连接外部程序的,其许可Catalina接管要求,传送到Web运用程序,将天生的动态信息通过连接器返回到Tomcat做事器。

Tomcat的连接器包括两种:HTTP和AJP。

每个连接器元素都有一个端口,Tomcat会通过这个端口来监听要求,并且会为做事器和引擎中的连接器元素设置等级,这样管理员可以通过创建逻辑构造来管理这些数据流。
此外,用户的要求通过路由器可以找到相应的做事器,连接器通过连接可以将Tomcat与其它web技能进行连接(如Apache做事器),这样可以有效平衡负载。

连接器元素只有一件事,便是监听要求,并通过引擎得到指定端口上返回的结果。
就它本身来说,这个连接器自身没什么功效,这个元素包含的唯一信息是输入和输出的端口,以及一些见告它如何准确输入和输出的特性。

那么如何通过嵌套连接器来实现我们须要的功能呢?下面是一个例子:

<Server> <Service> <Connector port="8443"/> <Connector port="8444"/> <Engine> <Host name="yourhostname"> <Context path="/webapp1"/> <Context path="/webapp2"/> </Host> </Engine> </Service></Server>

上例中定义了两个连接元素,监听的两个端口号为8443和8444,但须要把稳的是每个操作系统每个连接器只许可一个端口,以是每个边接器须要为自己定义一个指定的端口。
并且这两个连接器元素都嵌套在一个做事器元素中,这样可以见告连接器如何监听指定的端口,并且通过做事器的引擎连接器可以处理这些要求并将处理后的结果返回到连接器。

根据该例设置,这两个连接器都是利用相同的引擎发送要求,同样反过来,也是通过这个引擎来得到Web运用程序返回的结果。

如果现在想修合法前配置,不须要每个连接器返回的要求有两个相应,只须要每个连接器返回其指定的端口信息,要实现该功能,只要对配置进行如下修正即可:

<Server> <Service name="Catalina"> <Connector port="8443"/> <Engine> <Host name="yourhostname"> <Context path="/webapp1"/> </Host> </Engine> </Service> <Service name="Catalina8444"> <Connector port="8444"/> <Engine> <Host name="yourhostname"> <Context path="/webapp2"/> </Host> </Engine> </Service></Server>

该例中利用了两个不同的做事,利用两个不同的连接器,通过连接器中两个不同端口和引擎连接到同一台做事器,虽然变的繁芜了,但是层次构造更大略。

HTTP连接器

虽然Tomcat设计了一个servlet容器,但其它功能只能适用于一个独立的Web做事器,而servlet容器的这些功能HTTP连接器也可以实现。
HTTP连接器利用HTTP/1.1协议,它代表一个单独的连接器组件,监听一个给定的做事器上指定的TCP端口的连接。

连接器有很多属性,通过修正之些属性可以精确的指定它的功能,并且可以对功能进行受权,如代理和重定向。
其两个最主要的属性是“协议”和“SSLEnabled”。

“协议”属性紧张定义连接器利用的通信协议,默认的通信协议为HTTP/1.1,但可以对通信协议进行修正,并且许可设置更多的其它的协议。
例如,希望调度socket的性能,可以将“协议”属性项设置为NIO(Java New IO简称)协议。
如果将“SSLEnabled”属性设置为“True”连接器会利用SSL握手、SSL加密和SSL解密。

HTTP连接器也可以浸染为负载均衡的一种办理方案,合营HTTP负载平衡器可以支持粘性会话,如mod_proxy方法,但是如果处理代理的情形AJP连接器比HTTP连接器效果更好。

AJP连接器

AJP连接器的事情办法与HTTP连接器的办法一样,但其利用的协议为AJP协议,Apache JServ协议或AJP协议,AJP协议是一个优化的二进制版本的协议,常日用于Tomcat做事器与Apache Web运用程序进行通讯。

AJP连接器常日利用在Tomcat的插件技能mod_jk中,也可以重新已无效的mod_jserv插件,并且常日JK库函数可以支持更多的协议和Tomcat的指定功能。
AJP连接器功能常日须要一个高流量的系统支持,常日是集群的web系统。
其许可Apache做事器供应静态内容和代理要求,目的是让全体网络负载更均匀,这样可以让Tomcat做事器更专注于处理动态内容。

Connerctor参数配置

以下代码是连接器配置的一个实例:

<Connector executor="tomcatThreadPool" port="80" protocol="HTTP/1.1" connectionTimeout="50000" keepAliveTimeout="20000" maxKeepAliveRequests="1" redirectPort="444" maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>

常见连接器参数如下:

connectionTimeout:网络连接超时时间,单位为毫秒,如果设置为“0”则表示永不超时,不建议这样设置;

keepAliveTimeout:保持连接的最永劫光,单位为毫秒;

maxKeepAliveRequests:最大的连接数(“1”表示禁用该设置,“-1”表示不限定个数,缺省值为100);

maxHttpHeaderSize:表示许可的HTTP要求头的最大值,超过此大小的要求将不予受理;

URIEncoding:设置Tomcat容器的URL编码格式;

acceptCount:指定当所有可以利用的处理要求的线程数都被利用时,可以放到处理行列步队中的要求数,超过这个数的要求将不予处理,默认为10个;

disableUploadTimeout:上传文件时是否利用超机遇制;

enableLookups:是否启动反查域名机制(取值为true或false),为了提高处理能力,应设置为false;

bufferSize:定义连接器所供应的输入流中缓存区大小,缺省值为2048个字节;

maxSpareThreads:最大空闲连接数,如果创建的线程超过这个值,Tomcat就会关闭不再须要的线程数,缺省值为50;

maxThreads:最多同时处理的连接数,Tomcat利用线程来处理吸收的每个要求,这个值表示Tomcat可创建的最大的线程数;

minSpareThreads:最小空闲线程数,Tomcat初始化时创建的线程数,该值该当少于maxThreads,缺省值为4;

minProcessors:最小空闲连接线程数,缺省值为10;

maxProcessors:最大连接线程数,默认值为75;

下面详细先容maxThreads、connectionTimeout和acceptCount这个参数:

一、maxThreads配置

maxThreads代表Tomcat的HTTP连接器所创建的要求处理线程的最大数目,如以下代码:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="250" minSpareThreads="20" maxIdleTime="60000" /><Connector executor="tomcatThreadPool" port="80" protocol="HTTP/1.1" connectionTimeout="60000" keepAliveTimeout="15000" maxKeepAliveRequests="1" redirectPort="443" ....../>

如上例表示Tomcat做事器最大榀以处理250个要求,如果不设置该值,那缺省值为200。

maxThreads处理过程如下:

1) 当做事器启动时,HTTP连接器将创建一个根本线程数,这个值为minSpareThreads(最小空闲连接数);

2) 每个传入的要求都须要一个持续韶光,许可的最大韶光为keepAliveTimeout所设置的值;

3) 如果须要同时处理的要求数超过minSpareThreads设置的值,那么额外的线程数将以最大配置数为准,即maxThreads的值;

4) 如果同时处理的要求数超过最大配置值,即超过maxThreads所设置的值,那么这么要求将会排成行列步队,行列步队最大值由acceptCount确定;

5) 如果行列步队长度超过acceptCount所设置的值,那么要求连接时将会被谢绝,直到有可用资源时才建立连接;

maxThreads是一个很主要的参数,那么在配置过程它该当遵守什么原则呢?

org.apache.tomcat.util.threads.ThreadPool logFull SEVERE: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status

如果涌现上述的缺点,那么首先须要调查要求所花费的韶光,并检讨它是否返回线程池,例如,数据库连接一贯不开释,那么线程须要等得到数据库连接后才能运行,这样导致其它的要求不能被处理,如果此时增大maxThreads值,可以会导致以下后果:

--花费大量内存;

--在切换高下文内容时所花费的韶光将会进一步增多;

这些元素利用Catalina直接处理设备的要求。

以是,如果在优化系统性能过程中,将该设置高达500-750了,那么这样将带来上述两个问题,以是maxThreads的值大于750,那么则须要利用Tomcat做事器集群来办理这个问题,如须要将maxThreads的值设置为1000,那么须要利用两个Tomcat做事器,各自设置为500,而不是将一个Tomcat做事器设置为500。

connectionTimeout配置

connectionTimeout用于设置网络连接超时时间。
设置通讯的超时时间对付改进通讯过程非常主要,它可以帮助创造问题和稳定分布系统,JK有几种不同的超时类型,按属性分,常日包括:CPing/CPong、低级别TCP超时、连接池和空闲超时、防火墙连接和回答超时,常日在httpd.conf、workers.properties和server.xml三个文件中进行设置,也可以分别对这些选项进行设置。
但这些选项默认情形是禁用状态,一样平常不设置超时的极度值,否则可能揠苗助长。

1) CPing/CPong

CPing/CPong用于测试后端小数据包的状态,在建立连接后和要求返回数据包之前JK可以直接测试数据包,可以常日配置来设置CPong与CPing之间最大空闲韶光。

在ping_mode模块中可以设置不种连接办法的超时时间:

连接模式(connect mode):利用connect_timeout属性设置超时时间;

前岗模式(prepost mode):利用prepost_timeout属性设置超时时间;

间隔模式(interval mode):利用connection_ping_interval属性设置空闲间隔韶光;

2) 低级别TCP超时

一些平台许可设置TCP套接字操作超时,这种情形只许可在Linux和Windows操作系统中利用,其它的平台不支持,如果平台TCP发送和接管超时,那么可以通过socket_timeout属性进行设置,该属性在文件workers.properties中。
如果平台不支持套接字操作超时,JK也会接管这个属性,但这种情形下,该属性没有任何效果,缺省值为“0”,表示禁用超时,该属性的单位为秒,而非毫秒,这个超时是一个低层次的,用于套接字中每个读与写的操作。

利用此属性JK可以很快的反应关于网络类型的问题,但这也有一些负影响,由于平台太多,如果真的是由于网络问题引起的超时,或者没有收到后端返回的数据包,那么JK不可能很快的规复,故不可能将这个值设置的太小。

一样平常情形下当建立连接后,可以利用socket_connect_timeout来测试超时时间,其单位为毫秒,由于一些平台不支持socket_timeout,超时时间一样平常设置为1000至5000毫秒。

3) 连接池和空闲超时

JK会处理每个Web做事器连接池中的每个连接,会连接被用于持久模式,当一个要求处理完成后,连接会处于断开状态,等待下一个发送过来的要求,连接池希望增加并行要求的数量。

大多数运用程序每个韶光段所承受的负载是有所不同的,以是当连接数在不断的增加时,连接会被临时保存在后端,这样导致前端越来越拥挤,所往后端可能会利用一个线程来处理提交的新的连接,以是如果当系统负载减少时可以将连接池缩小。

JK许可在连接池的一些连接在一些空闲韶光后被关闭,利用connection_pool_timeout属性可以设置最大空闲韶光,单位为秒,其缺省值为“0”,表示禁止关闭空闲连接。
一样平常建议设置为10分钟,即600秒。
如果须要设置此属性,那么在Tomcat做事器中server.xml配置文件中的AJP连接器中修正connectionTimeout选项,单位为毫秒。

JK并不会立即关闭那些超时的连接,而是先运行一些内部自动掩护的任务,每隔60秒自动检讨所有空闲状态的连接,60秒的韶光间隔可以利用全局属性(worker.maintain)进行重新设置,但不建议修正该值。

4) 防火墙连接

空闲连接来自于防火墙,这每每是在网络做事器和后端之间,如果连接永劫光处于闲置状态,那么连接的状态表将会丢失,TCP是一个可靠的协议,它会检测TCP ACKs是否丢失,并且会重新发送那些韶光相对较长的包,当然这一样平常须要几分钟的韶光。
因此JK配置时常常须要配置connection_pool_timeount

和connection_pool_minsize两个属性,Tomcat测试须要配置connectionTimeout属性来防止空闲连接低落。

其余,利用可以配置socket_keepalive标准套接字选项,这样当连接处于空闲状态时,会自动向每个连接发送TCP keepalive包,缺省值为“False”,如果疑惑是防火墙引用的空闲连接,那么可以将该选项设置为“True”。
但是对付不同的平台,默认的韶光间隔和算法是不一致的,以是要调度TCP的设置项来测试其掌握TCP keepalive的效果。

5) 回答超时

对付要求的相应JK也可能涌现超时的情形,涌现超时的相应不能被处理,反之一样,连接相应的数据包须要多永劫光才能完成,这是我们关注的问题,例如一个永劫光的下载,无法设置一个全局的回答超时的韶光,由于无法确定末了下载的韶光。

通过设置replay_timeout属性可以设置超时时间,单位为毫秒,缺省值为“0”,表示不禁用超时,如以下配置:

worker.worker1.port = 8888worker.worker1.reply_timeout = 120000worker.worker1.socket_timeout = 150000

该配置在workers.properties文件中设置。

合营Apache一起利用时,可以通过设置http的环境变量reply_timeout来设置超时时间,这样更灵巧。

acceptCount配置

acceptCount是指当所有可以利用的处理要求的线程数都被利用时,可以放到处理行列步队中的要求数,超过这个数的要求将不予处理,默认为10个,即许可要求行列步队的最大长度,如果客户端提交的要求不能被同时并发处理完成,即客户端要求数超过maxThreads的值,那么别的的要求将会以行列步队的办法存储着,如果这个行列步队的长度大于acceptCount所设置的值,那么客户端提交的要求就不会被处理,即被做事器谢绝,导致连接失落败。

在设置该值时该当把稳,这个值不能设置的太小也不能设置的太大,如果设置的太小会涌现大量要求可能被直接谢绝的情形,但其它此时这些要求可能根本没有超时;如果将该值设置的过大,则会涌现要求被超时的情形,由于如果排的行列步队过长,这样后面的行列步队很可能涌现超时的情形,keepAliveTimeout和connectionTimeout两个属性值会影响决定连接是否超时,如果行列步队过长后面的要求就会涌现超时,这样要求同样也无法被精确的处理,以是在设置该值时,须要以做事器访问的峰值或均匀值来衡量,但实际测试过程中可以通过配置该值来测试性能的表现。

下期分享APR配置,敬请关注!