Tomcat优化
目录
1 TOMCAT环境优化 1
1.1 TOMCAT硬件环境优化 1
1.2 TOMCAT软件环境优化 1
1.2.1 操作系统性能优化 1
1.2.2 JAVA虚拟机性能优化 1
2 TOMCAT自身优化 3
2.1 屏蔽 AJP 4
2.2 禁用DNS查询 4
2.3 线程数调优 5
2.4 配置NIO 5
2.5 使用APR库 6
2.6 配置GZIP压缩 7
2.7 加速JSP的编译 7
2.8 设置TOMCAT乱码 7
2.9 限制主机访问 8
2.10 设置配置自动加载 8
3 配置TOMCAT集群 8
4 应用程序优化 9
4.1 后台代码优化 9
4.2 前端代码优化 9
1 Tomcat环境优化
对tomcat应用的优化主要在三个方面进行优化,首先可以再tomcat运行的环境上进行优化,其次可以对tomcat自身的配置等进行优化,最后可以再对tomcat应用工程进行代码上的优化。
1.1 Tomcat硬件环境优化
对tomcat环境优化,可以从两个方面着手考虑,首先可以从硬件方面考虑,其次可以考虑软件系统环境的优化。
对于硬件的考虑主要在两个方面,一个是硬件的处理能力,一个是成本。
(1),升级性能瓶颈的硬件:在经济条件允许的情况下,尽可能用较高处理能力的硬件,即在对系统性能瓶颈的硬件环境进行相应的升级。这里所说的相应就是在成本和需求性能上做考虑的。
(2),调整系统硬件架构:如构建区域代理服务器,增加内容服务器,构建集群等。
当然在硬件环境基本确定的情况下可以考虑对系统软件的升级和优化。
1.2 Tomcat软件环境优化
1.2.1 操作系统性能优化
这里说的操作系统是指运行web服务器的系统软件,当然,不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的,因此在它 的内核中有许多的限制来防止不同形式的服务攻击(OpenBSD的一句座右铭是“默认是最安全的”)。这些限制或许更多地用来运行活跃的web服务器。
而我们常用的Linux操作系统的目标是易用使用,因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核,表明所有的驱动器都静态地与之相连。这样就使系统易于使用,但是如果你要创建一个自定义的内核来加强其中某些限制,那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之,内存现在变得越来越便宜,所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存,并且 在服务器上腾出更多的可用内存。虽然现在内存已经相当的便宜,但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点,但是从可靠性上来说,性价比会更高一些。
对操作系统的优化:选择服务版本的操作系统(如windows中做服务器最后选择服务器版本的windows系统);升级操作系统,这样可以使得系统处理能力得到很好的提升;并且基于安全性的考虑,必须经常给操作系统打上最新的补丁。
1.2.2 JAVA虚拟机性能优化
(1),使用高版本的JDK环境:Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统 和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司 和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%,DK1.5比JDK1.4性能提高25%-75%,所以尽可能使用高版本的JDK。
(2),使用server版本的VM:jvm的server版和client版在上面的表中,我们看到有server版和client版。Jvm动态库有client和server两个版 本,分别针对桌面应用和服务器应用做了相应的优化,client版本加 载速度较快,server版本加载速度较慢但运行起来较快。
在命令行 java -version 可以看到jvm配置的是哪个版本。
如果要修改jvm的版本
可以看到这两个jvm.dll的大小不同。
更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。
编辑%JAVA_HOME%/jre/lib/i386/jvm.cfg
里面第一行写的是 -client 默认就是client版本 ,把第二行的-server KNOWN 放到第一行, 如下面所示
然后重启tomcat,在命令行下
就可以看到类似的信息
(3),设置VM内存参数调优:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用 程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始 化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的 最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。表示初始化内存为256MB,可以使用 的最大内存为512MB。Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:
一定加在catalina.bat最前面。
Linux环境下修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:
注意:前后二者区别,有无set,有无双引号。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有 关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致, 完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性 能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
2 Tomcat自身优化
Tomcat的http请求配置server.xml
2.1 屏蔽 AJP
为了提高安全性,一般情况下屏蔽 AJP。注释或者删除server.xml中的 Connector节点:
当然如果想要配置tomcat集群AJP就不必屏蔽了,可以通过AJP定向包协议配置apache与tomcat之间的通信。
2.2 禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。 DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性 能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值为false。
除非你需要连接到站点的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat 以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站 点来说禁用DNS查询可能没有大流量站点的效果明显,但是此举仍不失为一良策。
2.3 线程数调优
Tomcat使用线程池以便对传入的请求提供快速的响应。
通过更改Connector的minSpareThreads与maxSpareThreads的值,可以控制所分配的线程数目,将这两个参数设为最佳值的最好方式是对各个参数尝试许多不同的设定值,然后以仿真的网络流量进行测试,同时并观察响应时间与内存的使用量。每一种 机器、操作系统与JVM的组合都可能有不同的表现,而且并非所有人的网站流量都会相同,所以没有现成的规则来决定最小与最大的线程数。
2.4 配置nio
每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着跟线程切换。而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。
大家都听说了在Apache Tomcat6 中支持了Java语言的特性 NIO( New I/O),不管你对NIO的技术是否熟悉,但你肯定能想象的到NIO是一个好东西。的确,使用NIO在服务器端会有更好的性能,加强服务器端对并发处理的 性能。 请注意:很抱歉,在tomcat6在默认的配置选项中是没有把NIO功能打开。所以很多正在使用Tomcat6的朋友们本以为能快活的使用上NIO。
启动tomcat,可以在控制台的启动信息里看见,默认状态下 没有被打开nio配置,启动时的信息,如下:
这样就可以打开tomcat 的nio使用了。
2.5 使用APR库
tomcat 可以使用 APR 来提供超强的可伸缩性和性能,更好地集成本地服务器技术。 APR(Apache Portable Runtime) 是一个高可移植库,它是 Apache HTTP Server 2.x 的核心。 APR 有很多用途,包括访问高级 IO 功能 ( 例如 sendfile,epoll 和 OpenSSL) , OS 级别功能 ( 随机数生成,系统状态等等 ) ,本地进程管理 ( 共享内存, NT 管道和 UNIX sockets) 。这些功能可以使 Tomcat 作为一个通常的前台 WEB 服务器,能更好地和其它本地 web 技术集成,总体上让 Java 更有效率作为一个高性能 web 服务器平台而不是简单作为后台容器。
Tomcat中使用APR库,其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
一 般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,一般建议拷贝库文件tcnative- 1.dll到Tomcat的bin目录下。而在Linux下,可以直接解压和安装bin目录下的tomcat_native.tar.gz文件,编译之前 要确保apr库已经安装。
怎么才能判断Tomcat是否已经启用了APR库呢?方法是通过看Tomcat的启动日志:
如果没有启用APR,则启动日志一般有这么一条:
org.apache.coyote.http11.Http11Protocol start
如果启用了APR,则这条日志就会变成:
org.apache.coyote.http11.Http11AprProtocol start
tcnative-1.dll 下载地址:http://tomcat.heanet.ie/native/
2.6 配置gzip压缩
gzip 压缩就是为了提高访问网站的速度,即站点上要传给浏览器的网页内容先进行压缩,然后通过网络传给客户端的浏览器,客户端的浏览器再进行解压,并显示给用户。压缩后的数据可以减少网络流量,当然解压文件也想要耗性能。
2.7 加速JSP的编译
当第一次访问一个JSP文件时,它会被转换为Java serverlet源码,接着被编译成Java字节码。你可以控制使用哪个编译器,默认情况下,Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器,但是这里我们将介绍如何优化它们。
另外一种方法是不要把所有的实现都使用JSP页面,而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定,但是事实证明至少这种方法是只得研究的。
由于JSP页面在第一次使用时已经被编译,那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上,这个过程完全可以自动化,因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。
可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它
Tomcat提供了一种通过请求来编译JSP页面的功能。例如,你可以在浏览器地址栏中输入http://localhost:8080/exa......ate.jsp?jsp_precompile=true,这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。
2.8 设置tomcat乱码
设置tomcat的编码为UTF-8,在connector中加入URIEncoding="UTF-8" 配置。
2.9 限制主机访问
有时,你可能想限制对Tomcat web应用的访问,比如,你希望只有你指定的主机或IP地址可以访问你的应用。这样一来,就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效 果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。
例如你可以把Admin Web application设置成只允许本地访问,设置如下:
如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。
2.10 设置配置自动加载
修改tomcat中conf/context.xml文件:
3 配置tomcat集群
Apache+ Tomcat整合的目标:
(1) 可以提高整体web服务器性能,将动态页面交给tomcat处理,将静态文件交给apache处理,可以大大提高服务器的静态文件处理性能。
(2) 可以实现web服务器的负载均衡,服务器可采用集群的方式来响应客户端请求。Apache的作用是做代理,将请求分发给各个tomcat处理,tomcat作为集群服务器处理请求。这样可以提高整体web服务器性能和访问量。
(3) 可以实现无缝升级应用程序和容错处理,在tomcat集群中如果有一个tomcat挂掉了,用户还可以通过其他tomcat来进行访问,同时如果我们想升 级应用程序,我们可以通过升级每个tomcat的应用程序来实现升级,在升级的过程中不会影响web服务器的访问。
详细配置可见:http://xmong.iteye.com/blog/1288740
4 应用程序优化
4.1 后台代码优化
后台代码调优,这需要程序员在编写代码的过程中注意代码的优化。如使用数据库连接池,可以减少服务器创建连接的开销来达到高性能连接数据库的优化。
4.2 前端代码优化
前端代码优化,可以参考高性能网站建设指南中的规则来进行前端代码的优化。
参见:http://xmong.iteye.com/blog/1286243
目录
1 TOMCAT环境优化 1
1.1 TOMCAT硬件环境优化 1
1.2 TOMCAT软件环境优化 1
1.2.1 操作系统性能优化 1
1.2.2 JAVA虚拟机性能优化 1
2 TOMCAT自身优化 3
2.1 屏蔽 AJP 4
2.2 禁用DNS查询 4
2.3 线程数调优 5
2.4 配置NIO 5
2.5 使用APR库 6
2.6 配置GZIP压缩 7
2.7 加速JSP的编译 7
2.8 设置TOMCAT乱码 7
2.9 限制主机访问 8
2.10 设置配置自动加载 8
3 配置TOMCAT集群 8
4 应用程序优化 9
4.1 后台代码优化 9
4.2 前端代码优化 9
1 Tomcat环境优化
对tomcat应用的优化主要在三个方面进行优化,首先可以再tomcat运行的环境上进行优化,其次可以对tomcat自身的配置等进行优化,最后可以再对tomcat应用工程进行代码上的优化。
1.1 Tomcat硬件环境优化
对tomcat环境优化,可以从两个方面着手考虑,首先可以从硬件方面考虑,其次可以考虑软件系统环境的优化。
对于硬件的考虑主要在两个方面,一个是硬件的处理能力,一个是成本。
(1),升级性能瓶颈的硬件:在经济条件允许的情况下,尽可能用较高处理能力的硬件,即在对系统性能瓶颈的硬件环境进行相应的升级。这里所说的相应就是在成本和需求性能上做考虑的。
(2),调整系统硬件架构:如构建区域代理服务器,增加内容服务器,构建集群等。
当然在硬件环境基本确定的情况下可以考虑对系统软件的升级和优化。
1.2 Tomcat软件环境优化
1.2.1 操作系统性能优化
这里说的操作系统是指运行web服务器的系统软件,当然,不同的操作系统是为不同的目的而设计的。比如OpenBSD是面向安全的,因此在它 的内核中有许多的限制来防止不同形式的服务攻击(OpenBSD的一句座右铭是“默认是最安全的”)。这些限制或许更多地用来运行活跃的web服务器。
而我们常用的Linux操作系统的目标是易用使用,因此它有着更高的限制。使用BSD内核的系统都带有一个名为“Generic”的内核,表明所有的驱动器都静态地与之相连。这样就使系统易于使用,但是如果你要创建一个自定义的内核来加强其中某些限制,那就需要排除不需要的设备。Linux内核中的许多驱动都是动态地加载的。但是换而言之,内存现在变得越来越便宜,所以因为加载额外的设备驱动就显得不是很重要的。重要的是要有更多的内存,并且 在服务器上腾出更多的可用内存。虽然现在内存已经相当的便宜,但还是尽量不要购买便宜的内存。那些有牌子的内存虽然是贵一点,但是从可靠性上来说,性价比会更高一些。
对操作系统的优化:选择服务版本的操作系统(如windows中做服务器最后选择服务器版本的windows系统);升级操作系统,这样可以使得系统处理能力得到很好的提升;并且基于安全性的考虑,必须经常给操作系统打上最新的补丁。
1.2.2 JAVA虚拟机性能优化
(1),使用高版本的JDK环境:Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统 和对应的JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司 和其它一些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%,DK1.5比JDK1.4性能提高25%-75%,所以尽可能使用高版本的JDK。
(2),使用server版本的VM:jvm的server版和client版在上面的表中,我们看到有server版和client版。Jvm动态库有client和server两个版 本,分别针对桌面应用和服务器应用做了相应的优化,client版本加 载速度较快,server版本加载速度较慢但运行起来较快。
在命令行 java -version 可以看到jvm配置的是哪个版本。
如果要修改jvm的版本
%JAVA_HOME%/jre/bin/client/jvm.dll
%JAVA_HOME%/jre/bin/server/jvm.dll
可以看到这两个jvm.dll的大小不同。
更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。
编辑%JAVA_HOME%/jre/lib/i386/jvm.cfg
里面第一行写的是 -client 默认就是client版本 ,把第二行的-server KNOWN 放到第一行, 如下面所示
-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
然后重启tomcat,在命令行下
java -version
就可以看到类似的信息
java version "1.4.2_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05 )
Java HotSpot(TM) Server VM (build 1.4.2_07-b05 , mixed mode)
(3),设置VM内存参数调优:-Xms<size> 表示JVM初始化堆的大小,-Xmx<size>表示JVM堆的最大值。这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用 程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始 化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的 最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。表示初始化内存为256MB,可以使用 的最大内存为512MB。Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m
一定加在catalina.bat最前面。
Linux环境下修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shenzhen"
注意:前后二者区别,有无set,有无双引号。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有 关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致, 完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性 能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
2 Tomcat自身优化
Tomcat的http请求配置server.xml
<Connector
port="8080"
enableLookups="false"
disableUploadTimeout="true"
useBodyEncodingForURI="true"
URIEncoding="UTF-8"
maxHttpHeaderSize="8192"
maxThreads="600"
minSpareThreads="100"
maxSpareThreads="500"
acceptCount="700"
connectionTimeout="20000"
keepAliveTimeout="15000"
maxKeepAliveRequests="1"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443"
/>
maxThreads:Tomcat可创建的最大的线程数。
acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
minSpareThreads:Tomcat初始化时创建的线程数。
maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
keepAliveTimeout - 长连接最大保持时间(毫秒)。此处为15秒。
maxKeepAliveRequests - 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)
maxHttpHeaderSize - http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
disableUploadTimeout - 上传时是否使用超时机制
enableLookups - 是否反查域名,取值为:true或false。
compression="on" 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType压缩类型
2.1 屏蔽 AJP
为了提高安全性,一般情况下屏蔽 AJP。注释或者删除server.xml中的 Connector节点:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
当然如果想要配置tomcat集群AJP就不必屏蔽了,可以通过AJP定向包协议配置apache与tomcat之间的通信。
2.2 禁用DNS查询
当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。 DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。为了消除DNS查询对性 能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值为false。
除非你需要连接到站点的每个HTTP客户端的机器名,否则我们建议在生产环境上关闭DNS查询功能。可以通过Tomcat 以外的方式来获取机器名。这样不仅节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间。对流量较小的站 点来说禁用DNS查询可能没有大流量站点的效果明显,但是此举仍不失为一良策。
2.3 线程数调优
Tomcat使用线程池以便对传入的请求提供快速的响应。
通过更改Connector的minSpareThreads与maxSpareThreads的值,可以控制所分配的线程数目,将这两个参数设为最佳值的最好方式是对各个参数尝试许多不同的设定值,然后以仿真的网络流量进行测试,同时并观察响应时间与内存的使用量。每一种 机器、操作系统与JVM的组合都可能有不同的表现,而且并非所有人的网站流量都会相同,所以没有现成的规则来决定最小与最大的线程数。
<!--
Tomcat6 minSpareThreads,maxSpareThreads参数不再被支持 需要在 Executor 中配置
maxThreads="600" ///最大线程数
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
-->
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
maxThreads="600"
acceptCount="700"
connectionTimeout="20000"
redirectPort="8443"/>
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="100"/>
2.4 配置nio
每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着跟线程切换。而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。
大家都听说了在Apache Tomcat6 中支持了Java语言的特性 NIO( New I/O),不管你对NIO的技术是否熟悉,但你肯定能想象的到NIO是一个好东西。的确,使用NIO在服务器端会有更好的性能,加强服务器端对并发处理的 性能。 请注意:很抱歉,在tomcat6在默认的配置选项中是没有把NIO功能打开。所以很多正在使用Tomcat6的朋友们本以为能快活的使用上NIO。
启动tomcat,可以在控制台的启动信息里看见,默认状态下 没有被打开nio配置,启动时的信息,如下:
2011-02-1 12:59:40 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2011-02-1 12:59:40 org.apache.catalina.startup.Catalina load
修改成支持NIO的类型,配置如下 :
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol "
connectionTimeout="20000"
redirectPort="8443" />
进行测试,被打开nio配置,启动时的信息,如下:
2010-2-1 13:01:01 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
信息: Using a shared selector for servlet write/read
2010-2-1 13:01:01 org.apache.coyote.http11.Http11NioProtocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
这样就可以打开tomcat 的nio使用了。
2.5 使用APR库
tomcat 可以使用 APR 来提供超强的可伸缩性和性能,更好地集成本地服务器技术。 APR(Apache Portable Runtime) 是一个高可移植库,它是 Apache HTTP Server 2.x 的核心。 APR 有很多用途,包括访问高级 IO 功能 ( 例如 sendfile,epoll 和 OpenSSL) , OS 级别功能 ( 随机数生成,系统状态等等 ) ,本地进程管理 ( 共享内存, NT 管道和 UNIX sockets) 。这些功能可以使 Tomcat 作为一个通常的前台 WEB 服务器,能更好地和其它本地 web 技术集成,总体上让 Java 更有效率作为一个高性能 web 服务器平台而不是简单作为后台容器。
Tomcat中使用APR库,其实就是在Tomcat中使用JNI的方式来读取文件以及进行网络传输。可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。
一 般在Windows下,可以直接下载编译好的二进制版本的dll库文件来使Tomcat启用APR,一般建议拷贝库文件tcnative- 1.dll到Tomcat的bin目录下。而在Linux下,可以直接解压和安装bin目录下的tomcat_native.tar.gz文件,编译之前 要确保apr库已经安装。
怎么才能判断Tomcat是否已经启用了APR库呢?方法是通过看Tomcat的启动日志:
如果没有启用APR,则启动日志一般有这么一条:
org.apache.coyote.http11.Http11Protocol start
如果启用了APR,则这条日志就会变成:
org.apache.coyote.http11.Http11AprProtocol start
tcnative-1.dll 下载地址:http://tomcat.heanet.ie/native/
2.6 配置gzip压缩
gzip 压缩就是为了提高访问网站的速度,即站点上要传给浏览器的网页内容先进行压缩,然后通过网络传给客户端的浏览器,客户端的浏览器再进行解压,并显示给用户。压缩后的数据可以减少网络流量,当然解压文件也想要耗性能。
compression="on" 打开压缩功能
compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
noCompressionUserAgents="gozilla, traviata" 压对于以下的浏览器,不启用缩
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 要压缩的文件类型
2.7 加速JSP的编译
当第一次访问一个JSP文件时,它会被转换为Java serverlet源码,接着被编译成Java字节码。你可以控制使用哪个编译器,默认情况下,Tomcat使用使用命令行javac进行使用的编译器。也可以使用更快的编译器,但是这里我们将介绍如何优化它们。
另外一种方法是不要把所有的实现都使用JSP页面,而是使用一些不同的java模板引擎变量。显然这是一个跨越很大的决定,但是事实证明至少这种方法是只得研究的。
由于JSP页面在第一次使用时已经被编译,那么你可能希望在更新新的jsp页面后马上对它进行编译。实际上,这个过程完全可以自动化,因为可以确认的是新的JSP页面在生产服务器和在测试服务器上的运行效果是一样的。
在Tomcat4的bin目录下有一个名为jspc的脚本。它仅仅是运行翻译阶段,而不是编译阶段,使用它可以在当前目录生成Java源文件。它是调试JSP页面的一种有力的手段。
可以通过浏览器访问再确认一下编译的结果。这样就确保了文件被转换成serverlet,被编译了可直接执行。这样也准确地模仿了真实用户访问JSP页面,可以看到给用户提供的功能。也抓紧这最后一刻修改出现的bug并且修改它
Tomcat提供了一种通过请求来编译JSP页面的功能。例如,你可以在浏览器地址栏中输入http://localhost:8080/exa......ate.jsp?jsp_precompile=true,这样Tomcat就会编译data.jsp而不是执行它。此举唾手可得,不失为一种检验页面正确性的捷径。
2.8 设置tomcat乱码
设置tomcat的编码为UTF-8,在connector中加入URIEncoding="UTF-8" 配置。
2.9 限制主机访问
有时,你可能想限制对Tomcat web应用的访问,比如,你希望只有你指定的主机或IP地址可以访问你的应用。这样一来,就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效 果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。
例如你可以把Admin Web application设置成只允许本地访问,设置如下:
<Context path="/path/to/secret_files" ...>
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1" deny=""/>
</Context>
如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。
2.10 设置配置自动加载
修改tomcat中conf/context.xml文件:
<Context reloadable="true">
3 配置tomcat集群
Apache+ Tomcat整合的目标:
(1) 可以提高整体web服务器性能,将动态页面交给tomcat处理,将静态文件交给apache处理,可以大大提高服务器的静态文件处理性能。
(2) 可以实现web服务器的负载均衡,服务器可采用集群的方式来响应客户端请求。Apache的作用是做代理,将请求分发给各个tomcat处理,tomcat作为集群服务器处理请求。这样可以提高整体web服务器性能和访问量。
(3) 可以实现无缝升级应用程序和容错处理,在tomcat集群中如果有一个tomcat挂掉了,用户还可以通过其他tomcat来进行访问,同时如果我们想升 级应用程序,我们可以通过升级每个tomcat的应用程序来实现升级,在升级的过程中不会影响web服务器的访问。
详细配置可见:http://xmong.iteye.com/blog/1288740
4 应用程序优化
4.1 后台代码优化
后台代码调优,这需要程序员在编写代码的过程中注意代码的优化。如使用数据库连接池,可以减少服务器创建连接的开销来达到高性能连接数据库的优化。
4.2 前端代码优化
前端代码优化,可以参考高性能网站建设指南中的规则来进行前端代码的优化。
参见:http://xmong.iteye.com/blog/1286243