配置Tomcat虚拟主机和优化Tomcat
更新:HHH   时间:2023-1-7


Tomcatl介绍

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器

Tomcat组件及其特点

tomcat组件

servlet(应用程序或者容器)是java提供的用于开发web服务器应用程序的一个组件,运行在服务器端,有servlet用于生成动态页面内容,servlet是平台立的java类,编写一个servlet,实际上就是安装servlet规范编写一个java类

配置Tomcat虚拟主机和优化
案例需求
1)部署 Tomcat 服务。
2)配置虚拟主机。
3)Tomcat 优化。
4)常见错误分析及处理。
案例实现思路
1)安装 Tomcat 需要的环境。
2)安装 Tomcat 服务。
3)配置虚拟主机。
4)客户端安装压测软件进行压测并调优。
5)常见错误说明。
实验过程
1.下载并安装 JDK,部署Tomcat服务
详情可查看:https://blog.51cto.com/14557905/2464661
2.查看 Tomcat 安装后目录结构

1)bin
存放启动和关闭 Tomcat 的脚本文件, 比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件。
2)conf
存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context..xml、tomcat-users.xml、web.xml 四个文件。
3)lib
存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis, 那就需要添加相对应的 jar 包。
4)logs
存放 Tomcat 日志。
5)temp
存放 Tomcat 运行时产生的文件。
6)webapps
存放项目资源的目录。
7)work
Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到。
二、虚拟主机配置
可能有时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。例如现在新增两个域名 www.test.com 和 bbs.test.com,希望通过这两个域名访问到不同的项目内容。
1.创建 www 和 bbs 项目目录和文件

[root@localhost ~]# mkdir /usr/local/tomcat/webapps/www
[root@localhost ~]# echo "This is www page\!" > /usr/local/tomcat/webapps/www/index.jsp
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/bbs
[root@localhost ~]# echo "This is bbs page\!" > /usr/local/tomcat/webapps/bbs/index.jsp

2.修改 Tomcat 主配置文件
修改 Tomcat 主配置文件/usr/local/tomcat/conf/server.xml,在</Host>下面增加如下内容:

//关于 www.test.com 的虚拟主机配置
<Hostname="www.test.com"appBase="/usr/local/tomcat/webapps"
unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/www"
path="" reloadable="true" />
</Host>
//关于 bbs.test.com 的虚拟主机配置
<Host name="bbs.test.com" appBase="/usr/local/tomcat/webapps" 
unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/bbs"
path="" reloadable="true" />
</Host>
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh 
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh

3.测试
客户端绑定两个域名需要写入本机 hosts,Tomcat 默认端口是 8080。
192.168.9.236   www.test.com
192.168.9.236   bbs.test.com


三、Tomcat 优化
Tomcat 的缺省配置并不适合生产环境,它会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要有三方面,分为操作系统优化(内核参数优化),Tomcat 配置文件参数优化,Java 虚拟机(JVM)调优。其中最难理解的就是 jvm调优。
1.Tomcat 配置文件参数优化
关于 Tomcat 主配置文件 server.xml 里面很多默认的配置项,但并不能满足业务需求, 常用的优化相关参数如下。

  • maxThreads:Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,默认值是 200。
  • minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
  • maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。默认值是-1(无限制)。一般不需要指定。
  • URIEncoding:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 Web 服务器软件配置方便,需要分别指定。
  • connnectionTimeout:网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
  • enableLookups:是否反查域名,以返回远程主机的主机名,取值为:true 或 false, 如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。
  • disableUploadTimeout:上传时是否使用超时机制。应设置为 true。
  • connectionUploadTimeout:上传超时时间,毕竟文件上传可能需要消耗更多的时间, 这个根据你自己的业务需要自己调,以使 Servlet 有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
  • acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。
  • compression:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。
  • compressionMinSize:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。
  • compressableMimeType:压缩类型,指定对哪些类型的文件进行数据压缩。
    noCompressionUserAgents="gozilla, traviata":对于以下的浏览器,不启用压缩。

如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要在 Tomcat 中配置压缩了。因为这里只有一台 Tomcat 服务器,而且压测的是Tomcat 首页,会有图片和静态资源文件,所以这里启用压缩。
三、以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。链接 地 址 http://tomcat.apache.org/tomcat-9.0-doc/config/http.html , 下 面 开 始 对Tomcat 配置文件优化进行前后的对比。
压测脚本里设置的是 20 秒启动 4000 个线程数,并发为 2000,超时时间是 50000 毫秒。也可以适当的根据自己的需求进行修改。为了不那么复杂,从压测结果看只关注聚合报告, 聚合报告只关注 Average、90% Line、Error%这三列,因为压测 Tomcat 首页压力不会太大, 所以 Error 都是为 0 属于正常。先看一组优化前(默认的配置)压测截图

打开 Tomcat 主配置文件 server.xml,找到默认配置:

<Connector port="8080" protocol="HTTP/11.1" connectionTimeout="20000"
redirectPort="8443" />

将默认配置做修改:
<Connector port="8080" protocol="HTTP/11.1" 
connectionTimeout="20000" 
redirectPort="8443" minSpareThreads="50"
enableLookups="false" disableUploadTimeout="true" acceptCount="300" maxThreads="500" processorCache="500"
URIEncoding="UTF-8" 
compression="on" 
compressionMinSize="2048"

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image
/jpg,image/png"/>

重新启动 Tomcat 服务器,jmeter 还是继续保持同样的参数进行压测,优化后压测截图

常见错误说明
1.java.lang.OutOfMemoryError: Java heap space——JVM Heap(堆)溢出

JVM 在启动的时候会自动设置 JVM Heap 的值,其初始空间(即-Xms)是物理内存的 1/64,最大空间(-Xmx)不可超过物理内存。可以利用 JVM 提供的 -Xmn -Xms -Xmx 等选项可进行设置。Heap 的大小是 Young Generation 和 Tenured Generaion 之和。在 JVM 中如果 98% 的时间是用于 GC,且可用的 Heap size 不足 2%的时候将抛出此异常信息。

解决方法:手动设置 JVM Heap(堆)的大小。

2.java.lang.OutOfMemoryError: PermGen space——PermGen space 溢出

PermGen space 的全称是 Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Load 的时候被放入 PermGen space 区域,它和存放 Instance 的 Heap 区域不同,sun 的GC 不会在主程序运行期对 PermGen space 进行清理。所以,如果你的 APP 会载入很多 CLASS 的话,就很可能出现 PermGen space 溢出。

解决方法:手动设置 MaxPermSize 大小。

3.java.lang.StackOverflowError——栈溢出

JVM 依然是采用栈式的虚拟机,这个和 C 与 Pascal 都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的“层”太多了,以致于把栈区溢出了。通常来讲,一   般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要   1K 的空间(这个大约相当于在一个 C 函数内声明了 256 个 int 类型的变量),那么栈区也不过是需要 1MB 的空间。通常栈的大小是 1-2MB 的。
通常递归也不要递归的层次过多,很容易溢出。 解决方法:修改程序。

返回云计算教程...