1 目录结构 /bin:脚本文件目录。 /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载)。 /conf:存放配置文件,最重要的是server.xml。 /logs:存放日志文件。 /server/webapps:来管理Tomcat-web服务用的。仅对TOMCAT可见,对所有的WEB APP都不可见(使用Catalina类加载器加载)。 /shared/lib:仅对所有WEB APP可见,对TOMCAT不可见(使用Shared类加载器加载)。 /temp:Tomcat运行时候存放临时文件用的。 /webapps:web应用发布目录。 /work:Tomcat把各种由jsp生成的servlet文件放在这个目录下。删除后,启动时会自动创建。 2 配置文件 server.xml:主要的配置文件。 web.xml:缺省的web app配置,WEB-INF/web.xml会覆盖该配置。 context.xml:不清楚跟server.xml里面的context是否有关系。 server.xml配置 server标签 port:指定一个端口,这个端口负责监听关闭tomcat的请求。 shutdown:指定向端口发送的命令字符串。 service标签 name:指定service的名字。 Connector(表示客户端和service之间的连接)标签 port:指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求。 minProcessors:服务器启动时创建的处理请求的线程数。 maxProcessors:最大可以创建的处理请求的线程数。 enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址。 redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号。 acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 connectionTimeout:指定超时的时间数(以毫秒为单位)。 Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求)标签 defaultHost:指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的。 Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)标签 docBase:该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使用绝对路径,也可以使用相对于context所属的Host的appBase路径。 path:表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****。 reloadable:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序。 useNaming:如果希望Catalina为该web应用使能一个JNDI InitialContext对象,设为true。该InitialialContext符合J2EE平台的约定,缺省值为true。 workDir:Context提供的临时目录的路径,用于servlet的临时读/写。利用javax.servlet.context.tempdir属性,servlet可以访问该目录。如果没有指定,使用$CATALINA_HOME/work下一个合适的目录。 swallowOutput:如果该值为true,System.out和System.err的输出被重定向到web应用的logger。如果没有指定,缺省值为false debug:与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。 host(表示一个虚拟主机)标签 name:指定主机名。 appBase:应用程序基本目录,即存放应用程序的目录。 unpackWARs:如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序。 Logger(表示日志,调试和错误信息)标签 className:指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口。 prefix:指定log文件的前缀。 suffix:指定log文件的后缀。 timestamp:如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt。 Realm(表示存放用户名,密码及role的数据库)标签 className:指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口。 Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样)标签 className:指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息。 directory:指定log文件存放的位置。 pattern:有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多。 3 配置虚拟目录 1)直接部署到webapps目录下面访问。 2)修改conf/server.xml文件。在中加入。docBase目录默认使用appBase="webapps"这个目录。也可以是绝对路径。 配置主目录,可以将path=""。 3)当项目没有放在webapps目录下时,可以在conf/Catalina/localhost新建一个XXX.XML文件。里面加入。 注意:这里的path属性不需要设置,设置了也不会起作用的。 也可以使用该方法建立主目录指向另一个目录,例如:命名为ROOT.xml,这样默认访问的主目录就被修改过了。 4 配置连接数 maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。 acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。 minSpareThreads:Tomcat初始化时创建的线程数。 maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。 enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。默认可设置为20000毫秒。 web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。 5 配置内存大小 修改bin/catalina.bat中的set CATALINA_OPTS=-Xms64m -Xmx128m。 Xms指最小内存,Xmx指最大内存。 6 安全配置 1)将SHUTDOWN修改为其他一些字符串。否则就容易被人给停止掉了。 2)对应tomcat3.1中,屏蔽目录文件自动列出 修改conf/web.xml中的defaultorg.apache.catalina.servlets.DefaultServletdebug0listingstrue13)访问日志设置 在server.xml中加入这样访问日志会记录到Logs中。 4)修改用户名、密码 conf/tomcat-users.xml 5)屏蔽后台管理入口 方法一:从控制用户和权限着手。废掉要管理权限的用户就可以了。 方法二:将conf/Catalina/localhost/manager.xml改名。 6)配置403,404,500错误页面 默认情况下,报出HTTP错误的时候会暴露tomcat版本号。如果不想暴露的话,就需要重新定义错误跳转页面。401/401.jsp404/404.jsp500/500.jsp注意:在测试的时候碰到一个奇怪的现象,平时项目里面的时候测试正常的。可是今天在tomcat目录里面新建一个测试目录测试并不能跳转到指定错误页面。暂时不知道为什么。 7 配置Log4j日志记录 项目中抛出的异常,抛到tomcat中的异常会被tomcat记录下来,存放至logs/localhost.yyyy-MM-dd.log文件中。 平时我们在项目中使用的log4j记录日志跟tomcat是没有任何关系的,是独立的一个程序,记录的文件是自定义的。 我们可以在tomcat中定义一个log4j的公共日志处理方式,这样在项目中就不需要在定义log4j的配置了。 1)将log4j-1.2.15.jar加入到commonlib目录。 2)将log4j.properties加入到commonclasses目录。 内容例如: # Output pattern : date [thread] priority category - message log4j.rootLogger=DEUBG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.File=${catalina.home}/logs/tomcat_app.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n #3rd party library level log4j.logger.org.hibernate.cache=ERROR 注意:我们项目中使用e.printStackTrace();输出的异常会在控制台输出来,但是,不会记录到tomcat日志中。 而且,也不会记录到log4j的日志中。要想记录到log4j日志中,必须使用log4j输出来。 所以,实际上web项目中进行异常处理应该将e.printStackTrace();写写法多改成log4j的形式才对! 但是,实际项目中很多项目多偷懒使用了e.printStackTrace();方式输出异常。当出现异常的时候在控制台上查看一下就可以了,也不考虑实际运行时候的维护。假如有人不小心关了控制台,那么,你不就看不到异常了吗? 个人介意使用log4j的形式记入web异常! 8 Tomcat5乱码问题 Tomcat5跟Tomcat4对参数处理是不一样的,在Tomcat4中get与post的编码是一样的,所以只要在过滤器中通过request.setCharacterEncoding()设定一次就可以解决get与set的问题。然而,在Tomcat5中,get与post的处理是分开的,对get请求使用URIEncoding进行处理,对post使用request.setCharacterEncoding()处理。Tomcat5中,在server.xml的Connector元素增加了以下配置参数: URIEncoding:用来设定通过URI传递的#########################################################################################################################从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是:ü 吞吐量ü Responsetimeü Cpuloadü MemoryUsage我 们也在第三天的学习中对Apache做过了一定的优化,使其最优化上述4大核心指标的读数,那么我们的Apache调优了,我们的Tomcat也作些相应 的调整,当完成今的课程后,到时你的“小猫”到时真的会“飞”起来的,所以请用心看完,这篇文章一方面用来向那位曾写过“Tomcat如何承受1000个 用户”的作都的敬,一方面又是这篇原文的一个扩展,因为在把原文的知识用到相关的两个大工程中去后解决了:1) 承受更大并发用户数2) 取得了良好的性能与改善(系统平均性能提升达20倍,极端一个交易达80倍)。另外值的一提的是,我们当时工程里用的“小猫”是跑在32位机下的, 也就是我们的JVM最大受到2GB内存的限制,都已经跑成“飞”了。。。。。。如果在64位机下跑这头“小猫”。。。。。。大家可想而知,会得到什么样的效果呢?下面就请请详细的设置吧! 二、一切基于JVM(内存)的优化2.1 32位操作系统与64位操作系统中JVM的对比我们一般的开发人员,基本用的是都是32位的Windows系统,这就导致了一个严重的问题即:32位windows系统对内存限制,下面先来看一个比较的表格:操作系统操作系统位数内存限制解决办法Winxp324GB超级兔子Win7324GB可以通过设置/PAEWin200332可以突破4GB达16GB必需要装win2003 advanced server且要打上sp2补丁Win764无限制机器能插多少内存,系统内存就能支持到多大Win200364无限制机器能插多少内存,系统内存就能支持到多大Linux64无限制机器能插多少内存,系统内存就能支持到多大Unix64无限制机器能插多少内存,系统内存就能支持到多大上述问题解决后,我们又碰到一个新的问题,32位系统下JVM对内存的限制:不能突破2GB内存,即使你在Win2003 Advanced Server下你的机器装有8GB-16GB的内存,而你的JAVA,只能用到2GB的内存。其实我一直很想推荐大家使用Linux或者是Mac操作系统的,而且要装64位,因为必竟我们是开发用的不是打游戏用的,而Java源自Unix归于Unix(Linux只是运行在PC上的Unix而己)。所以很多开发人员运行在win32位系统上更有甚者在生产环境下都会布署win32位的系统,那么这时你的Tomcat要优化,就要讲究点技巧了。而在64位操作系统上无论是系统内存还是JVM都没有受到2GB这样的限制。Tomcat的优化分成两块:ü Tomcat启动命令行中的优化参数即JVM优化ü Tomcat容器自身参数的优化(这块很像ApacheHttp Server)这一节先要讲的是Tomcat启动命令行中的优化参数。Tomcat首先跑在JVM之上的,因为它的启动其实也只是一个java命令行,首先我们需要对这个JAVA的启动命令行进行调优。需要注意的是:这边讨论的JVM优化是基于Oracle Sun的jdk1.6版有以上,其它JDK或者低版本JDK不适用。2.2 Tomcat启动行参数的优化Tomcat 的启动参数位于tomcat的安装目录\bin目录下,如果你是Linux操作系统就是catalina.sh文件,如果你是Windows操作系统那么 你需要改动的就是catalina.bat文件。打开该文件,一般该文件头部是一堆的由##包裹着的注释文字,找到注释文字的最后一段如:# $Id: catalina.sh 522797 2007-03-27 07:10:29Z fhanik $# ----------------------------------------------------------------------------- # OS specific support. $var _must_ be set to either true or false.敲入一个回车,加入如下的参数Linux系统中tomcat的启动参数export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "Windows系统中tomcat的启动参数set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true上面参数好多啊,可能有人写到现在都没见一个tomcat的启动命令里加了这么多参数,当然,这些参数只是我机器上的,不一定适合你,尤其是参数后的value(值)是需要根据你自己的实际情况来设置的。参数解释:ü -server我不管你什么理由,只要你的tomcat是运行在生产环境中的,这个参数必须给我加上因 为tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcat以 server模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。。。更。。。还有更。。。Y给我记住啊,要不然这个-server都不加,那是要打屁股了。ü -Xms–Xmx即JVM内存设置了,把Xms与Xmx两个值设成一样是最优的做法,有人说Xms为最小值,Xmx为最大值不是挺好的,这样设置还比较人性化,科学化。人性?科学?你个头啊。大家想一下这样的场景:一 个系统随着并发数越来越高,它的内存使用情况逐步上升,上升到最高点不能上升了,开始回落,你们不要认为这个回落就是好事情,由其是大起大落,在内存回落 时它付出的代价是CPU高速开始运转进行垃圾回收,此时严重的甚至会造成你的系统出现“卡壳”就是你在好好的操作,突然网页像死在那边一样几秒甚至十几秒 时间,因为JVM正在进行垃圾回收。因此一开始我们就把这两个设成一样,使得Tomcat在启动时就为最大化参数充分利用系统的效率,这个道理和jdbcconnection pool里的minpool size与maxpool size的需要设成一个数量是一样的原理。如何知道我的JVM能够使用最大值啊?拍脑袋?不行!在设这个最大内存即Xmx值时请先打开一个命令行,键入如下的命令:看,能够正常显示JDK的版本信息,说明,这个值你能够用。不是说32位系统下最高能够使用2GB内存吗?即:2048m,我们不防来试试可以吗?不可以!不要说2048m呢,我们小一点,试试1700m如何嘿嘿,连1700m都不可以,更不要说2048m了呢,2048m只是一个理论数值,这样说吧我这边有几台机器,有的机器-Xmx1800都没问题,有的机器最高只能到-Xmx1500m。因此在设这个-Xms与-Xmx值时一定一定记得先这样测试一下,要不然直接加在tomcat启动命令行中你的tomcat就再也起不来了,要飞是飞不了,直接成了一只瘟猫了。ü –Xmn设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。ü -Xss是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程 大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory。ü -XX:+AggressiveOpts作用如其名(aggressive),启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)ü -XX:+UseBiasedLocking启用一个优化了的线程锁,我们知道在我们的appserver,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配。ü -XX:PermSize=128M-XX:MaxPermSize=256MJVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;四分之一是1024MB,这就是MaxPermSize默认大小。ü -XX:+DisableExplicitGC在 程序代码中不允许有显示的调用”System.gc()”。看到过有两个极品工程中每次在DAO操作结束时手动调用System.gc()一下,觉得这样 做好像能够解决它们的out ofmemory问题一样,付出的代价就是系统响应时间严重降低,就和我在关于Xms,Xmx里的解释的原理一样,这样去调用GC导致系统的JVM大起大 落,性能不到什么地方去哟!ü -XX:+UseParNewGC对年轻代采用多线程并行回收,这样收得快。ü -XX:+UseConcMarkSweepGC即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。ü -XX:MaxTenuringThreshold设 置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一 个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。这个值的设置是根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。ü -XX:+CMSParallelRemarkEnabled在使用UseParNewGC 的情况下, 尽量减少 mark 的时间ü -XX:+UseCMSCompactAtFullCollection在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。ü -XX:LargePageSizeInBytes指定 Java heap的分页页面大小ü -XX:+UseFastAccessorMethodsget,set 方法转成本地代码ü -XX:+UseCMSInitiatingOccupancyOnly指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集ü -XX:CMSInitiatingOccupancyFraction=70CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就 不会出现promotion failed。在我的应用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5488*10%=548兆,所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed;因此这个参数的设置必须与Xmn关联在一起。ü -Djava.awt.headless=true这 个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web 网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显 示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。上述这样的配置,基本上可以达到:ü 系统响应时间增快ü JVM回收速度增快同时又不影响系统的响应率ü JVM内存最大化利用ü 线程阻塞情况最小化2.3 Tomcat容器内的优化前面我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。还记得我们在第三天的学习中说的,这个系统本身可以处理1000,你没有优化和配置导致它默认只能处理25。因此下面我们来看Tomcat容器内的优化。打开tomcat安装目录\conf\server.xml文件,定位到这一行:这一行就是我们的tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置:URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"/>好大一陀唉。。。。。。没关系,一个个来解释ü URIEncoding=”UTF-8”使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译ü maxSpareThreadsmaxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。ü minSpareThreads最小备用线程数,tomcat启动时的初始化的线程数。ü enableLookups这个功效和Apache中的HostnameLookups一样,设为关闭。ü connectionTimeoutconnectionTimeout为网络连接超时时间毫秒数。ü maxThreadsmaxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。ü acceptCountacceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connectionü maxProcessors与minProcessors在 Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。通常Windows是1000个左右,Linux是2000个左右。ü useURIValidationHack我们来看一下tomcat中的一段源码:security if (connector.getUseURIValidationHack()) { String uri = validate(request.getRequestURI()); if (uri == null) { res.setStatus(400); res.setMessage("Invalid URI"); throw new IOException("Invalid URI"); } else { req.requestURI().setString(uri); // Redoing the URI decoding req.decodedURI().duplicate(req.requestURI()); req.getURLDecoder().convert(req.decodedURI(), true); } }可以看到如果把useURIValidationHack设成"false",可以减少它对一些url的不必要的检查从而减省开销。ü enableLookups="false"为了消除DNS查询对性能的影响我们可以关闭DNS查询,方式是修改server.xml文件中的enableLookups参数值。ü disableUploadTimeout类似于Apache中的keeyalive一样ü 给Tomcat配置gzip压缩(HTTP压缩)功能compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对 于普通的浏览过程HTML,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。1)compression="on" 打开压缩功能2)compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB3)noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩4)compressableMimeType="text/html,text/xml" 压缩类型最后不要忘了把8443端口的地方也加上同样的配置,因为如果我们走https协议的话,我们将会用到8443端口这个段的配置,对吧?URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa" />好了,所有的Tomcat优化的地方都加上了。结合第三天中的Apache的性能优化,我们这个架构可以“飞奔”起来了,当然这边把有提及任何关于数据库优化的步骤,但仅凭这两步,我们的系统已经有了很大的提升。举个真实的例子:上一个项目,经过4轮performance testing,第一轮进行了问题的定位,第二轮就是进行了apache+tomcat/weblogic的优化,第三轮是做集群优化,第四轮是sql与codes的优化。在到达第二轮时,我们的性能已经提升了多少倍呢?我们来看一个loaderrunner的截图吧:左边第一列是第一轮没有经过任何调优的压力测试报告。右边这一列是经过了apache优化,tomcat优化后得到的压力测试报告。大家看看,这就提高了多少倍?这还只是在没有改动代码的情况下得到的改善,现在明白了好好的调优一个apache和tomcat其实是多么的重要了?如果加上后面的代码、SQL的调优、数据库的调优。。。。。。所以我在上一个工程中有单笔交易性能(无论是吞吐量、响应时间)提高了80倍这样的极端例子的存在。####################################################################tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。 tomcat内存优化linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m最大堆内存是1024m,对于现在的硬件还是偏低,实施时,还是按照机器具体硬件配置优化。 tomcat 线程优化maxThreads="600" ///最大线程数minSpareThreads="100"///初始化时创建的线程数maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 这里是http connector的优化,如果使用apache和tomcat做集群的负载均衡,并且使用ajp协议做apache和tomcat的协议转发,那么还需要优化ajp connector。由于tomcat有多个connector,所以tomcat线程的配置,又支持多个connector共享一个线程池。首先。打开/conf/server.xml,增加最大线程500(一般服务器足以),最小空闲线程数20,线程最大空闲时间60秒。 然后,修改节点,增加executor属性,executor设置为线程池的名字:可以多个connector公用1个线程池,所以ajp connector也同样可以设置使用tomcatThreadPool线程池。 禁用DNS查询当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名 转换为IP地址。DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。修改server.xml文件中的Connector元素,修改属性enableLookups参数值: enableLookups="false"如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 设置session过期时间conf\web.xml中通过参数指定:180单位为分钟。 Apr插件提高Tomcat性能 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做WEB服务器的时候,应该使用Tomcat Native来提高其性能 要测APR给tomcat带来的好处最好的方法是在慢速网络上(模拟Internet),将Tomcat线程数开到300以上的水平,然后模拟一大堆并发请求。 如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。 在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输。如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的。复制代码(1)安装APR tomcat-native apr-1.3.8.tar.gz 安装在/usr/local/apr #tar zxvf apr-1.3.8.tar.gz #cd apr-1.3.8 #./configure;make;make install apr-util-1.3.9.tar.gz 安装在/usr/local/apr/lib #tar zxvf apr-util-1.3.9.tar.gz #cd apr-util-1.3.9 #./configure --with-apr=/usr/local/apr ----with-java-home=JDK;make;make install #cd apache-tomcat-6.0.20/bin #tar zxvf tomcat-native.tar.gz #cd tomcat-native/jni/native #./configure --with-apr=/usr/local/apr;make;make install (2)设置 Tomcat 整合 APR 修改 tomcat 的启动 shell (startup.sh),在该文件中加入启动参数: CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/usr/local/apr/lib" 。 (3)判断安装成功: 如果看到下面的启动日志,表示成功。 2007-4-26 15:34:32 org.apache.coyote.http11.Http11AprProtocol init
Tomcat常用配置详解
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 转自陈明乾的博客,可能有一定更新。 转原文声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ...
- 作为运维,避免不了与tomcat打交道,然而作者发现网络上关于tomcat配置和调优安全的文章非常散,通过参考各位...