tomcat web容器(比tomcat更好的web容器)

tomcat web容器(比tomcat更好的web容器)

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

1 Tomcat简介

1.1 Tomcat是什么?

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

1.2 Tomcat总体框架结构

tomcat web容器(比tomcat更好的web容器)

tomcat web容器(比tomcat更好的web容器)

1.3Tomcat目录结构

tomcat web容器(比tomcat更好的web容器)

2 Tomcat配置管理

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

2.1 Tomcat管理配置

 JVM配置

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

 服务器配置

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

 Web应用介绍

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

 管理配置

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

tomcat web容器(比tomcat更好的web容器)

2.2 JVM配置

tomcat web容器(比tomcat更好的web容器)

2.3 服务器配置

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

  • catalina.policy
  • catalina.properties
  • context.xml
  • server.xml
  • tomcat-users.xml
  • web.xml

tomcat web容器(比tomcat更好的web容器)

2.3.1 server.xml

 The Server Component

  • 顶层元素为<server>,这个元素对应着Tomcat结构中的server部分。这一行的意思是让Tomcat在8005端口监听关闭消息,如果使用telnet连接8005端口并输入SHUTDOWN,则tomcat就会关闭。为了安全,tomcat不会接受远程通过这个端口发的消息。
  • <Server>还有一些其他属性,如果不做配置的话,这些属性将使用默认值,下面是这些属性的介绍:

tomcat web容器(比tomcat更好的web容器)

  • <Server>还有一些子标签,内容如下:

tomcat web容器(比tomcat更好的web容器)

 

  • Service component包括一组Connector和一个Engine,这些Connector监听不同端口不同协议的请求,并且这些Connector是并 发执行 的 ,Engine则被 用来处 看这些 请求 。 在默认 的server.xml中 ,service标签的内容如:<Service name="Catalina">。
  • <service>可以有以下属性:

tomcat web容器(比tomcat更好的web容器)

  • <service>拥有这些子元素:

tomcat web容器(比tomcat更好的web容器)

  • The Connector Component

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

tomcat web容器(比tomcat更好的web容器)

  • The Engine Component

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

tomcat web容器(比tomcat更好的web容器)

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

tomcat web容器(比tomcat更好的web容器)

  • The Realm Component

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

tomcat web容器(比tomcat更好的web容器)

这段代码是对一个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的配置如下:

tomcat web容器(比tomcat更好的web容器)

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

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

tomcat web容器(比tomcat更好的web容器)

  • The Host Component

<Host>有这些子标签:

tomcat web容器(比tomcat更好的web容器)

在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容器(比tomcat更好的web容器)

 在这里的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中的这几行代码定义了限制访问的包:

tomcat web容器(比tomcat更好的web容器)

  • 这几行定义了common,server和shared的类加载器的路径:

tomcat web容器(比tomcat更好的web容器)

  • 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部署描述文件的几种配置:

tomcat web容器(比tomcat更好的web容器)

tomcat web容器(比tomcat更好的web容器)

 

 SSI和CGI Servlet的配置

  • Tocmat以安全模式启动时,最后加载的一个文件就是catalina.properties,这个文件允许管理员在java package(java包)一级上进行权限控制。当有非法请求到达时,java package这一级的控制可以抛出SecurityException异常。

tomcat web容器(比tomcat更好的web容器)

  • 下面的这个配置也是有关于tomcat以Standalone方式处理CGI请求的。

tomcat web容器(比tomcat更好的web容器)

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用于控制以简单文本形式访问。

tomcat web容器(比tomcat更好的web容器)

 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 Tomcat安全

3.1 Tomcat安全

tomcat web容器(比tomcat更好的web容器)

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 目录,实现多重服务器的安全防护模式

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>时的认证,任何指定的约束都满足时返回true
  • login:用于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>元素的注释去掉即可:

tomcat web容器(比tomcat更好的web容器)

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容器(比tomcat更好的web容器)

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架构解析》。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论