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 里面很多默认的配置项,但并不能满足业务需求, 常用的优化相关参数如下。
如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 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 的。
通常递归也不要递归的层次过多,很容易溢出。 解决方法:修改程序。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。