tomcat响应流程原理(互联网Web服务容器)(1)

在目前流行的互联网架构中,对一个应用来说,tomcat是首,SSM是中,JVM是尾,我们通常对于SSM是比较了解的,而忽略了首尾,而Tomcat在目前的网络编程中是举足轻重的,但是我们其实对Tomcat中很多原理性的东西不太了解,如果能够掌握Tomcat的原理,那么是非常有用的。本文将简单介绍Tomcat8的基本架构、配置以及如何调优。

1 Tomcat简介1.1 Tomcat是什么?

Tomcat是一个免费的开源的Servlet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。

1.2 Tomcat总体框架结构

tomcat响应流程原理(互联网Web服务容器)(2)

tomcat响应流程原理(互联网Web服务容器)(3)

1.3Tomcat目录结构

tomcat响应流程原理(互联网Web服务容器)(4)

2 Tomcat配置管理

JVM配置、服务器配置、 Web应用介绍、管理配置

2.1 Tomcat管理配置

 JVM配置

主要介绍Tomcat启动时支持的JVM相关配置项。

 服务器配置

主要介绍Tomcat conf目录下的配置。

 Web应用介绍

主要介绍Servlet容器配置以及通过context.xml进行Web应用定制部署。

 管理配置

主要介绍Tomcat支持的几种Web应用部署方式。

tomcat响应流程原理(互联网Web服务容器)(5)

2.2 JVM配置

tomcat响应流程原理(互联网Web服务容器)(6)

2.3 服务器配置

Tomcat在启动时,首先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。 Tomcat服务器的配置主要有:

tomcat响应流程原理(互联网Web服务容器)(7)

2.3.1 server.xml

 The Server Component

tomcat响应流程原理(互联网Web服务容器)(8)

tomcat响应流程原理(互联网Web服务容器)(9)

tomcat响应流程原理(互联网Web服务容器)(10)

tomcat响应流程原理(互联网Web服务容器)(11)

Tomcat提供了两种Connector,分别为HTTP/1.1和AJP/1.3。这两种Connector在默认的server.xml中的配置为:

tomcat响应流程原理(互联网Web服务容器)(12)

一个Engine就是一个容器,servlet容器。一个Engine可以处理多个虚拟Host(apache中的概念)的请求。当Engine不知该将请求交给那个host时,Engine则将请求转给defaultHost来处理。

tomcat响应流程原理(互联网Web服务容器)(13)

作为一个容器,Engine有许多子元素,具体内容如下表:

tomcat响应流程原理(互联网Web服务容器)(14)

在默认的server.xml中,Engine中的第一个子标签就是<Realm>了,其代码如下:

tomcat响应流程原理(互联网Web服务容器)(15)

这段代码是对一个UserDatabase Realm的配置,它让默认的web应用程序(manager)加载tomcat-user.xml来进行用户验证。Realm可以从很多其他数据源获取验证数据,而这也正是不同的Realm的不同之处。一般地,Realm可以从这些数据源获取用户验证数据:

 内存(memory):使用在内存中存放的一个表格进行验证。这个表格是在tomcat启动时从一个xml文件加载到内存中的,在这个表格中的信息格式一般为:用户名/密码/角色。这种方式一般只用于测试和开发阶段,最终产品很少使用这种方式

 UserDatabase:实现了一个可以修改的、持久的memory Realm,可以向后兼容memory Realm。

 JDBC:使用一个关系数据库存放用户验证数据

 DataSource:类似于JDBC Realm,使用JNDI的方式来从关系数据库中拿用户验证数据,内容最终还是在一个关系数据库里。

 JNDI:使用JNDI来获取Realm数据,这些数据一般存放在LDAP目录下。

 JAAS: 使用JAAS来获取用户验证信息

每个Host Component都是一个容器,每个<Host>标签都表示一个virtual host,在默认的<server.xml>中,Host的配置如下:

tomcat响应流程原理(互联网Web服务容器)(16)

这段代码的意思是:定义一个名为 localhost的虚拟主机,应用程序存放在CATALINA_HOME/webapps目录中。

unpackWARs="true"让tomcat在webapps文件夹中发现war文件时,自动将其解压。解压的好处是可以使程序运行更快,不解压也可以使用。 <Host>这些属性需要注意:

tomcat响应流程原理(互联网Web服务容器)(17)

<Host>有这些子标签:

tomcat响应流程原理(互联网Web服务容器)(18)

在eclipse或 netbeans中,用户可以在META-INF/context.xml中做配置,这些IDE会自动在$CATALINA_HOME/conf/<engine name>/<host name>下创建"应用程序名.xml"文件。在war包(或文件夹)的META-INF中的配置文件叫做嵌入式配置文件(embedded),默认tomcat在部署时使用这些配置文件,管理员可以通过修改deployXML属性来禁止解析这种嵌入式配置文件。

2.3.2 context.xml

 在$CATALINA_HOME/conf目录下的context.xml是tomcat默认的context.xml文件,tomcat下所有的应用程序都使用这个文件的配置。因为它是公共的,因此里面的内容必须是所有web应用程序通用的,默认的context.xml内容如下:

tomcat响应流程原理(互联网Web服务容器)(19)

 在这里的web.xml被Context的一个后台程序监视,一旦发生改变,将重新部署这个Context。

 Web应用中的META-INF/context.xml文件用于配置每个Web应用的定制化信息。它们的根节点为<Context>,配置方式与<Host>下的<Context>元素完全相同,此处不再赘述。我们可以在Web应用中的META-INF/context.xml文件中定义JDBC配置。

2.3.3 catalina.properties

 更好的访问控制

tomcat响应流程原理(互联网Web服务容器)(20)

tomcat响应流程原理(互联网Web服务容器)(21)

2.4 Web应用配置

 根据servlet2.5的标准,任何一个servlet都必须在web.xml中注册,这个文件必须以web.xml放到web应用程序的WEB-INF目录下。这样可以这个web.xml就只对这个web应用程序有作用。

 在$CATALINA_HOME/conf下也有一个web.xml,这个web.xml是这个tomcat实例下所有web应用程序都可以使用的。不过可以在context中修改orverride属性,来决定各web应用程序的web.xml是否可以覆盖全局的web.xml。 以下为Web部署描述文件的几种配置:

tomcat响应流程原理(互联网Web服务容器)(22)

tomcat响应流程原理(互联网Web服务容器)(23)

 SSI和CGI Servlet的配置

tomcat响应流程原理(互联网Web服务容器)(24)

tomcat响应流程原理(互联网Web服务容器)(25)

2.5 Tomcat配置管理

Tomcat提供的管理分为用于管理Host的host-manager和用于管理Web应用的manager。

 Hostmanager

tomcat响应流程原理(互联网Web服务容器)(26)

 Manager

3 Tomcat安全3.1 Tomcat安全

tomcat响应流程原理(互联网Web服务容器)(27)

3.2 配置安全

 安装部署问题

 修改关键配置

3.3 应用安全

通过web.xml中的<secyrity-constraint>,对符合规则的请求增加访问控制;通过<login-config>可以指定安全认证的方式。

 Realm

在Tomcat中用Realm接口表示一个安全域,用于完成用户认证以及验证用户的角色授权。Realm可以被添加到任意级别的Container(Context、Host、Engine),并对所有下级Container。其核心方法如下:

 HttpServletRequest

Servlet规范在HttpServletRequest接口定义了几个方法可以用于完成安全认证和授权,此时我们不需要在web.xml配置<security-constration>,而是需要应用程序自己实现请求拦截处理。

 Authenticator

Tomcat的认证授权数据是由Realm维护,认证工作却是由接口Authenticator完成的。Authenticator接口定义了如下方法:

3.4 传输安全

 Tomcat既可以作为独立的Servlet容器,也可以作为其他HTTP服务器附加的Servlet容器。如果Tomcat在非独立模式下工作, 通常不必配置SSL,由它从属的HTTP服务器来实现和客户的SSL通信。Tomcat和HTTP服务器之间的通信无须采用加密机制,HTTP服务器将解 密后的数据传给Tomcat,并把Tomcat发来的数据加密后传给客户。

 如果Tomcat作为独立的Java Web服务器,则可以根据安全需要,为Tomcat配置SSL,它包含以下两个步骤:

在Tomcat的server.xml文件中,已经提供了现成的配置SSL连接器的代码,只要把<Connector>元素的注释去掉即可:

tomcat响应流程原理(互联网Web服务容器)(28)

3.5 Java安全策略

 catalina.policy

Tomcat默认安全策略文件主要包括3部分权限定义:JDK、Tomcat、Web应用。包含由java Security Manager 实现的安全策略声明。它替换了安装java时带有的java.policy文件。这个 文件用来防止欺骗代码或JSPs执行带有像System.exit(0)这样的命令的可能影响容器的破坏性代码. 只有当Tomcat用-security命令行参数启动时这个文件才会被使用。集体配置详见官网文档。

 注意

在实际开发过程中,我们需要结合应用系统的业务场景,综合考虑,而非一味地堆积各种安全配置,否则达不到预期效果,反而会影响系统的访问性能。

4 Tomcat性能调优4.1 Tomcat性能调优

tomcat响应流程原理(互联网Web服务容器)(29)

4.2 Tomcat性能测试及诊断

 性能测试主要有两个指标量化:响应时间以及吞吐量。

常见测试方式:

负载测试、压力测试、持续运行时间测试

性能测试工具:

ApacheBench、ApacheJMeter

 数据采集及分析

完成初步的性能测试后,如果发现系统性能较差,不能支持计划的用户规模,此时我们应先冷静分析一下系统缓慢的原因,识别系统性能瓶颈。如果我们希望进一步定位系统性能问题,需要获取更详尽的系统运行数据,具体如下:

4.3Tomcat性能优化

 JVM优化

JVVM优化的重点重点集中在内存分配以及GC策略调整上,因为JVM垃圾回收机制会不同程度地导致程序运行中断。选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。JVM垃圾回收性能有一下两个主要的度量:

 Tomcat配置

 小结

Tomcat的功能很多,我们需要有策略地使用调整,提升性能,具体参考文档《Tomcat架构解析》。

推荐学习

 《Tomcat架构解析》

 http://tomcat.apache.org/tomcat-8.0-doc/index.html

,