前言:
今天朋友们对“apachebenchtomcat”大概比较注重,看官们都需要分析一些“apachebenchtomcat”的相关知识。那么小编也在网络上搜集了一些对于“apachebenchtomcat””的相关资讯,希望看官们能喜欢,我们快快来学习一下吧!在目前流行的互联网架构中,对一个应用来说,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.policycatalina.propertiescontext.xmlserver.xmltomcat-users.xmlweb.xml2.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。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部署描述文件的几种配置:
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配置文件中。通过访问该Web应用 。通过该页面可以自由添加删除、启动停止虚拟主机。admin-gui这个角色用于控制页面访问权限,admin-script用于控制以简单文本形式访问。
Manager
manager的访问地址为。manager-ui用于控制manager访问页面,manager-script用于控制以简单文本形式访问,manager-jmx用于控制jmx访问,manager-status用于控制服务器状态查看。通过该页面,我们可以上传部署一个WAR包,也可以将服务器上已经存在的部署包添加到应用服务器。可以启动、停止、重新加载、卸载指定Web应用,还可以诊断Web应用的内存泄漏问题以及SSL配置。访问可以查看当前服务器的状态。3 Tomcat安全3.1 Tomcat安全3.2 配置安全
安装部署问题
从官网或者知名服务商下载发布包,通过MD5/PGP验证发布包的完整性对于doc、examples、ROOT目录,可以直接移除避免使用root用户权限启动tomcatchroot 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 目录,实现多重服务器的安全防护模式3.3 应用安全
通过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>时的认证,任何指定的约束都满足时返回truelogin:用于Servlet规范中的认证方法logout:用于Servlet规范中的注销方法3.4 传输安全
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。4.3Tomcat性能优化
JVM优化
JVVM优化的重点重点集中在内存分配以及GC策略调整上,因为JVM垃圾回收机制会不同程度地导致程序运行中断。选择不同的垃圾回收策略,调整JVM以及垃圾回收参数,可以极大地垃圾回收次数,提升垃圾回收效率,从而改善程序运行性能。JVM垃圾回收性能有一下两个主要的度量:
吞吐量:工作时间(排除GC时间)占总时间的百分比。工作时间包括程序运行时间以及内存分配时间。暂停:测试时间段内,由垃圾回收导致的应用程序停止响应测次数。具体JVM如何优化,由于篇幅较长,本资料不做详细介绍。
Tomcat配置
调整server.xml的配置:调整MaxConnections、tcpNoDelay、MaxKeepAliveRequest、SocketBuffer等属性;调整JSP页面设置;与Web服务器集成:构建应用集群以及负载均衡。
小结
Tomcat的功能很多,我们需要有策略地使用调整,提升性能,具体参考文档《Tomcat架构解析》。
推荐学习
《Tomcat架构解析》
标签: #apachebenchtomcat