目录
1.1 Tomcat概述
自2017年11月编程语言排行榜Java占比13%,高居榜首,Tomcat也一度成为Java开发人员的首选。其开源、占用系统资源少、跨平台等特性深受广大程序员喜爱。本章主要学习如何部署Tomcat服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据压测结果如何优化Tomcat服务及常见的内存溢出如何处理。
1.1.1 Tomcat介绍
自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在 SUN的JSWDK基础上开发一个可以直接提供 Web服务的JSP服务器,当然同时也支持 Servlet,这样Tomcat就诞生了。
Tomcat是 Apache 软件基金会(Apache Software Foundation) Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。其被JavaWorld杂志的编辑选为2001年度最具创新的Java产品,同时它又是 Sun公司官方推荐的Servlet和JSP容器,因此Tomcat越来越多的受到软件公司和开发人员的喜爱。由于有了Sun 的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范。因为Tomcat技术先进、性能稳定、免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上,Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当运行Tomcat时,它实际上作为一个与Apache独立的进程单独运行的。
当配置正确时,Apache 为HTML页面服务,而 Tomcat实际上运行JSP页面和Servlet。Tomcat和lIlS 等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat 处理静态HTML的能力不如Apache服务器。
1.1.2 Tomcat核心组件
通常意义上的Web服务器接受请求后,只是单纯地响应静态资源(如HTML文件、图片文件等),不能在后端进行一定的处理操作。Tomcat 是 Apache 下的一个子项目,它具备Web服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范的Java代码 Servlet,同时将执行的结果以HTML代码的形式返回客户端。
Tomcat由一系列的组件构成,其中核心的组件有三个。
1.1.3 Tomcat请求处理
Tomcat具体的处理请求过程如下所示。
1.2 Tomcat服务部署
1.2.1 下载并安装JDK
在部署Tomcat服务之前需要先部署好实验环境,本章实验环境的具体要求如表8-1所示。
在部署Tomcat之前必须安装好JDK,因为JDK是 Tomcat运行的必要环境。JDK的安装相对比较简单,版本有很多,本章选择基于linux64位.RPM版本。
下载完安装包后,将其上传到服务器/root目录下,执行安装命令。
上面显示安装完成,jdk 安装目录在/lusrljavaljdk1.8.0_171-amd64,,编辑/etc/profile文件,设置jdk的环境变量。具体操作如下。
1.2.2 安装启动Tomcat
1. 安装Tomcat服务
从Tomcat官网下载apache-tomcat-9.0.8.tar.gz稳定版本,将安装包解压后移动Tomcat目录到/usr/local下面,然后执行/usrlocal/tomcat/bin/startup.sh命令启动Tomcat即可。具体操作如下。
浏览器打开 http://192.168.9.236:8080进行访问会出现Tomcat主页,如图8.1所示。
2. 优化Tomcat服务启动时间
查看日志会发现Tomcat 第一次启动很慢,默认情况下都需要几十秒。修改JDK参数可以改善该状况,打开/usrljaval/jdk1.8.0_171-amd64/jre/lib/securityljava.security文件,找到如下内容:securerandom.source=file:/devlrandom 修改成securerandom.source=file:/dev/urandom。然后重启Tomcat就会发现启动时间变短很多。
3. Tomcat目录结构
执行ll /usr/local/tomcat'命令即可查看Tomcat安装后目录结构,如下图8.2所示.
Tomcat各目录的作用具体如下所示。
1.3 Tomcat配置与优化
1.3.1 虚拟主机配置
很多时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个Tomcat服务,这样会消耗太多的系统资源。此时,就需要使用到Tomcat虚拟主机。例如现在新增两个域名www.test.com和 bbs.test.com,希望通过这两个域名访问到不同的项目内容。
1. 创建www和bbs项目目录和文件
执行下面的命令,可以创建www和 bbs 项目目录和文件。
2. 修改Tomcat主配置文件
修改Tomcat主配置文件/usr/local/tomcatlconf/server.xml,在<Host>下面增加如下内容。
3. 虚拟主机访问测试
客户端绑定两个域名需要写入本机 hosts,Tomcat 默认端口是8080。
使用浏览器访问http://www.test.com:8080,页面效果如图8.3所示。
使用浏览器访问http://bbs.test.com:8080,页面效果如图8.4所示。
1.3.2 Tomcat优化
Tomcat 默认安装下的缺省配置并不适合生产环境,它会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java 虚拟机(JVM)调优。其中最难理解的就是JVM调优。系统优化本章不介绍,本章将配合jmeter 压测工具进行调优前和调优后的数据进行比较。
1. Tomcat配置文件参数优化
关于Tomcat主配置文件server.xml里面很多默认的配置项,并不能满足业务需求,常用的优化参数如下。
如果已经对代码进行了动静分离,静态页面和图片等数据就不需要Tomcat处理了,那么也就不需要在Tomcat中配置压缩了。因为这里只有一台Tomcat服务器,而且压测的是Tomcat首页,会有图片和静态资源文件,所以这里启用压缩。
以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTPConnector与 AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。链接地址 http:/ltomcat.apache.org/tomcat-9.0-doc/config/http.html,下面开始对Tomcat 配置文件优化进行前后的对比。
2. jmeter压测工具
要压测,首先学习关于jmeter压测工具基本的使用方法。执行步骤如下。
1)客户端安装JDK
从Oracle 官方下载JDK软件,JDK安装过程直接下一步即可。因为本章中所使用的客户端是Windows 10,所以JDK使用jdk-8u102-windows-x64 版本。
2)运行jmeter软件
本章中是使用的jmeter软件版本为apache-jmeter-3.1,双击运行apache-jmeter-3.1.rar压缩包->bin目录->ApacheJMeter.jar文件即可打开jmeter 软件,如图8.5所示。
3)打开压测脚本进行压测
点击左上角文件-→>打开->选择压测脚本,如图8.6所示。
单击第一排绿色三角按钮(鼠标指上去后会显示启动〉开始进行压测,如图8.7所示。
压测脚本里设置的是20秒启动4000个线程数,并发为2000,超时时间是50000毫秒。也可以适当的根据自己的需求进行修改。为了不那么复杂,从压测结果看只关注聚合报告,聚合报告只关注Average、90% Line、Error%这三列,因为压测Tomcat首页压力不会太大,所以Error都是为О属于正常。先看一组优化前(默认的配置)压测截图,如图8.8所示。
4)修改Tomcat配置
打开Tomcat主配置文件server.xml,找到如下默认配置
将Tomcat原本的默认配置修改为如下所示。
5)修改配置参数后压测
重新启动Tomcat 服务器, jmeter还是继续保持同样的参数进行压测,优化后压测截图,如8.9所示。
从结果看优化后的平均值和90%响应时间比优化前的快。
3. Java虚拟机(JVM)调优
Tomcat启动命令行中的优化参数,就是JVM的优化。Tomcat是Java程序,运行在JVM之上,因为它的启动其实也只是一个Java命令行,我们需要对这个Java的启动命令行进行调优。不管是YGC还是Full Gc、GC都会导致程序运行中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是一个极为复杂的过程,由于各个程序具备不同的特点,如 Web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于运行在各个机器上的配置不同(主要 CPU个数,内存不同),所以使用的GC 种类也会不同。下面对JVM参数做比较详细的说明。
Tomcat的启动参数位于安装目录${JAVA_HOME}/bin目录下,Linux操作系统就是catalina.sh 文件。Java_OPTS就是用来设置JVM相关运行参数的变量,下面具体看JVM常用参数详解。
以上就是一些常用的配置参数,但是有些参数是可以被替代的,配置思路需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾能够接受的速度和应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。假如堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。假如您把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为确保最好的性能,要把堆的大小设大,确保垃圾收集不在整个基准测试的过程中出现。
测试前,先还原Tomcat 到默认的配置文件,重启后压测一组优化前压测截图,如图8.10所示。
上述关于JVM优化参数太多,很多参数需要对GC回收有很深刻的认识。如果优化的不合适,往往会起到事倍功半的效果。下面是常见的优化参数,修改/usr/local/tomcat/bin/catalina.sh,增加红色字体。
重启Tomcat服务再次进行一轮压测,如图8.11所示。
从图8.12结果可以得出,优化后的平均值和90%响应时间比优化前的快。在每次优化完后压测数据都可能会存在差异,甚至环境一样压测结果都会不一样,一般都是取多组数据平均值。本章中的优化配置也不一定适合你的环境,但是至少优化的方向是正确的。如果想对jmeter进行深入学习,请查阅相关文档