目录
2.1http协议和B/S(Browser/Server)结构
[3.2 java](#3.2 java)
[3.2.2 Java 组成](#3.2.2 Java 组成)
[3.3.1 Servelt](#3.3.1 Servelt)
[3.3.2 Jsp](#3.3.2 Jsp)
[3.4 JDK](#3.4 JDK)
[3.4.2 Oracle JDK版本](#3.4.2 Oracle JDK版本)
[3.4.3 Open JDK](#3.4.3 Open JDK)
[3.4.3.1安装Open JDK](#3.4.3.1安装Open JDK)
[3.4.3.2yum安装官方Oracle JDK](#3.4.3.2yum安装官方Oracle JDK)
4.2.1知识拓展------Tomcat和Catalina的关系
[4.9 Context](#4.9 Context)
前言
自 2017 年 11 月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据压测结果如何优化 Tomcat 服务及常见的内存溢出如何处理。
一、Tomcat简介
1.Tomcat介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
2.Web技术
2.1http协议和B/S(Browser/Server)结构
操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以被CPU调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为---个服务器为多个客户端提供计算服务。
客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进程间通信需要使用网络编程。最常见的网络编程接口是socket。
Socket称为套接字,本意是插座。也就是说网络通讯需要两端,如果一端被动的接收另一端请求并提供计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端。
这种编程模式称为Client/Server编程模式,简称C/S编程,开发的程序也称为C.S程序。CIS编程往往使用传输层协议(TCPIUDP),较为底层,比如:QQ,迅雷,云音乐,云盘, foxmail, xshell等。
1990年HTTP协议和浏览器诞生。在应用层使用文本跨网络在不同进程间传输数据,最后在浏览器中将服务器惴返回的HTML渲染出来。由此,诞生了网页开发。
网页是存储在WEB服务器端的文本文件,浏览器发起HTTP请求后,到达WNEB服务程序后,服务程序根据URL读取对应的HTML文件,并封装成HTP响应报文返回给浏览器端。
起初网页开发主要指的是HTML、CSS等文件制作,目的就是显示文字或图片,通过超级链接跳转到另一个HTML并显示其内容。
后来,网景公司意识到让网页动起来很重要,傍着SUN的ava的名气发布了JavaScript语言,可以在浏览器中使用5引攀执行的脚本语言,可以让网页元素动态变化。网页动起来了。
为了让网页动起来,微软使用ActiveX技术、SUN的Applet都可以在浏览器中执行代码,但都有安全性问题。能不能直接把内容直接在WEB服务器端组织成HTML,然后把HTML返回给浏览器渲染呢?
最早出现了CGl (Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为WEB后端编程。有一部分程序员还是要编写HTML、CSS、JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程。
2.2前端三大核心技术
2.2.1HTML
Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构
html
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>HTML语言</title>
</head>
<body>
<img src="http://www.kgc.com/wp-content/uploads/2017/09/logo.png" >
<h1 style="color:red">欢迎</h1>
<p><a href=http://www.kgc.com>课工场</a>欢迎你</p>
</body>
</html>
#注意:html文件编码为utf-8编码
2.2.2CSS
Cascading Style Sheet 层叠样式表, 定义了如何显示(装扮) HTML 元素,比如:字体大小和颜色属性等。样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单的 CSS 文档,可以同时改变站点中所有页面的布局和外观。
css
#test.html 建议用Vscode创建文件,用记事本可能会出现乱码
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="mystyle.css" />
</head>
<body>
<h1>这是 heading 1</h1>
<p>这是一段普通的段落。请注意,该段落的文本是红色的。在 body 选择器中定义了本页面中的默认文本颜
色。</p>
<p class="ex">该段落定义了 class="ex"。该段落中的文本是蓝色的。</p>
</body>
</html>
2.2.3Javascript
javascript,实现网页的动画效果,但实属于静态资源
Javascript简称S,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,得到了几乎主流浏览器支持。
1994年,网景Netscape公司成立并发布了Netscape Navigator刘览器,占据了很大的市场份额,网景意识到WEB需要动态,需要一种技术来实现。
1995年9月网景浏览器2发布测试版本发布了LiveScript,随即在12月的测试版就更名为JavaScript。同时期,微软推出IE并支持Sscript、VBScript,与之抗衡。
1997年,网景、微软、SUN、Borland公司和其他组织在ECMA(European Ccomputer Manufacturers Association欧洲计算机制造商协会)确定了EGMAScript的本程序设计语言的标准。JavaScript和JScript都成为ECMAScript标准的实现。
2008年后随着chrome浏览器的V8引|擎发布。
V8JS引|擎不是解释执行,而是本地编译,在V8B引擎做了很多优化,JS程序在其上运行堪比本地二进制程序。V8引擎使用C++开发,可以嵌入到任何C++程序中。基于V8引擎,2009年基于服务器javascript的运行环境Node.js诞生,创建了第一版npm (Node js包管理嚣和开源库生态系统)提供了大显的库供程序员使用。从此,便可以在服务器端真正大规模使用javaScript编程了。也就是说JavaScript 也可以真正称为服务器端编程语言了,成为目前唯一的前,后端通用的语言。
同步:
交互式网页,用户提交了请求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪怕URL不变,整个网页都需要重新渲染。例如,用户填写注册信息,只是2次密码不一致,提交后,整个注册页面重新刷新,所有填写项目重新填写(当然有办法让用户减少重填)。这种交互非常不友好。从代价的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些请求的过程,就是同步过程,用户发起请求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
异步:
1996年微软实现了iframe标签,可以在一个网页使用iframe标签局部异步加载内容。
1999年微软推出异步数据传输的ActiveX插件技术,太笨重了,但是也火了很多年。有一个组件XMLHttpRequest被大多数浏览器支持。
传统的网页如果需要更新内容,必需重数整个网页面。Ajax的出现,改变这一切,同时极大的促进了Javascript的发展。Ajax即"Asynchronous Javascript AndXML"(异步JavaScript和XML),是指一种创建交互式、快速动态网页应用的网页开发技术,最早起源于1998年微软的Outook Web Access开发团队。Ajax通过在后台与服务器进行少量数据交换,可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript通过调用浏览器内置的WEB API中的XMLHttpRequest对象实现Ajax技术。早期Aijax结合数据格式XML,目前更多的使用)SON。利用AAX可实现前后端开发的彻底分离,改变了传统的开发模式。
javascript
<!DOCTYPE html>
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
</head>
<body>
<h2>我的第一个 JavaScript</h2>
<button type="button"
onclick="document.getElementById('demo').innerHTML = Date()">
点击这里来显示日期和时间
</button>
<p id="demo"></p>
</body>
</html>
3.java基础
3.1Web架构
3.1.1Web资源和访问
PC端或移动端浏览器访问 从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务器请求图片资源显示 从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端
手机 App访问 内置了HTML和]S文件,不需要从静态WEB服务器下载JS或HTML。为的就是减少文件的发送,现代前端开发使用的S文件太多或太大了有必要就从图片服务器请求图片,从业务服务器请求动态数据 客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
3.1.2后台应用架构
3.1.2.1单体应用架构
传统架构(单机系统)。-个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统一部署,一个进程
- all in one的架构方式,把所有的功能单元放在一 个应用里。然后把整个应用部署到一台服务器上。如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
- Java实现: JSP、 Servlet, 打包成-个jar. war部署
- 易于开发和测试:也十分方便部署:当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
- 如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停掉整个服务,重新整体重新打包、部署这个应用war包,功 能模块相互之间耦合度高,相互影响,不适合当今互联网业务功能的快速迭代。
- 特别是对于-一个大型应用,我们不可能吧所有内容都放在一 个应用里面,我们如何维护、如何分工合作都是问题。如果项目庞大,管理难度大
- web应用服务器:开源的tomcat. jetty. glassfish。 商用的有weblogic、websphere. Jboss
属于SOA (Service Oriented Architecture)的子集 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等 ·从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁 微服务架构(分布式系统),各个模块/服务,各自独立出来,"让专业的人干专业的事",独立部署。分布式系统中,不同的服务可以使用各自独立的数据库。·服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)。
微服务设计的思想改变了原有的企业研发团队组织架构。传统的研发组织架构是水平架构,前端、后端、DBA、测试分别有自己对应的团队,属于水平团队组 织架构。而微服务的设计思想对团队的划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负责,支付业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直架构只是一种理想的架构 ·微服务的实现框架有多种,不同的应用架构,部署方式也有不同
3.1.2.2微服务
bash
https://www.martinfowler.com/microservices/
3.1.2.3单体架构和微服务比较
3.1.2.4微服务的优缺点
优点
- 每个服务足够内聚,足够小,代码容易理解。这样能聚焦一个只当的业务功能或业务需求。
- 开发简单、开发效率提高,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发人员组成
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
- 微服务能使用不同的语言开发
- 易于和第三方集成,微服务运行容易且灵活的方式集成自动部署,通过持续集成工具,如: Jenkins、Hudson、Bamboo·微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值。微服务允许你利用融合最新技术。微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合,即前后端分离·每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库
缺点
- 微服务把原有的一个项目拆分成多个独立工程,增加了开发、测试、运维、监控等的复杂度
- 微服务架构需要保证不同服务之间的数据一致性,引入了分布式事务和异步补偿机制,为设计和开发带来一定挑战·开发人员和运维需要处理分布式系统的复杂性,需要更强的技术能力
- 微服务适用于复杂的大系统,对于小型应用使用微服务,进行盲目的拆分只会增加其维护和开发成本
3.2 java
3.2.1Java的历史
Java原指的是印度尼西亚的爪哇岛,人口众多,盛产咖啡、橡胶等。
Java语言最早是在1991年开始设计的,最初叫Oak项目,它初衷是跑在不同机顶盒设备中的。
1993年网景公司成立。Oak项目组很快他们发现了浏览器和动态网页技术这个巨大的市场,转向WEB方向。并首先发布了可以让网页动起来的Applet技术(浏览器中嵌入运行Java字节码的技术)。
在1995年,一杯爪哇岛咖啡成就了Java这个名字。
Sun公司第一个Java公开版本1.0发布于1996年。口号是"一次编写,到处运行"(Write once,Run anywhere),跨平台运行。
1999年,SUN公司发布了第二代Java平台(Java2)。
2009年4月20日,Oracle甲骨文公司宣布将以每股9.50美元,总计74亿美金收购SUN(计算机系统)公司。2010年1月成功收购
2010年,Java创始人之一的 James Gosling 离开了Oracle,去了Google。
2010年8月13日,Oracle在加利福尼亚地方法院起诉Google侵犯版权和专利权。Oracle声称Google侵犯了Java 37个API和部分专利。地方法院的陪审团认为未侵犯专利,且API无版权。
2016年5月26日,地方法院二审陪审团认定未侵犯版权,对37个JAVA API的重新实现受到合理使用的保护。
2017年Oracle上诉美国联邦巡回上诉法院,2018年3月27日判决Oracle胜诉,Google应赔偿近90亿美金。
2019年1月Google想让美国最高法院撤销联邦法院裁决。谷歌表示裁决是"对软件业的毁灭性一击"。现任特朗普政府支持Oracle公司,但微软、Mozilla、 红帽支持Google。目前案件已经受理,但由于疫情推迟。有更多的企业和组织加入进来,包括IBM、计算机和通信协会、互联网协会、超过150名学者和教授。此案如果Oracle胜诉,将在美国形成判例,将深远广泛影响软件业。例如: POSIX接口, 是商用系统UNIX的兼容接口规范。
3.2.2 Java 组成
Java包含下面部分:
- 语言、语法规范。关键字,如: if、for、class等
- 源代码source code
- 依赖库,标准库(基础).I第三方库(针对某些应用)。底层代码太难使用且开发效率低,封装成现成的库
- JVM虚拟机。将源代码编译为中间码即字节码后,再运行在JVM之上
由于各种操作系统ABl不一样,采用编译方式,需要为不同操作系统编译成相应格式的二进制程序才能运行。
1995年,Java发布Applet技术,Java程序在后台编译成字节码,发送到浏览器端,在浏览器中运行一个Applet程序,这段程序是运行在另外一个VM进程中的但是这种在客户端运行ava代码的技术,会有很大的安全问题。1997年CGl技术发展起来,动态网页技术开始向后端开发转移,在后端将动态内容组织好,拼成HTML发回到浏览器端。
java程序写好后,使用java的编译器,编译成字节码(二进制文件),运行在java虚拟机上,在编译成 各个系统的的执行文件
示例:实现java hello
bash
[root@localhost ~]#yum install java -y
[root@localhost ~]#yum install epel-release.noarch -y
[root@localhost ~]#yum provides */javac
[root@localhost ~]#cd /opt
[root@localhost opt]#yum install java-1.8.0-openjdk-devel -y
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
Hello.java
[root@localhost opt]#javac Hello.java
#生成class文件
[root@localhost opt]#java Hello
hello, world
[root@localhost opt]#ls
Hello.class Hello.java
3.3实现动态网页功能
3.3.1 Servelt
本质是一段java程序;原理就是在java程序中嵌入 html语言
java
import java.io.*;
import javax.servlet . * ;
import javax. servlet . http .*;
public class Helloword extends HttpServlet {
private string message;
public void init( )throws Serv1etException
{
message = "He1lo wor 1d";
}
public void doGet(HttpservletRequest request,
HttpServletResponse response)
throws servletException,IOException
{
response.setContentType("text/htm1");//响应报文内容类型
printwriter out = response.getwriter(; //构建响应报文内容
out.print1n("<h1>" + message + "</h1>");
out.print1n("<p><a href=http://www.kgc.com>课工场</a>欢迎你</p>");
}
public void destroyo{
{
}
}
在Servlet中最大的问题是,HTML输出和java代码混在一起,如果网页布局要调整,Java源代码就需要随之进行调整,对于开发人员来说就是噩梦(需要操作很多的输入[printwriter]和输出[out.print])
3.3.2 Jsp
JSP本质是提供一个HTML模板,也就是在网页中预留以后填充的空,后续将Java程序运行生成的数据对HTML进行填空就可以了。如果网页布局需要调整!JAVA源代码不需要很大的调整
java
<%@page language="java" contentType="text/htm1; charset=UTF-8"
pageEncoding="UTF-8"%>
<! DOCTYPE html>
I<htm1>
<head>
<meta charset="utf-8">
<title>jsp例子</title></head>
<body>
本行后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out. print1n(""你的IP地址" + request.getRemoteAddr(C);
%>
</body></htm1>
JSP是基于Servlet实现,JSP将表现和逻辑分离,这样页面开发人员更好的注重页面表现力更好服务客户。
不过最终JSP还需要先转换为Servlet的源代码,java文件(Tomcat中使用asper转换),只不过这个转换过程无需人工完成是通过工具自动实现的然后再编译成.class文件,最后才可以在JVM中运行。 比如:浏览器第一次请求testjspi时, Tomcat服务器会自动将testisp转化sltest.spjava这么一个类并将该文件编译成cass文件。编译完毕后再运行class文件来应浏览器的请求。如果以后访问testjsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。后续如果Tomcat检测到SP页面改动了的话,会重新编译
JSP类似于PHP和ASP,前端代码和后端JAVA代码混写在一起需要前端和后端工程师在一起协作才能完成,无法做到真正的前后端分离开发 在web早期的开发中,通常采用的分为两层,视图层和模型层。
- 优点:架构简单,比较适合小型项目开发
- 缺点:JSP职责不单一,职责过重,不便于维护
Serverlet作为Java的一个程序,Jsp作为Java的模版文件,Jsp和html最后会合并成为一个Serverlet文件
3.4 JDK
3.4.1JDK的认识
JDK(Java Development Kit),即Java语言的软件开发工具包JDK协议基于JRL(JavaResearch License)协议;其包含Java工具包(jar打包工具)、Jre(库文件,提供基础功能,第三方功能)、Jvm(虚拟机)。
如果只需要跑Java脚本的话,不需要打包,不需要开发,那么只安装Jvm即可;
这里我们建议还是安装Jdk,因为如果配置文件出现问题还是需要开发调试配置。
- Java SE APl: Java 基础类库开发接口
- JRE: Java Runtime Environment缩写,指Java运行时环境,包含JVM +Java核心类库
- JDK: Java Development Kit,即Java语言的软件开发工具包JDK协议基于JRL(JavaResearch License)协议
- JVM:Java Vritual Machine 虚拟机
JVM各种版本 参考链接
https://en.wikipedia.org/wiki/List_of_Java_virtual_machines
https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines
各个公司和组织基于标准规范,开发了不同的JVM版本
- SUN HotSpot
- IBM J9VM
- BEA JRockit
JVM市场份额
2018年12月,由 Snyk 和 The Java Magazine 联合推出发布的 2018 JVM 生态调查报告
3.4.2 Oracle JDK版本
JDK也就是常说的J2SE,在1999年,正式发布了Java第二代平台,发布了三个版本:
- J2SE:标准版,适用于桌面平台
- J2EE:企业版,java在企业级开发所有规范的总和,共有13个大的规范,Servlet、Jsp都包含在JavaEE规范中
- J2ME:微型版,适用于移动、无线、机顶盒等设备环境
2005年,Java的版本又更名为JavaSE、JavaEE、JavaME
JDK7 JDK8、JDK11是LTS(Long Term Support)
JDK历史版本:https://en.wikipedia.org/wiki/Java_version_history
JDK版本名称
版本 | 项目名称 | 发行日期 |
---|---|---|
JDK 1.0 | Oak(橡树) | 1996-01-23 |
JDK 1.1 | 1997-02-19 | |
JDK 1.1.4 | Spaekler(宝石) | 1997-09-12 |
JDK 1.1.5 | Pumpkin(南瓜) | 1997-12-13 |
JDK 1.1.6 | Abigail(阿比盖尔-女子名) | 1998-04-24 |
JDK 1.1.7 | Brutus(布鲁图-古罗马政治家和将军) | 1998-09-28 |
JDK 1.1.8 | Chelsea(切尔西-城市名) | 1999-04-08 |
JDK 1.2 | Playground(运动场) | 1998-12-04 |
JDK 1.2.1 | none(无) | 1999-03-30 |
JDK 1.2.2 | Cricket(蟋蟀) | 1999-07-08 |
JDK 1.3 | Kestrel(美洲红隼) | 2000-05-08 |
JDK 1.3.1 | Ladybird(瓢虫) | 2001-05-17 |
JDK 1.4.0 | Merlin(灰背隼) | 2002-02-13 |
JDK 1.4.1 | grasshopper(蚱蜢) | 2002-09-16 |
JDK 1.4.2 | Mantis(螳螂) | 2003-06-26 |
Java SE 5.0(1.5.0) | Tiger(老虎) | 2004-09-30 |
Java SE 6.0(1.6.0) | Mustang(野马) | 2006-12-11 |
Java SE 7.0(1.7.0) | Dolphin(海豚) | 2011-07-28 |
Java SE 8.0(1.8.0) | Spider(蜘蛛) | 2014-03-18 |
Java SE 9 | 2017-09-21 | |
Java SE 10 | 2018-03-14 | |
Java SE 11 | 2018-09-25 | |
Java SE 12 | 2019-03-19 | |
Java SE 13 | 2019-09-17 | |
Java SE 14 | 2020-03-17 |
收费
从2019年1月份开始,Oracle JDK 开始对 Java SE 8 之后的版本开始进行商用收费,确切的说是8u201/202 之后的版本。如果你用 Java 开发的功能如果是用作商业用途的,如果还不想花钱购买的话,能免费使用的最新版本是 8u201/202。当然如果是个人客户端或者个人开发者可以免费试用 Oracle JDK 所有的版本。
发版方式
在 JDK 9 发布之前,Oracle 的发版策略是以特性驱动的,只有重大的特性改变才会发布大版本,比如JDK 7 到 JDK 8,中间会发多个更新版本。而从 JDK 9 开始变为以时间驱动的方式。发布周期为6个月一个大版本,比如 JDK 9 到 JDK 10,3个月一次补丁版,3年一个 LTS(长期支持版本)。
3.4.3 Open JDK
OpenJDK是Sun公司采用GPL v2协议发布的JDK开源版本,于2009年正式发布。
官方网站:https//openjdk.java.net/projects/jdk6/
OpenJDK 7是基于JDK7的beta版开发,但为了也将Java SE 6开源,从OpenJDK7的b20构建反向分支开发,从中剥离了不符合Java SE 6规范的代码,发布OpenJDK 6。所以OpenJDK6和JDK6没什么关系,只是API兼容而已
OpenJDK使用GPL v2可以用于商业用途。目前由红帽维护。OpenJDK也有在其基础上的众多发行版,比如阿里的Dragonwell。
相对来说,Oracle jDK具有更好的响应能力和JVM性能,更加稳定。
3.4.3.1安装Open JDK
在CentOS中,可以使用 yum 仓库安装 openjdk
bash
[root@localhost data]#yum list "*jdk*"
#查看可以安装哪些版本
[root@localhost data]#yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel
#安装 jdk 环境
[root@localhost data]#java -version
#查看版本
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
3.4.3.2yum安装官方Oracle JDK
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
#注意需要注册登录后,才能下载JDK
准备jdk-8u291-linux-x64.rpm包
bash
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
jdk-8u291-linux-x64.rpm
[root@localhost opt]#yum install jdk-8u291-linux-x64.rpm -y
[root@localhost opt]#rpm -q jdk1.8.x86_64
jdk1.8-1.8.0_291-fcs.x86_64
[root@localhost opt]#find / -name javac
/var/lib/alternatives/javac
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/bin/javac
/usr/java/jdk1.8.0_291-amd64/bin/javac
[root@localhost bin]#vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
[root@localhost bin]#. /etc/profile.d/jdk.sh
[root@localhost bin]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
3.4.3.3二进制安装
二进制安装是编译安装的一个分支
准备jdk-8u291-linux-x64.tar.gz 压缩包
bash
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@localhost opt]#cd /usr/local/
[root@localhost local]#ls
bin etc games include jdk1.8.0_291 lib lib64 libexec sbin share src
[root@localhost local]#ln -s jdk1.8.0_291/ jdk
[root@localhost local]#ls
bin games jdk lib libexec share
etc include jdk1.8.0_291 lib64 sbin src
[root@localhost local]#vim /etc/profile.d/fdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
[root@localhost local]#. /etc/profile.d/fdk.sh
[root@localhost local]#exit
[root@localhost ~]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
4.Tomcat基础功能
4.1Tomcat历史和介绍
4.1.1Web应用服务器
- 商用:IBM WebSphere、Oracle WebLogic(原属于BEA公司)、Oracle Oc4j、RedHat JBoss等
- 开源:Tomcat、Jetty、Resin、Glassfish
4.1.2Tomcat介绍
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat具有处理HTML页面的功能,它还是一个Servlet和JSP容器 起始于SUN公司的一个Servlet的参考实现项目Java Web Senver,开发者是James Duncan Davidson,在19年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目JServ合并,并开源成为顶级项目 Tomcat仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。 著名图书出版商O'Relly约稿该项目成员Davidson希望使用一个公猫作为封面,但是公猫已经被使用,书出版后封面是一只雪豹。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器,起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
著名图书出版商O'Reilly约稿该项目成员Davidson希望使用一个公猫作为封面,但是公猫已经被使用,书出版后封面是一只雪豹。
《Tomcat权威指南》封面如下
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。
Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等
当前 Tomcat 的正式版本已经更新到 9.0.x 版本,但当前企业中主流版本为 8.x 和 7.x
官网文档: https://tomcat.apache.org/tomcat-8.5-doc/index.html
帮助文档:
4.1.3Tomcat各版本区别
Servlet Spec | JSP Spec | EL Spec | WebSocket Spec | Authentication(JASIC)Spec | Apache Tomcat Version | Latest Released Version | Supported Java Versions |
---|---|---|---|---|---|---|---|
5.0 | 3.0 | 4.0 | 2.0 | 2.0 | 10.0.x | 10.0.0-M1 | 8 and later |
4.0 | 2.3 | 3.0 | 1.1 | 1.1 | 9.0.x | 9.0.31 | 8 and later |
3.1 | 2.3 | 3.0 | 1.1 | 1.1 | 8.5.x | 8.5.51 | 7 and later |
3.1 | 2.3 | 3.0 | 1.1 | N/A | 8.0.x(superseded) | 8.0.53(superseded) | 7 and later |
3.0 | 2.2 | 2.2 | 1.1 | N/A | 7.0.x | 7.0.100 | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | N/A | N/A | 6.0.x(archived) | 6.0.53(archived) | 5 and later |
2.4 | 2.0 | N/A | N/A | N/A | 5.5.x(archived) | 5.5.36(archived) | 1.4 and later |
2.3 | 1.2 | N/A | N/A | N/A | 4.1.x(archived) | 4.1.40(archived) | 1.3 and later |
2.2 | 1.1 | N/A | N/A | N/A | 3.3.x(archived) | 3.3.2(archived) | 1.1 and later |
4.2安装Tomcat
不建议使用yum安装,因为yum安装的话,版本有些旧;可以通过yum list tomcat*查看可以安装哪些tomcat包
CentOS 7 的yum源的tomcat版本老旧,而CentOS8 yum源里无tomcat
目前比较主流的Tomcat是8.5.X版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式
可以通过官方站点进行下载
bash
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#tar xf apache-tomcat-9.0.16.tar.gz
[root@localhost opt]#ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#cp -r apache-tomcat-9.0.16 /usr/local/
[root@localhost opt]#cd /usr/local/
[root@localhost local]#ls
apache-tomcat-9.0.16 etc include jdk1.8.0_291 lib64 sbin src
bin games jdk lib libexec share
[root@localhost local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@localhost local]#ls
apache-tomcat-9.0.16 etc include jdk1.8.0_291 lib64 sbin src
bin games jdk lib libexec share tomcat
[root@localhost local]#cd tomcat/
[root@localhost tomcat]#ls
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp
[root@localhost tomcat]#useradd tomcat -s /sbin/nologin -M
#开启Tomcat
[root@localhost tomcat]#/usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
bash
[root@localhost tomcat]#ss -natp |grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=3614,fd=57))
TIME-WAIT 0 0 ::ffff:192.168.241.11:8080 ::ffff:192.168.241.1:54519
TIME-WAIT 0 0 ::ffff:192.168.241.11:8080 ::ffff:192.168.241.1:54513
TIME-WAIT 0 0 ::ffff:192.168.241.11:8080 ::ffff:192.168.241.1:54520
TIME-WAIT 0 0 ::ffff:192.168.241.11:8080 ::ffff:192.168.241.1:54518
TIME-WAIT 0 0 ::ffff:192.168.241.11:8080 ::ffff:192.168.241.1:54514
[root@localhost tomcat]#ss -natp |grep 8009
LISTEN 0 100 :::8009 :::* users:(("java",pid=3614,fd=62))
[root@localhost tomcat]#ss -natp |grep 8005
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=3614,fd=82))
bash
[root@localhost ROOT]#ls
asf-logo-wide.svg bg-upper.png tomcat.css tomcat.svg
bg-button.png favicon.ico tomcat.gif WEB-INF
bg-middle.png index.jsp tomcat.png
bg-nav.png RELEASE-NOTES.txt tomcat-power.gif
[root@localhost ROOT]#vim index.html
[root@localhost ROOT]#cat index.html
cxk
index.html要比index.jsp的优先级高
bash
#关闭Tomcat
[root@localhost ROOT]#/usr/local/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
做软连接的时候不建议使用shutdown.sh,因为对于Linux系统shutdown是关机,在日常工作不太建议
bash
[root@localhost ROOT]#vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@localhost ROOT]#systemctl daemon-reload
[root@localhost ROOT]#chown tomcat:tomcat /usr/local/tomcat/ -R
[root@localhost ROOT]#systemctl start tomcat
[root@localhost ROOT]#systemctl status tomcat.service
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2024-02-29 15:26:11 CST; 7s ago
Process: 4624 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 4641 (catalina.sh)
CGroup: /system.slice/tomcat.service
├─4641 /bin/sh /usr/local/tomcat/bin/catalina.sh start
└─4642 /usr/bin/java -Djava.util.logging.config.file=/usr/local/...
2月 29 15:26:11 localhost.localdomain systemd[1]: Starting Tomcat...
2月 29 15:26:11 localhost.localdomain systemd[1]: Started Tomcat.
[root@localhost ROOT]#ss -natp |grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=4642,fd=54))
pstree -p|grep tomcat
作为Linux系统看不到Tomcat进程,因为Tomcat是运行在JVM虚拟机上的,Linux系统只知道有一个JVM虚拟机
4.2.1知识拓展------Tomcat和Catalina的关系
Tomcat的servlet容器在4.X版本中被Craig McClanahan(Apache Struts项目的创始人,也是Tomcat
的 Catalina 的架构师)重新设计为Catalina.即Catalina就是servlet容器。
Tomcat的核心分为3个部分:
- Web容器:处理静态页面;
- JSP容器:把jsp页面翻译成一般的 servlet
- catalina: 是一个servlet容器,用于处理servlet
Catalina是美国西海岸靠近洛杉矶22英里的一个小岛,因为其风景秀丽而著名,曾被评为全美最漂亮的小岛。Servlet运行模块的最早开发者Craig McClanahan因为喜欢Catalina岛,故以Catalina命名他所开这个模块,另外在开发的早期阶段,Tomcat是被搭建在一个叫Avalon的服务器框架上,而Avalon则是Catalina岛上的一个小镇的名字,于是想一个与小镇名字相关联的单词也是自然而然。设计者估计是想把tomcat设计成最美的轻量级容器吧。下图为该小岛。
4.3配置文件介绍及核心组件
4.3.1配置文件
目录 | 功能 |
---|---|
bin | 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 |
conf | 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件 |
lib | 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包 |
logs | 存放 Tomcat 日志 catalina.out |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 存放项目资源的目录 |
work | Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
文件名 | 说明 |
---|---|
server.xml | 主配置文件 全局生效 |
web.xml | 每个webapp只有"部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件 |
tomcat-user.xml | 用户认证的账号和密码文件 |
catalina.policy | 当使用security选项启动omcat时,用于为tomcat设置安全策略 |
catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
注意:配置文件对大小写敏感 |
bash
[root@localhost tomcat]#ls
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp
[root@localhost tomcat]#cd webapps/
[root@localhost webapps]#cd ROOT/
[root@localhost ROOT]#ls
asf-logo-wide.svg bg-upper.png tomcat.css tomcat.svg
bg-button.png favicon.ico tomcat.gif WEB-INF
bg-middle.png index.jsp tomcat.png
bg-nav.png RELEASE-NOTES.txt tomcat-power.gif
[root@localhost ROOT]#vim test.jsp
Welcome Tomcat
预热Java是指在应用程序启动期间,通过一系列的操作来提前加载类、初始化对象和执行代码,以减少实际运行中的延迟和性能问题。
4.3.2日志文件
参考文档: https://cwiki.apache.org/confluence/display/TOMCAT/Logging
日志格式: https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html#Access_Logging
bash
%a - Remote IP address
%A - Local IP address
%b - Bytes sent, excluding HTTP headers, or '-' if zero
%B - Bytes sent, excluding HTTP headers
%h - Remote host name (or IP address if enableLookups for the connector is
false)
%H - Request protocol
%l - Remote logical username from identd (always returns '-')
%m - Request method (GET, POST, etc.)
%p - Local port on which this request was received. See also %{xxx}p below.
%q - Query string (prepended with a '?' if it exists)
%r - First line of the request (method and request URI)
%s - HTTP status code of the response
%S - User session ID
%t - Date and time, in Common Log Format
%u - Remote user that was authenticated (if any), else '-'
%U - Requested URL path
%v - Local server name
%D - Time taken to process the request in millis. Note: In httpd %D is
microseconds. Behaviour will be aligned to httpd in Tomcat 10 onwards.
%T - Time taken to process the request, in seconds. Note: This value has
millisecond resolution whereas in httpd it has second resolution. Behaviour will
be align to httpd in Tomcat 10 onwards.
%F - Time taken to commit the response, in millis
%I - Current request thread name (can compare later with stacktraces)
%X - Connection status when response is completed:
X = Connection aborted before the response completed.
+ = Connection may be kept alive after the response is sent.
- = Connection will be closed after the response is sent.
There is also support to write information incoming or outgoing headers, cookies,
session or request attributes and special timestamp formats. It is modeled after
the Apache HTTP Server log configuration syntax. Each of them can be used
multiple times with different xxx keys:
%{xxx}i write value of incoming header with name xxx
%{xxx}o write value of outgoing header with name xxx
%{xxx}c write value of cookie with name xxx
%{xxx}r write value of ServletRequest attribute with name xxx
%{xxx}s write value of HttpSession attribute with name xxx
%{xxx}p write local (server) port (xxx==local) or remote (client) port
(xxx=remote)
%{xxx}t write timestamp at the end of the request formatted using the enhanced
SimpleDateFormat pattern xxx
bash
[root@localhost ~]#ls /usr/local/tomcat/logs/ -1
catalina.2020-07-14.log #tomcat服务日志
catalina.out #tomcat服务日志
host-manager.2020-07-14.log #host manager管理日志
localhost.2020-07-14.log #默认主机日志
localhost_access_log.2020-07-14.txt ##默认主机访问日志
manager.2020-07-14.log #manager 管理日志
XML
#查看访问日志格式
[root@localhost ~]#tail /usr/local/tomcat/conf/server.xml
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" /> #说明: "在html
中表示双引号"符号
</Host>
</Engine>
</Service>
</Server>
bash
[root@localhost tomcat]#cd conf/
[root@localhost conf]#ls
Catalina jaspic-providers.xml tomcat-users.xml
catalina.policy jaspic-providers.xsd tomcat-users.xsd
catalina.properties logging.properties web.xml
context.xml server.xml
[root@localhost conf]#vim server.xml
4.3.3组件
顶级组件
Server,代表整个Tomcat容器,一台主机可以启动多tomcat 实例 ,需要确保端口不要产生冲突
服务类组件
Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine
连接器组件
Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议。
容器类
Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序。
内嵌类
可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。
集群类组件
listener、cluster
首先开启 tomcat进程, 会有 server 产生 ,然后产生 一个 service管理组来管理所有其他组件的用户发送请求httpd服务访问web的请求;connector 连接器(默认监听)接收到此请求, 会转交给 engine (引擎);engine (引擎) 会处理请求, 遍历 host (虚拟主机) 会交给 客户访问的host, 如果找不到交给默认的 host 会根据 上下文 context (上下文) 映射关系 去找相对应的文件;找到文件后, 交给 JSP 生成代码, 再交给 servlet 生成 html;最后原路返回反馈给用户。
名称 | 说明 |
---|---|
Server | 服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个 |
Service | 服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine |
Connector | 连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine |
Engine | 引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector |
Host | 虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
Context | 应用的上下文,配置特定url路径映射和目录的映射关系: url => directory |
4.3.3.1核心组件
-
Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
-
创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
- 每个Service中,是Engine和其连接器Connector的关联配置
-
可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
-
Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
-
Engine对请求头做了分析,将请求发送给相应的虚拟主机
-
如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
-
Engine上的缺省虚拟主机可以修改
-
-
Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
-
Context 定义应用程序单独的路径映射和配置
4.3.3.2引擎
一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等
XML
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true">
#uppackwars自动解包 autodeploy自动部署
<Context >
<Context />
</Host>
</Engine>
</Service>
</Server>
4.3.3.3Tomcat处理请求过程
- 假设来自客户的请求为: http://localhost:8080/test/index.jsp 浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1Connector获得此请求。
- Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
- Engine获得请求192.168.91.100:8080/test/index.jsp,遍历它所有虚拟主机Host
- Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
- Host匹配到路径为/test的Context
- path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
- Context匹配到URLPATTERN为*.jsp的Sservlet,对应于]spServlet类构造HtpServletRequest对象和HttpServletResponse对象,作为参数调用)spSer let的doGet或doPost方法。
- Context把执行完了之后的HttpServletResponse对象返回给Host
- Host把HttpServletResponse对象返回给Engine
- Engine把HttpServletResponse对象返回给Connector
- Connector把HttpServletResponse对象返回给浏览器端
/var/www/html/test/index.html ------>实际访问的是www.baidu.com/test/index.html
/var/www/html/index.html -------> 实际访问的是www.baidu.com/index.html
/usr/local/tomcat/webapps/ROOT/index.html -------> 实际访问的是192.168.241.11/index.html
/usr/local/tomcat/webapps/test/index.html -------> 实际访问的是192.168.241.11/test/index.html
通常意义上的 Web 服务器接受请求后,只是单纯地响应静态资源,如 HTML 文件,图片 文件等,不能在后端进行一定的处理操作。 Tomcat 是 Apache 下的一个子项目,它具备 Web 服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范 的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式反回客户端。
Tomcat 由一系列的组件构成,其中核心的组件有三个:
- Web 容器:完成 Web 服务器的功能。(https请求)
- Servlet 容器:名字为 catalina,用于处理 Servlet 代码。(具体的任务)
- JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。
|---------------------------|------------------------------------------------------------------------------------|
| Web容器 | 负责底层的HTTP协议 |
| Sevlet容器 | 由catalina脚本帮忙处理的servlet代码,主要处理后端逻辑业务 catalina实际处理的是Servlet代码,而Servlet代码是由Java编写的 |
| JSP(JAVA Scripts page) 容器 | JSP:在正常的html标签中嵌入一些java代码 这些JSP最终会被翻译成Servlet代码被执行 主要提供提供前端页面展示<% %> |
tomcat就是一个容器,在这个容器中有三大核心组件: WEB、Servlet 和JSP,所以Tomcat是极其轻量级别的,核心组件都是支持基本运行的组件
4.3.3.4主页文件优先级
- index.html
- index.htm
- index.jsp
bash
[root@localhost webapps]#ls
docs examples host-manager manager ROOT
[root@localhost webapps]#mkdir test
[root@localhost webapps]#cd test/
[root@localhost test]#ls
[root@localhost test]#vim index.html
[root@localhost test]#ls
index.html
[root@localhost test]#cat index.html
test
[root@localhost test]#cd ..
[root@localhost webapps]#cd ROOT/
[root@localhost ROOT]#ls
asf-logo-wide.svg bg-upper.png test.jsp tomcat-power.gif
bg-button.png favicon.ico tomcat.css tomcat.svg
bg-middle.png index.jsp tomcat.gif WEB-INF
bg-nav.png RELEASE-NOTES.txt tomcat.png
[root@localhost ROOT]#vim index.html
[root@localhost ROOT]#cat index.html
ROOT
ROOT和test同级
如果想局部生效(ROOT中的优先级调整)可以将全局生效的主页文件(/usr/local/tomcat/conf/web.xml)优先级拷贝到项目目录中的局部配置(/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml)中
bash
[root@localhost webapps]#ls
docs examples host-manager manager ROOT test
[root@localhost webapps]#cp -r ROOT/WEB-INF/ test/
[root@localhost webapps]#cd test/
[root@localhost test]#ls
index.html WEB-INF
[root@localhost test]#vim /usr/local/tomcat/conf/web.xml
[root@localhost test]#vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml
[root@localhost test]#systemctl restart tomcat.service
[root@localhost test]#echo jsp > index.jsp
[root@localhost test]#cat index.jsp
jsp
[root@localhost test]#ls
index.html index.jsp WEB-INF
[root@localhost test]#ll
总用量 8
-rw-r--r-- 1 root root 5 2月 29 17:16 index.html
-rw-r--r-- 1 root root 4 2月 29 17:26 index.jsp
drwxr-x--- 2 root root 21 2月 29 17:26 WEB-INF
[root@localhost test]#chown tomcat:tomcat WEB-INF/ -R
[root@localhost test]#ll
总用量 8
-rw-r--r-- 1 root root 5 2月 29 17:16 index.html
-rw-r--r-- 1 root root 4 2月 29 17:26 index.jsp
drwxr-x--- 2 tomcat tomcat 21 2月 29 17:26 WEB-INF
4.4打包Jar包实际操作
- .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等
- .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明
- .rar:资源适配器类打包文件,目前已不常用
- .ear:企业级WebApp打包,目前已不常用
传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动
XML
#conf/server.xml中文件配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
bash
[root@localhost webapps]#ls
docs examples host-manager manager ROOT test
[root@localhost webapps]#cd ROOT/
[root@localhost ROOT]#ls
asf-logo-wide.svg bg-upper.png RELEASE-NOTES.txt tomcat.png
bg-button.png favicon.ico test.jsp tomcat-power.gif
bg-middle.png index.html tomcat.css tomcat.svg
bg-nav.png index.jsp tomcat.gif WEB-INF
[root@localhost ROOT]#cp test.jsp /opt/
cp:是否覆盖"/opt/test.jsp"? y
[root@localhost ROOT]#cd /opt/
[root@localhost opt]#ls
apache-tomcat-9.0.16 jdk-8u291-linux-x64.tar.gz test.jsp
apache-tomcat-9.0.16.tar.gz test.html
[root@localhost opt]#vim test.html
[root@localhost opt]#cat test.html
test
[root@localhost opt]#ls
apache-tomcat-9.0.16 jdk-8u291-linux-x64.tar.gz test.jsp
apache-tomcat-9.0.16.tar.gz test.html
[root@localhost opt]#/usr/local/jdk/bin/jar cvf /opt/app1.war *
[root@localhost opt]#ls
apache-tomcat-9.0.16 app1.war test.html
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz test.jsp
[root@localhost opt]#cp app1.war /usr/local/tomcat/webapps/
[root@localhost opt]#ls /usr/local/tomcat/webapps/
app1 app1.war docs examples host-manager manager ROOT test
[root@localhost opt]#cd /usr/local/tomcat/webapps/app1/
[root@localhost app1]#ls
apache-tomcat-9.0.16 jdk-8u291-linux-x64.tar.gz test.html
apache-tomcat-9.0.16.tar.gz META-INF test.jsp
[root@localhost app1]#cat test.html
test
使用jar打包不用解压,不用建文件夹,就可以看到war的压缩包直接被解压好了
4.5实现Java项目
- .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp、html、配置文件等
- .jar:EJB类文件的打包压缩类zip格式文件,包括很多的class文件,网景公司发明
- .rar:资源适配器类打包文件,目前已不常用
- .ear:企业级WebApp打包,目前已不常用
传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动
bash
#conf/server.xml配置文件中
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
4.5.1搭建博客
事先准备jpress-v3.2.1.war压缩包
bash
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
apache-tomcat-9.0.16 jdk-8u291-linux-x64.tar.gz
apache-tomcat-9.0.16.tar.gz jpress-v3.2.1.war
[root@localhost opt]#systemctl start tomcat
[root@localhost opt]#systemctl status tomcat
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2024-03-01 12:10:37 CST; 1s ago
Process: 4837 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 4854 (catalina.sh)
CGroup: /system.slice/tomcat.service
├─4854 /bin/sh /usr/local/tomcat/bin/catalina.sh start
└─4855 /usr/bin/java -Djava.util.logging.config.file=/usr/local/...
3月 01 12:10:37 localhost.localdomain systemd[1]: Starting Tomcat...
3月 01 12:10:37 localhost.localdomain startup.sh[4837]: Using CATALINA_BAS...
3月 01 12:10:37 localhost.localdomain startup.sh[4837]: Using CATALINA_HOM...
3月 01 12:10:37 localhost.localdomain startup.sh[4837]: Using CATALINA_TMP...
3月 01 12:10:37 localhost.localdomain startup.sh[4837]: Using JRE_HOME: ...
3月 01 12:10:37 localhost.localdomain startup.sh[4837]: Using CLASSPATH: ...
3月 01 12:10:37 localhost.localdomain systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost opt]#ls
apache-tomcat-9.0.16 jdk-8u291-linux-x64.tar.gz
apache-tomcat-9.0.16.tar.gz jpress-v3.2.1.war
[root@localhost opt]#cp jpress-v3.2.1.war /usr/local/tomcat/webapps/
[root@localhost opt]#cd /usr/local/tomcat/webapps/
[root@localhost webapps]#ls
app1 docs host-manager jpress-v3.2.1.war ROOT
app1.war examples jpress-v3.2.1 manager test
[root@localhost webapps]#ln -s jpress-v3.2.1 jpress
[root@localhost webapps]#ls
app1 docs host-manager jpress-v3.2.1 manager test
app1.war examples jpress jpress-v3.2.1.war ROOT
[root@localhost webapps]#ll
总用量 231888
drwxr-x--- 4 tomcat tomcat 152 2月 29 17:44 app1
-rw-r--r-- 1 root root 166408416 2月 29 17:44 app1.war
drwxr-x--- 14 tomcat tomcat 4096 2月 29 15:14 docs
drwxr-x--- 6 tomcat tomcat 83 2月 29 15:14 examples
drwxr-x--- 5 tomcat tomcat 87 2月 29 15:14 host-manager
lrwxrwxrwx 1 root root 13 3月 1 12:11 jpress -> jpress-v3.2.1
drwxr-x--- 6 tomcat tomcat 86 3月 1 12:11 jpress-v3.2.1
-rw-r--r-- 1 root root 71034734 3月 1 12:11 jpress-v3.2.1.war
drwxr-x--- 5 tomcat tomcat 103 2月 29 15:14 manager
drwxr-x--- 3 tomcat tomcat 317 2月 29 17:17 ROOT
drwxr-xr-x 3 root root 56 2月 29 17:26 test
[root@localhost webapps]#cat >/etc/yum.repos.d/mysql.repo <<EOF
> [mysql57-community]
> name=Mysql 5.7 Community Server
> baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
> enabled=1
> gpgcheck=0
> EOF
[root@localhost webapps]#yum install mysql-community-server -y
#yum安装数据库
[root@localhost webapps]#systemctl start mysqld
[root@localhost webapps]#systemctl Status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since 五 2024-03-01 12:20:27 CST; 7s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 5884 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
Process: 5818 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 5887 (mysqld)
CGroup: /system.slice/mysqld.service
└─5887 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/m...
3月 01 12:20:10 localhost.localdomain systemd[1]: Starting MySQL Server...
3月 01 12:20:27 localhost.localdomain systemd[1]: Started MySQL Server.
[root@localhost webapps]#ss -natp|grep 3306
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=5887,fd=21))
[root@localhost webapps]#grep password /var/log/mysqld.log
2024-03-01T04:20:24.887571Z 1 [Note] A temporary password is generated for root@localhost: k3wy3,jNNPqM
#该命令是过滤出mysql设置的随机密码 随机密码也就是k3wy3,jNNPqM;可以通过复制黏贴回车进入数据库
[root@localhost webapps]#mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql>
#成功登入数据库
4.5.1.1设置mysql的新密码
可以使用alter修改密码的命令
bash
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)
mysql> alter user root@'localhost' identified by 'abc123';
Query OK, 0 rows affected (0.02 sec)
下次登入数据库直接指定密码为abc123即可
我们的Tomcat程序作为服务器可以看到用户端上传到服务器的图片的位置
bash
[root@localhost jpress]#ls
attachment META-INF robots.txt static templates upload WEB-INF
[root@localhost jpress]#find -name *.JPG
./attachment/20240301/29d3e6508b0b45d69c8be80d14ca6d8d.JPG
[root@localhost jpress]#cd attachment/20240301/
[root@localhost 20240301]#ls
29d3e6508b0b45d69c8be80d14ca6d8d.JPG
[root@localhost 20240301]#cd -
/usr/local/tomcat/webapps/jpress
[root@localhost jpress]#tree attachment/
attachment/
└── 20240301
└── 29d3e6508b0b45d69c8be80d14ca6d8d.JPG
1 directory, 1 file
4.5.1.2如何对mysql数据库破解密码
bash
[root@localhost jpress]#vim /etc/my.cnf
bash
[root@localhost jpress]#systemctl restart mysqld
[root@localhost jpress]#mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
这样就可以登入数据库了
show databases可以查看系统数据库有什么内容;存放了用户信息(用户名和用户密码)
4.6Tomcat状态页
4.6.1通过本机登录状态页
状态页比较重要,对权限有要求,不能通过远端进入。
我们可以根据状态页的提示信息进入配置文件进行修改
bash
[root@localhost manager]#cd /usr/local/tomcat/conf/
[root@localhost conf]#ls
Catalina jaspic-providers.xml tomcat-users.xml
catalina.policy jaspic-providers.xsd tomcat-users.xsd
catalina.properties logging.properties web.xml
context.xml server.xml
[root@localhost conf]#vim tomcat-users.xml
修改完之后只允许通过安装Tomcat的服务器本地进行登录
bash
[root@localhost conf]#systemctl restart tomcat
4.6.2远程登录状态页
bash
[root@localhost META-INF]#vim context.xml
bash
[root@localhost META-INF]#systemctl restart tomcat
4.6.3Tomcat项目管理页面
可以通过命令来控制项目的操作
4.6.4虚拟主机
解决办法与状态页一样
bash
[root@localhost META-INF]#vim /usr/local/tomcat/conf/tomcat-users.xml
bash
[root@localhost META-INF]#cd ..
[root@localhost manager]#cd ..
[root@localhost webapps]#ls
docs host-manager jpress-v3.2.1 manager
examples jpress jpress-v3.2.1.war ROOT
[root@localhost webapps]#cd host-manager/
[root@localhost host-manager]#ls
images index.jsp manager.xml META-INF WEB-INF
[root@localhost host-manager]#cd META-INF/
[root@localhost META-INF]#ls
context.xml
[root@localhost META-INF]#vim context.xml
bash
[root@localhost META-INF]#systemctl restart tomcat
4.7常见配置详解------端口安全
bash
[root@localhost META-INF]#vim /usr/local/tomcat/conf/server.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。
bash
[root@localhost META-INF]#yum install telnet -y
[root@localhost META-INF]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
#执行优雅地关闭Tomcat程序
Connection closed by foreign host.
[root@localhost META-INF]#systemctl status tomcat
#如果此时软件被占用 或者其他用户正在访问 不会立即停止
[root@localhost META-INF]#ss -natp |grep 8005
[root@localhost META-INF]#ss -natp |grep 8009
[root@localhost META-INF]#ss -natp |grep 8080
此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成 0,会使用随机端口如:36913
port设为-1等无效端口,将关闭此功能此行不能被注释,否则无法启动tomcat服务
XML
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">
Tomcat端口号 | 说明 |
---|---|
8080 | 默认接收Web请求的端口 |
8005 | 安全端口 |
8009 | Apache和Tomcat联动的AJP协议 |
AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。Web服务器通过 TCP连接 和 Servlet容器连接。Apache旗下所有的东西都支持AJP协议,是Apache的特有协议
4.8虚拟主机
可能有时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。例如现 在新增两个域名www.cxk.com www.wyb.com希望通过这两个域名访问到不同的项目内容。
bash
[root@localhost META-INF]#mkdir /opt/web{1,2,3}/ROOT -p
[root@localhost META-INF]#tree /opt/
/opt/
├── apache-tomcat-9.0.16.tar.gz
├── jdk-8u291-linux-x64.tar.gz
├── jpress-v3.2.1.war
├── web1
│ └── ROOT
├── web2
│ └── ROOT
└── web3
└── ROOT
6 directories, 3 files
[root@localhost META-INF]#echo web1 www.cxk.com > /opt/web1/ROOT/index.html
[root@localhost META-INF]#echo web2 www.wyb.com > /opt/web2/ROOT/index.html
[root@localhost META-INF]#echo web3 www.xzq.com > /opt/web3/ROOT/index.html
[root@localhost META-INF]#cat /opt/web1/ROOT/index.html
web1 www.cxk.com
[root@localhost META-INF]#cat /opt/web2/ROOT/index.html
web2 www.wyb.com
[root@localhost META-INF]#cat /opt/web3/ROOT/index.html
web3 www.xzq.com
bash
[root@localhost META-INF]#vim /usr/local/tomcat/conf/server.xml
bash
[root@localhost META-INF]#systemctl restart tomcat
bash
[root@node2 ~]#vim /etc/hosts
192.168.241.11 www.cxk.com www.wyb.com www.xzq.com
[root@node2 ~]#curl www.cxk.com:8080
web1 www.cxk.com
[root@node2 ~]#curl www.wyb.com:8080
web2 www.wyb.com
[root@node2 ~]#curl www.xzq.com:8080
web3 www.xzq.com
4.9 Context
Context作用:
- 路径映射:将url映射至指定路径,而非使用appBase下的物理目录,实现虚拟目录功能
- 应用独立配置,例如单独配置应用日志、单独配置应用访问控制
XML
#映射指定路径
<Context path="/test" docBase="/data/test" reloadable="true" />
#映射站点的根目录
<Context path="/" docBase="/data/website" reloadable="true" />
#还可以添加日志等独立的配置
<Context path="/test" docBase="/data/test" reloadable="true" >
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_test_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
- path:指的是访问的URL路径,如果path与appBase下面的子目录同名,context的docBase路径优先更高
- docBase:可以是磁盘文件的绝对路径,也可以是相对路径(相对于Host的appBase)
- reloadable:true表示如果WEB-INF/classes或META-INF/lib目录下.class文件有改动,就会将WEB应用重新加载。生产环境中,建议使用false来禁用。
bash
[root@localhost META-INF]#vim /usr/local/tomcat/conf/server.xml
bash
[root@localhost META-INF]#cd /opt
[root@localhost opt]#mkdir test
[root@localhost opt]#cd test/
[root@localhost test]#echo test > index.html
[root@localhost test]#systemctl restart tomcat
[root@localhost test]#systemctl status tomcat
bash
[root@node2 ~]#curl www.cxk.com:8080/test/
test
4.10反向代理
客户端curl www.cxk.com 访问nginx服务,nginx服务通过配置proxy_pass www.cxk.com:8080,最终客户端看到的是www.cxk.com
bash
[root@node2 ~]#systemctl start nginx
[root@node2 ~]#systemctl status nginx
[root@node2 ~]#vim /usr/local/nginx/conf/nginx.conf
[root@node2 ~]#nginx -s reload
bash
[root@node3 ~]#systemctl start nginx
[root@node3 ~]#systemctl status nginx
[root@node3 ~]#vim /etc/hosts
192.168.241.22 www.cxk.com www.wyb.com www.xzq.com
[root@node3 ~]#curl www.wyb.com/
web1 www.cxk.com
[root@node3 ~]#curl www.cxk.com/
web1 www.cxk.com
[root@node3 ~]#curl www.xzq.com/
web1 www.cxk.com
如果修改为固定IP地址跳转
bash
[root@node2 ~]#vim /usr/local/nginx/conf/nginx.conf
[root@node2 ~]#nginx -s reload
访问的页面是192.168.241.11的Tomcat的页面
二、Tomcat应用程序调优
关于 Tomcat 主配置文件 server.xml 里面很多默认的配置项,但并不能满足业务需求, 常用的优化相关参数如下
- 【maxThreads】Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最 大的线程数,默认值是 200。
- 【minSpareThreads】最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有 人使用也开这么多空线程等待,默认值是 10
- 【maxSpareThreads】最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不 再需要的 socket 线程。默认值是-1(无限制)。一般不需要指定
- 【URIEncoding】指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 Web 服务器软件配置方便,需要分别指定utf-8
- 【connnectionTimeout】网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置 有隐患的。通常默认 20000 毫秒(20秒)就可以
- 【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 的参数属性值,可以参考官方文档的详细说明进行学习。链 接 地 址 Apache Tomcat 9 Configuration Reference (9.0.86) - The HTTP Connector , 下 面 开 始 对 Tomcat 配置文件优化进行前后的对比
XML
<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"/>