《Tomcat权威指南》读书笔记

2012.06.26 21:25

第一章 Tomcat的开幕式

1.Tomcat是以Java编写的,这表示在能够构建和测试它之前,必须安装最新的、完整的JAVA运行环境(JRE,Java runtime)。

2.Catalina Tomcat的主要脚本,它会执行java命令以调用Tomcat的启动与停止类。
   shutdown 运行catalina stop以停止Tomcat运行
   startup 运行catalina start以启动Tomcat运行
   执行catalina时,必须附带一个参数:最常用的是start、run及stop。当以start调用catalina(与调用startup一样)时,它会启动Tomcat,并将标准输出与错误流导出到$TOMCAT_HOME/logs/catalina.out文件中。参数run会让Tomcat保留当前的标准输出与错误流(如控制台窗口)(即在当前的控制台显示标准输出与错误流。同时参数run也会将标准输出与错误流导出到$TOMCAT_HOME/logs/catalina.out文件中。)。当您从终端机执行并想看到启动时的输出时,这会有帮助。如果使用catalina 及start选项,或调用startup脚本而非使用参数run,那么您会在控制台上看到前几行Using...;其余的输出信息则被重定向到catalina.out的日志文件中。shutdown脚本会调用stop参数的catalina,它会让Tomcat连接于Server元素(element)中设定的默认端口,并输出停止信息。

3.java -Xmx=256M MyProg 执行MyProg的类文件,并给整个Java运行时进程分配最大256M的内存。
set JAVA_OPTS="-Xmx256M" #MS-DOS


4.8080端口是Tomcat HTTP服务器的默认端口,8005端口是Tomcat停止服务器的默认端口


5.如果让Tomcat在控制窗口中运行,则可以使用Ctrl+C中断它,Tomcat会捕捉到中断信号并停止运行。


6.不同的Tomcat实例(JVM)必须使用不同的HTTP端口,而且在server.xml文件中,server及connector元素中的每一个端口号也必须不同。

2012.06.27 20:45

第二章 配置Tomcat

1.Tomcat内嵌的Web服务器是一个高性能的HTTP1.1服务器。


2.重定向Web应用程序的目录:情况一,更新安装的Tomcat;情况二:运行一个以上的Tomcat实例

   为了安装一份Tomcat发行版,但同时运行两个以上的不同配置的Tomcat实例,必须让每个JVM实例的文件相互分开。一般在使用Tomcat时,服务器会从conf及webapps目录中读入配置文件,并将文件写入logs、temp与work目录,当然一些jar文件和class文件需要从服务器公共目录树中加载。这表示为了让多个实例都能运行,每一个Tomcat的实例都必须有自己的目录集,且它们不能共享两个不同的已配置的Tomcat JVM实例。


方法:将CATALINA_HOME环境变量设置为已安装Tomcat二进制发行版的路径下,且必须将CATALINA_BASE的环境变量设置成与存储JVM实例文件(由您自己生成)不相同的路径。设置好这些变量后再启动Tomcat,它就会使用您在CATALINA_BASE中定义的文件进行运行,随后再使用CATALINA_HOME中的发行版。

设置环境变量CATALINA_BASE为F:\working\tomcat\apache-tomcat-6.0.35-instance1(Tomcat的实例自己的目录集,包含conf和webapps目录)

CATALINA_HOME为F:\working\tomcat\apache-tomcat-6.0.35(已安装Tomcat二进制发行版的路径)


Tomcat的这一内嵌特性允许您使Tomcat与您的文件分开。

注:Tomcat的环境变量 

CATALINA_BASE 设定Tomcat安装树定制或可写部分的基本目录,如logging文件、work目录、Tomcat的conf目录及webapp目录。是CATALINA_HOME的别名。默认值是Tomcat安装目录

CATALINA_HOME 此为Tomcat静态(只读)部分的基本目录,如Tomcat库文件和命令行脚本。默认值是Tomcat安装目录

当您将自己的文件与Tomcat发行版文件分开后管理后,升级Tomcat会变得十分容易,因为您可以用新的目录取代整个Tomcat发行版文件的目录,而无须担心会扰乱自己的任何文件。唯一的例外是新版的Tomcat与之前的Tomcat实例文件不兼容(这是非常罕见的情形)。当您在新的Tomcat版本上启动Web应用程序时,一定要检查日志文件,以便了解是否有问题发生。


3.从8080改变端口号

在默认安装过程中,Tomcat被配置为监听端口8080,而不是更常用的Web服务器端口号80。这是明智的选择,因为默认端口80通常已处于在用状态,且在Linux、Solaris、BSD等非Windows等操作系统上,打开网络服务包监听默认端口80需要特殊的root权限。但在多数情况下,让Tomcat运行在80端口上仍然有意义,而不是使用默认的8080端口。为什么?

4.Java VM配置

过度严格的内存设置要么使Tomcat运行很慢,要么报OutOfMemoryError的错误信息,使工作不正常。内存设置过大,要么因不能平均分配如此大量的内存而无法启动JVM,要么能启动正常,但却耗用了超出所需的过量计算机内存。

以小的和大的启动堆栈内存配置Tomcat JVM,都会引发网页响应时间超过Java VM堆栈的最大值的某种问题(如果需要堆栈也跟着增长)。因为Tomcat正在提供响应时会占用大量的时间重新分配内存,所以如果您不希望性能出现类似的问题,一定要让-Xms和-Xmx开关值就是所需内存的大小,从而保证JVM在操作过程中从不需要重新分配堆栈内存。

通过 JAVA_OPTS进行设置,以空格分开

如果您的操作系统没有安装图形化软件,您最好设置-Djava.awt.headless=true

5.管理领域、角色及用户

不管哪种安全防护类型,都使用领域(real)的组来管理用户和密码。

在Tomcat的conf/server.xml文件中的领域配置,以及Web应用程序的WEB-INF/web.xml文件中的<security-constraint>,分别定义了如何存储用户与角色信息,及如何对webapp的用户进行授权。

UserDatabaseRealm是从静态文件加载到内存中的,且直到Tomcat停止后才从内存中清除。换句话说,权限文件只会在启动时读入一次。在UserDatabaseRealm中分配权限的默认文件为$CATALINA_HOME/conf目录中的tomcat-users.xml

6.容器管理的安全防护

Tomcat支持四种容器管理的安全防护:

基本验证(web.xml文件中的auth-method元素设为BASIC),通过HTTP验证,需要提供base64编码文本的用户口令

摘要验证(web.xml文件中的auth-method元素设为DIGEST),通过HTTP验证,需要提供摘要编码字符串的用户口令

表单验证(web.xml文件中的auth-method元素设为FORM),在网页的表单上要求提供用户密码

Client-cert验证(web.xml文件中的auth-method元素设为CLIENT-CERT),以客户端数字证书来确认用户的身份

7.单次签名(Single Sign-On)

Tomcat的“单次签名”功能可以让用户只需证明身份一次,就可以访问虚拟主机上加载的所有Web应用程序。如欲使用这个功能,您只需在主机层加入SingleSignOn value元素,在存储的Tomcat的server.xml文件中。

8.Servlet自动重载

在默认情况下,当Tomcat发现servlet的类文件已被修改时,它会自动重载此servlet。为了实现这一功能,Tomcat必须周期性地检查每个servlet的修改时间。当已完成servlet的调试,并不再改变时,这会消耗许多不必要的文件系统资源。

如玉关闭此功能,只需在Web应用程序的Context元素(在web.xml中)中设定reloadable属性,并重启Tomcat就可以了。一旦完成此工作,您还可以使用Manager应用程序在Context中重新加载servlet类。

2012.06.28 16:11

第三章 在Tomcat中部署Servlet与JSP Web应用程序

1.Servlet背后的意义是不启动新进程而使用Java简单但功能强大的多线程以响应请求。(所有对CGI脚本的HTTP请求,意味着操作系统都必须产生及执行新的进程)

2.Tomcat的配置文件总是称Web应用程序为“context”。Tomcat的主配置文件server.xml有一个叫做Context的XML元素,代表了Web应用程序的配置。在5.0.x和更高的版本中,context XML片段文件必须驻留在CATALINA_HOME/conf/[EngineName]/[Hostname]/目录树中。

3.如果您希望进行热部署,那么除了热部署本身外,您大概不希望Tomcat在启动时部署Web应用程序,因此您还应该在Host上设置deployOnStartup="false"。如果不显示的这样设置,那么您的Web应用程序将每次都被部署两次:一次是“启动部署”,第二次是热部署。如果采用编辑server.xml文件的方法设置这些属性,就需要重启Tomcat,但是,如果使用Host Manager Web应用程序只在内存中设置这些属性,那么就不必重启Tomcat了。

4.将Web应用程序部署到Tomcat中可以使用两种方式:解包目录或WAR文件。笔者建议您,在大部分情况下都用解包的webapp目录进行部署,因为您可以检查、修改、移动单个资源。而对于工作于Web应用程序上的人而言,本地shell用户的安全防护是一个大问题,您最好将Web应用程序部署为一个WAR文件,从而对恶意篡改而言,只需监视一个文件就可以了。

5.Host Manager Web应用程序

Host Manager Web应用程序是Tomcat自带的Tomcat专用Web应用程序,在Tomcat正运行的时候,该程序允许用户动态创建主机。运行http://localhost:8080/host-manager/html以访问Host Manager。要想登陆该管理器,必须像Admin Web应用程序那样,在CATALINA_HOME/conf/tomcat-users.xml文件中增加一个admin角色。然后重启Tomcat。注:当用Host Manager Web应用程序增加主机时,对主机配置所增加或修改的内容都不被存储到磁盘上。在Tomcat保持运行状态时,这些新增或修改的配置只存在于内存中。

6.部署Servlet

通过在WEB-INF/web.xml文件中提供servlet-mapping元素,可以设定Servlet所对应的URI。如果想要提供另一种对应方式,将任何初始化参数传入servlet,设定在启动时的加载顺序等,则必须在描述文件中列出servlet。

<servlet>
  <servlet-name>InitParams</servlet-name>
  <servlet-class>InitParams</servlet-class>
  <init-param>
     <param-name>myParm</param-name>
     <param-value>A param</param-value>
  </init-param>
  <load-on-startup>25</load-on-startup>
</servlet>

7.创建归档文件(WAR)

cd c:\myhome\my-webapp

c:\myhome\my-webapp> jar cvf c:\temp\my-webapp.war .


2012.06.28 20:25

第四章 Tomcat的性能调校

建议一:将负载测试软件的机器与运行Tomcat的机器分开。

建议二:让负责测试的机器与运行Tomcat的机器之间通信隔离。在测试机器与模拟实际的在线服务器之间使用交换机或hub。

1.测试负载的工具,其主要的作法是按一定(大量)次数,请求Web服务器一种或多种资源,并计算出实际所占用的时间或每秒可以访问该网页的次数。常用的工具有:Apache Benchmark(ad)、Siege、Apache Jakarta 的JMeter和Faban。

JMeter不能像ad和siege所做的那样,每秒钟请求并完成那么多次HTTP请求。如果您不是为了不设法找出您的Tomcat能每秒响应多少次请求,JMeter是最好不过的选择了。

在相同的硬件、Tomcat版本和相同的基准调校下,JMeter报告的每秒请求数明显低于ab和siege。这证实了JMeter的HTTP客户端比ab和siege的客户端要慢。您可以使用JMeter查明Web应用程序、Tomcat安装或JVM是否发生了变化,Web网页响应耳朵时间是快了还是慢了,但不能是JMeter决定服务器能成功服务的最大请求数,因为JMeter的HTTP客户端显得比Tomcat的服务器模式要慢。

如果您正在寻找基于命令行的基准调校工具,那么采用ab就很不错。(Apache httpd)

ab -k -n 100000 -c 149 http://tomcathost:8080

     最多149个并发进程,要求该程序提取URL 100,000次。在基准调校测试的时候,测试客户端请求HTTP的数量越少,测试客户端提供的测试结果就可能越不精确,因为在基准调校过程中,Java VM的资源回收暂停(garbage collector pauses)占用了整个测试时间的较高比重。运行HTTP请求的总数量越多,资源回收暂停变得意义更小,而且基准调校测试结果将更能显示Tomcat的整体性能。在默认情况下线程数是150,所以不要超过这个数。

     如果在 ab命令行中删除-k,那么ab与Tomcat将不使用保持联机(keep-alive)连接,这样处理效率更低,因为它必须连接一个新的TCP包到Tomcat上,以执行每个HTTP请求。结果是每秒要处理的请求数更少了。而且Tomcat到客户端的吞吐量(throughput)更小了。

Siege是一个很好的命令行Web负载测试工具。

siege -b -r 671 -c 149 tomcathost:8080

必须提供每个线程要执行的请求数(671x149=100000)。给siege提供-b开关,以告诉siege正执行基准调校测试。就像ab一样,这使得siege的客户端线程在请求之间不存在等待的问题。在默认情况下,siege在请求之间会等待一段可配置的时间,但在基准调校模式下并不等待。siege不能测试已打开的持续联机(keep-alive)连接的数量。

siege每秒完成的事物(transaction)数明显低于ab,这表明siege的基准调校结果不如ab的精确。

siege报告的吞吐量明显低于ab报告的吞吐量。

ab完成基准调校的时间明显超过siege完成调校时间的一半。

要获得最优的调校结果,推荐ab。但要近似仿真实际操作员的用户产生的Web流量进行测试时用siege。

Faban,一个新的基准调校软件包。

20120702 16:10

2.作为JVM品牌的主流版本之间改进性能的一般列子,主要版本的更新能给您带来10%的性能增长。也就是说,从Java1.5JVM更新到Java1.6JVM,无需修改任何代码,就能使您的Web运行程序提速10%。
3.最佳实践:设置最小heap大小与最大heap大小相等。JVM提供商默认选择分配少量内存(在Sun JVM中是32M)以启动JVM,且如果Java应用程序需要更多内存,那么在应用程序暂停时,JVM的heap会被重新分配为更大。在达到heap内存大小的最高限度之前,JVM会在小内存增长过程中多次执行前面的重新分配。因为应用程序每次都要暂停,heap大小才会增长,那么性能也会受到影响。如果在Tomcat正提供Web应用程序网页时发生了这样的事情,那么对所有此时正在请求这一网页的Web客户端而言,暂停发生了,网页响应时间将显得比正常情况要长。为避免这种暂停,可以设置最小heap大小与最大heap大小相等。这样,JVM将不会在运行的时候尝试扩展heap大小。
4.内部调校
停用DNS查询
当Web应用程序想要记录客户端的信息时,它可以记录客户端的IP地址,或在“域名服务器”(DNS)数据中查询真正的主机名。DNS查询需要耗费网络资源,并涉及多部服务器的往返响应,而这些服务器可能位于遥远的地方,也可能尚未运行,因此导致延迟。您可以关闭DNS查询,以避免这些延迟。之后,每当Web应用程序调用在HTTP请求对象中的getRemoteHost()方法时,它只会得到IP地址。在Tomcat的server.xml文件中,您可以在应用程序的Connector对象中设定此功能。对于常用的“java.io”(HTTP 1.1)连接器,则请使用enableLookups属性改为“false”,然后重启Tomcat。关闭DNS查询不仅可以网络带宽、查询时间及内存,而且在因高网络流量而产生大量日志数据的网站中,还可以节省相当可观的硬盘空间。

调整线程数
另一种对应用程序之Connector性能控制的方法是控制其处理的进程数。Tomcat默认使用线程池以便对传入的请求提供快速响应。Java线程是一直分散流控制,自己可以与操作系统及本地内存互动。minThreads的值应该大到能够处理最小的负载量。为了防止流量暴增(或黑客的Dos攻击)让系统超出JVM的最大内存限制,而使服务器瘫痪,因此一定要设定上限。(以仿真的网络流量进行测试)
加快JSP的编译速度
当第一次访问JSP时,此JSP会转换成Java servlet的源代码,然后在编译成Java的bytecode。(用请求预编译JSP)
在Web应用程序启动时预编译JSP
例如,如果想让index.jsp在Web应用程序启动时就一直被预编译,则在web.xml文件中对该文件增加一个<servlet>标签,如下所示:
<servlet>
   <servlet-name>index.jsp</servlet-name>
   <jsp-file>/index.jsp</jsp-file>
   <load-on-startup>0</load-on-startup>
</servlet>
这种方法的缺陷在于Web应用程序启动的时间总是较长,因为在Web客户端能访问Web应用程序之前,必须预编译所指定的每个网页。
在编译时使用JspC预编译JSP
5.容量规划(分为经验式的容量规划和企业容量规划)
调校Tomcat在线服务器性能的另一重要部分就是容量规划。定义:通过研究及预测网站必须处理的总网络流量,决定可接受的服务质量及寻找满足或超越服务器软件需求,来预测网站所需的计算机硬件、操作系统与带宽的活动。JVM深入:《Java Performance Tuning》

第五章 与Apache Web服务器的整合
1.将Tomcat整合到其他的Web服务器的方法有多种:
以URL连接两个独立Web服务器
代理从Tomcat到Apache httpd的请求
通过mod_proxy代理从Apache httpd到Tomcat的请求
其他Apache httpd连接器模块,包括mod_jk
2.整合的优缺点:(单独运行Tomcat)
运行Tomcat而非其他产品的Web服务器具有下列优点:
与架设Apache httpd加独立的Tomcat相比,只架设独立的Tomcat更容易
无需担心Web服务器的连接器模块
独立的Tomcat相比于Apache httpd代理,对Tomcat的请求速度快很多
独立Tomcat具有潜在的更好的安全防护性
较易移植到其他计算机操作系统或架构
升级更加容易
缺点:
支持Tomcat的软件比支持Apache httpd的软件要少
比起Apache httpd,Tomcat的知名度较差
Tomcat的Web服务器的功能比Apache httpd少

增:

1.tomcat下的catalina:Tomcat的主要脚本,它会执行java命令以调用Tomcat的启动和停止类。
catalina 是脚本名,脚本catalina用于启动和关闭tomcat服务器,是最关键的脚本。
catalina 就是Tomcat服务器使用的 Apache实现的servlet容器的 名字。
Tomcat的核心分为3个部分: 
Web容器---处理静态页面; 
catalina --- 一个servlet容器-----处理servlet; 
还有就是JSP容器,它就是把jsp页面翻译成一般的servlet。
2.Run java -X for the list of options your VM accepts.
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
Sun HotSpot 1.4.1使用分代收集器,它把堆分为三个主要的域:新域、旧域以及永久域。Jvm生成的所有新对象放在新域中。
一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。在永久域中jvm则存储class和method对象。
就配置而言,永久域是一个独立域并且不认为是堆的一部分。 
新域比率设置成3,即新域与旧域比例为1:3
-XX:MaxNewSize=256m"的意思就是新域的最大值是256m
将最小heap的大小与最大heap的大小设置为相等,会减少heap的重新分配。(如果Java应用程序需要更多的内存,那么在应用程序暂停时,JVM
的heap会被重新分配为更大。在达到heap内存大小的最高限度之前,JVM会在小内存增长过程中多次执行前面的重新分配)
3.JNIP(java网络加载协议): JSR-56: The Java Network Launching Protocol & API (JNLP).A main feature of the Java Network Launching Protocol 
and API technology is the ability 
to automatically download and install Java Runtime Environments onto the users machine.


5.sakai OAE(Open Academic Environment)
6.查看环境变量的值:echo %JAVA_HOME%
7.后来较新版本的JDK(例如我使用的JDK1.6)安装完不会自动登记环境变量JAVA_HOME,JRE_HOME。所以需要手动设置环境变量:
JDK环境变量配置:
变量名:JAVA_HOME  变量值:
变量名:classpath  变量值:.;%JAVA_HOME%\lib\dt.jar;
并在path里加入%JAVA_HOME%\bin
Tomcat环境变量配置:
变量名:CATALINE_BASE    变量值:tomcat的路径
变量名:CATALINE_HOME    变量值:tomcat的路径
变量名:classpath中加入%CATALINE_HOME%\lib\servlet-api.jar
在path中加入%CATALINE_HOME%\bin


1.中间件(middleware)现在是在与操作系统,数据库并列的3大基础软件之一。
中间件处于操作系统软件与用户的应用软件之间。中间件在操作系统、网络和数据库之上,
应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发环境,帮助用户
灵活、高效地开发和集成复杂的应用软件。
中间件的作用:
1.中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,
减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上
移植而重复工作,从而大大减少了技术上的负担。
2.中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和
管理的工作量。
中间件的分类:
消息中间件(Message Orient middleware:MOM)
交易中间件(Transaction Processing:TP)
对象中间件(Object Momitor)
应用服务器(Application Server)
企业级应用集成(Enterprise Application Intergration:EAI)
安全中间件(Security Middleware)
2.java -Xmx=256M MyProg 执行MyProg的类文件,并给整个Java运行时进程分配最大256M的内存。
set JAVA_OPTS="-Xmx256M" #MS-DOS
3.8080端口是Tomcat HTTP服务器的默认端口,8005端口是Tomcat停止服务器的默认端口
4.如果让Tomcat在控制窗口中运行,则可以使用Ctrl+C中断它,Tomcat会捕捉到中断信号并停止运行。
5.不同的Tomcat实例(JVM)必须使用不同的HTTP端口,而且在server.xml文件中,server及connector元素中的每一个端口号也必须不同。

 

Tomcat问题解决:

1.启动Tomcat出现:java.lang.OutOfMemoryError:PermGen space

原因:PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。


解决方法1:

手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

解决方法2:修改eclipse.ini文件

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
-XX:PermSize=256M
-XX:MaxPermSize=512M

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值