tomcat响应流程原理(互联网Web服务容器)
在目前流行的互联网架构中,对一个应用来说,tomcat是首,SSM是中,JVM是尾,我们通常对于SSM是比较了解的,而忽略了首尾,而Tomcat在目前的网络编程中是举足轻重的,但是我们其实对Tomcat中很多原理性的东西不太了解,如果能够掌握Tomcat的原理,那么是非常有用的。本文将简单介绍Tomcat8的基本架构、配置以及如何调优。
1 Tomcat简介1.1 Tomcat是什么?Tomcat是一个免费的开源的Servlet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。
1.2 Tomcat总体框架结构
1.3Tomcat目录结构
2 Tomcat配置管理
JVM配置、服务器配置、 Web应用介绍、管理配置
2.1 Tomcat管理配置 JVM配置
主要介绍Tomcat启动时支持的JVM相关配置项。
服务器配置
主要介绍Tomcat conf目录下的配置。
Web应用介绍
主要介绍Servlet容器配置以及通过context.xml进行Web应用定制部署。
管理配置
主要介绍Tomcat支持的几种Web应用部署方式。
2.2 JVM配置
2.3 服务器配置
Tomcat在启动时,首先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。 Tomcat服务器的配置主要有:
- catalina.policy
- catalina.properties
- context.xml
- server.xml
- tomcat-users.xml
- web.xml
2.3.1 server.xml
The Server Component
- 顶层元素为<server>,这个元素对应着Tomcat结构中的server部分。这一行的意思是让Tomcat在8005端口监听关闭消息,如果使用telnet连接8005端口并输入SHUTDOWN,则tomcat就会关闭。为了安全,tomcat不会接受远程通过这个端口发的消息。
- <Server>还有一些其他属性,如果不做配置的话,这些属性将使用默认值,下面是这些属性的介绍:
- <Server>还有一些子标签,内容如下:
- Service component包括一组Connector和一个Engine,这些Connector监听不同端口不同协议的请求,并且这些Connector是并 发执行 的 ,Engine则被 用来处 看这些 请求 。 在默认 的server.xml中 ,service标签的内容如:<Service name="Catalina">。
- <service>可以有以下属性:
- <service>拥有这些子元素:
- The Connector Component
Tomcat提供了两种Connector,分别为HTTP/1.1和AJP/1.3。这两种Connector在默认的server.xml中的配置为:
- The Engine Component
一个Engine就是一个容器,servlet容器。一个Engine可以处理多个虚拟Host(apache中的概念)的请求。当Engine不知该将请求交给那个host时,Engine则将请求转给defaultHost来处理。
作为一个容器,Engine有许多子元素,具体内容如下表:
- The Realm Component
在默认的server.xml中,Engine中的第一个子标签就是<Realm>了,其代码如下:
这段代码是对一个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 Component都是一个容器,每个<Host>标签都表示一个virtual host,在默认的<server.xml>中,Host的配置如下:
这段代码的意思是:定义一个名为 localhost的虚拟主机,应用程序存放在CATALINA_HOME/webapps目录中。
unpackWARs="true"让tomcat在webapps文件夹中发现war文件时,自动将其解压。解压的好处是可以使程序运行更快,不解压也可以使用。 <Host>这些属性需要注意:
- The Host Component
<Host>有这些子标签:
在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内容如下:
在这里的web.xml被Context的一个后台程序监视,一旦发生改变,将重新部署这个Context。
Web应用中的META-INF/context.xml文件用于配置每个Web应用的定制化信息。它们的根节点为<Context>,配置方式与<Host>下的<Context>元素完全相同,此处不再赘述。我们可以在Web应用中的META-INF/context.xml文件中定义JDBC配置。
2.3.3 catalina.properties 更好的访问控制
- Tocmat以安全模式启动时,最后加载的一个文件就是catalina.properties,这个文件允许管理员在java package(java包)一级上进行权限控制。当有非法请求到达时,java package这一级的控制可以抛出SecurityException异常。
- 在catalina.properties中的这几行代码定义了限制访问的包:
- 这几行定义了common,server和shared的类加载器的路径:
- catalina.properties 的 最 后 一 行 开 启 了 string cache 的 诗 用 。 这 个 cache 将 在 ByteChunk.toString() 和CharChunk.toString()方法中使用 tomcat.util.buf.StringCache.byte.enabled=true。
根据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部署描述文件的几种配置:
SSI和CGI Servlet的配置
- Tocmat以安全模式启动时,最后加载的一个文件就是catalina.properties,这个文件允许管理员在java package(java包)一级上进行权限控制。当有非法请求到达时,java package这一级的控制可以抛出SecurityException异常。
- 下面的这个配置也是有关于tomcat以Standalone方式处理CGI请求的。
2.5 Tomcat配置管理
Tomcat提供的管理分为用于管理Host的host-manager和用于管理Web应用的manager。
Hostmanager
- host-manager默认添加了访问权限控制。关于用户角色、管理员的信息都在conf/tomcat-user.xml配置文件中。通过http://ip:port/host-manager/html访问该Web应用 。通过该页面可以自由添加删除、启动停止虚拟主机。admin-gui这个角色用于控制页面访问权限,admin-script用于控制以简单文本形式访问。
Manager
- manager的访问地址为http://ip:port/manager。manager-ui用于控制manager访问页面,manager-script用于控制以简单文本形式访问,manager-jmx用于控制jmx访问,manager-status用于控制服务器状态查看。通过该页面,我们可以上传部署一个WAR包,也可以将服务器上已经存在的部署包添加到应用服务器。可以启动、停止、重新加载、卸载指定Web应用,还可以诊断Web应用的内存泄漏问题以及SSL配置。访问http://ip:port/manager/status可以查看当前服务器的状态。
3.2 配置安全
安装部署问题
- 从官网或者知名服务商下载发布包,通过MD5/PGP验证发布包的完整性
- 对于doc、examples、ROOT目录,可以直接移除
- 避免使用root用户权限启动tomcat
- chroot jail下运行tomcat
- 删除$ CATALINA_HOME/webapps下的admin.xml和manager.xml,处理好Tomcat管理台的安全
修改关键配置
- 修改server.xml中修改shutdown监听配置以及AJP连接端口配置
- 在项目的WEB-INFO/web.xml文件中定制错误页面,在listings配置为false以实现文件列表访问控制
- 让 Apache httpd 保护 WEB-INF 及 META-INF 目录,实现多重服务器的安全防护模式
通过web.xml中的<secyrity-constraint>,对符合规则的请求增加访问控制;通过<login-config>可以指定安全认证的方式。
Realm
在Tomcat中用Realm接口表示一个安全域,用于完成用户认证以及验证用户的角色授权。Realm可以被添加到任意级别的Container(Context、Host、Engine),并对所有下级Container。其核心方法如下:
- authenticate:对指定的用户进行认证
- hasRole:判断用户是否拥有指定的角色
HttpServletRequest
Servlet规范在HttpServletRequest接口定义了几个方法可以用于完成安全认证和授权,此时我们不需要在web.xml配置<security-constration>,而是需要应用程序自己实现请求拦截处理。
Authenticator
Tomcat的认证授权数据是由Realm维护,认证工作却是由接口Authenticator完成的。Authenticator接口定义了如下方法:
- authenticate:用于web.xml配置了<security-constraint>时的认证,任何指定的约束都满足时返回true
- login:用于Servlet规范中的认证方法
- logout:用于Servlet规范中的注销方法
Tomcat既可以作为独立的Servlet容器,也可以作为其他HTTP服务器附加的Servlet容器。如果Tomcat在非独立模式下工作, 通常不必配置SSL,由它从属的HTTP服务器来实现和客户的SSL通信。Tomcat和HTTP服务器之间的通信无须采用加密机制,HTTP服务器将解 密后的数据传给Tomcat,并把Tomcat发来的数据加密后传给客户。
如果Tomcat作为独立的Java Web服务器,则可以根据安全需要,为Tomcat配置SSL,它包含以下两个步骤:
- 生成服务器端证书文件:使用keytool或者openssl命令行工具创建证书文件
- 配置SSL连接器
在Tomcat的server.xml文件中,已经提供了现成的配置SSL连接器的代码,只要把<Connector>元素的注释去掉即可:
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性能调优4.2 Tomcat性能测试及诊断
性能测试主要有两个指标量化:响应时间以及吞吐量。
常见测试方式:
负载测试、压力测试、持续运行时间测试
性能测试工具:
ApacheBench、ApacheJMeter
数据采集及分析
完成初步的性能测试后,如果发现系统性能较差,不能支持计划的用户规模,此时我们应先冷静分析一下系统缓慢的原因,识别系统性能瓶颈。如果我们希望进一步定位系统性能问题,需要获取更详尽的系统运行数据,具体如下:
- 网络:iftop,iptraf,tcptrack,netstat,tcpdump,ss等;
- 内存/CPU:top,vmstat,iostat,jstat,jmap,jstack等;
- 数据库访问:Redis,MongoDB,Hbase,Mysql,Oracle。
JVM优化
JVVM优化的重点重点集中在内存分配以及GC策略调整上,因为JVM垃圾回收机制会不同程度地导致程序运行中断。选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。JVM垃圾回收性能有一下两个主要的度量:
- 吞吐量:工作时间(排除GC时间)占总时间的百分比。工作时间包括程序运行时间以及内存分配时间。
- 暂停:测试时间段内,由垃圾回收导致的应用程序停止响应测次数。具体JVM如何优化,由于篇幅较长,本资料不做详细介绍。
Tomcat配置
- 调整server.xml的配置:调整MaxConnections、tcpNoDelay、MaxKeepAliveRequest、SocketBuffer等属性;
- 调整JSP页面设置;
- 与Web服务器集成:构建应用集群以及负载均衡。
小结
Tomcat的功能很多,我们需要有策略地使用调整,提升性能,具体参考文档《Tomcat架构解析》。
推荐学习 《Tomcat架构解析》
http://tomcat.apache.org/tomcat-8.0-doc/index.html
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com