Tomcat 部署和优化 (一)---------安装Oracle jdk 、tomcat

自 2017 年 11 月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据压测结果如何优化 Tomcat 服务及常见的内存溢出如何处理。

Tomcat服务器是一个免费的开放源代码的Web应用服务器 ,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选 。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

一、Tomcat简介

  • Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器

  • Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选

  • 一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。

  https://tomcat.apache.org/    官网

1.1web技术

1.1.1http协议和 B/S (Browser/Server)结构

最早出现了CGl (Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为WEB后端编程。有一部分程序员还是要编写HTML、CSS、JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程。

1.1.2前端三大核心技术

①HTML
② css
③ javascript

Javascript简称S,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,得到了几乎主流浏览器支持

二、java 基础

2.1后台应用架构

web应用服务器:开源的tomcat. jetty. glassfish。 商用的有weblogic、websphere. Jboss

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

​
[root@zzzcentos1 data]#yum install java -y
[root@zzzcentos1 data]#yum install epel-release.noarch -y
[root@zzzcentos1 data]#yum provides */javac      #找那个安装包中有javac
[root@zzzcentos1 data]#yum install java-1.8.0-openjdk-devel -y
[root@zzzcentos1 data]#ls
[root@zzzcentos1 data]#rz -E
rz waiting to receive.
[root@zzzcentos1 data]#ls
Hello.java
[root@zzzcentos1 data]#javac Hello.java 
[root@zzzcentos1 data]#ls
Hello.class  Hello.java
[root@zzzcentos1 data]#javac Hello
错误: 仅当显式请求注释处理时才接受类名称 'Hello'
1 个错误
[root@zzzcentos1 data]#java Hello
hello, world
[root@zzzcentos1 data]#

​

先安装,安装好之后拖入文件

2.3 java实现动态网页功能

servelt

本质是一段java程序:原理就是在java程序中嵌入 html语言

在Servlet中最大的问题是,HTML输出和java代码混在一起,如果网页布局要调整,Java源代码就需要随之进行调整

jsp

JSP本质是提供一个HTML模板 ,也就是在网页中预留以后填充的空,后续将Java程序运行生成的数据,对HTML进行填空就可以了。如果网页布局需要调整,JAVA源代码不需要很大的调整

不过最终JSP还需要先转换为Servlet的源代码,java文件(Tomcat中使用asper转换),只不过这个转换过程无需人工完成是通过工具自动实现的然后再编译成.class文件,最后才可以在JVM中运行

优点:架构简单,比较适合小型项目开发

缺点:JSP职责不单一,职责过重,不便于维护

2.4 JDK

2.4.1和 JRE 关系

jdk包括 java工具包、jre、jvm

java(工具包): jar打包工具 javac

jre( 库文件 ):提供一些第三方功能

jvm:( 虚拟机)

  • Java SE APl: Java 基础类库开发接口

  • JRE: Java Runtime Environment缩写,指Java运行时环境,包含JVM +Java核心类库

  • JDK: Java Development Kit,即Java语言的软件开发工具包JDK协议基于JRL(JavaResearch License)协议

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 生态调查报告

2.4.2Oracle JDK版本

开源不一定免费哦

JDK也就是常说的J2SE,在1999年,正式发布了Java第二代平台,发布了三个版本:

  • J2SE:标准版,适用于桌面平台

  • J2EE:企业版,java在企业级开发所有规范的总和,共有13个大的规范,Servlet、Jsp都包含在JavaEE规范中

  • J2ME:微型版,适用于移动、无线、机顶盒等设备环境

2005年,Java的版本又更名为JavaSE、JavaEE、JavaME

从2019年1月份开始,Oracle JDK 开始对 Java SE 8 之后的版本开始进行商用收费,确切的说是8u201/202 之后的版本。如果你用 Java 开发的功能如果是用作商业用途的,如果还不想花钱购买的话,能免费使用的最新版本是 8u201/202。当然如果是个人客户端或者个人开发者可以免费试用 Oracle JDK 所有的版本。

OpenJDK 介绍

OpenJDK是Sun公司采用GPL v2协议发布的JDK开源版本,于2009年正式发布。

官方网站:OpenJDK: JDK 6

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性能,更加稳定

安装 openjdk
[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)

2.4.3安装oracle官方 JDK

官方下载链接:

#注意需要注册登录后,才能下载JDK
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
Oracle JDK 的 rpm安装

#需要登录下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

[root@zzzcentos1 ~]#cd /data
[root@zzzcentos1 data]#ls
[root@zzzcentos1 data]#rz -E
rz waiting to receive.
[root@zzzcentos1 data]#ls
jdk-8u291-linux-x64.rpm
[root@zzzcentos1 data]#yum install jdk-8u291-linux-x64.rpm -y
[root@zzzcentos1 data]#rpm -q jdk1.8.x86_64
jdk1.8-1.8.0_291-fcs.x86_64
[root@zzzcentos1 data]#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@zzzcentos1 data]#cd /usr/java/
[root@zzzcentos1 java]#cd jdk1.8.0_291-amd64/
[root@zzzcentos1 jdk1.8.0_291-amd64]#cd bin/
[root@zzzcentos1 bin]#vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
[root@zzzcentos1 bin]#. /etc/profile.d/jdk.sh
[root@zzzcentos1 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)

补充

[root@centos7 ~]#vim /etc/profile/jdk.sh
[root@centos7 ~]#cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH                    
#以下两项非必须项
export JRE_HOME=$JAVA_HOME/jre   
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/     #也可以把这四项都加入

安装方式有三种方式rpm安装、 yum安装、编译安装。

二进制安装是编译安装的一小部分,包都准备好了,只有make install没有进行

Oracle JDK的二进制文件安装

二进制安装属于编译安装的一种,只是没有执行make install

① 准备二进制包解压 ② 创建软链接,设置环境变量

③ 查看当前系统中Java的版本信息

[root@zzzcentos1 ~]#systemctl stop firewalld
[root@zzzcentos1 ~]#setenforce 0
[root@zzzcentos1 ~]#mkdir /data
mkdir: 无法创建目录"/data": 文件已存在
[root@zzzcentos1 ~]#cd /data/
[root@zzzcentos1 data]#ls
[root@zzzcentos1 data]#rz -E
rz waiting to receive.
[root@zzzcentos1 data]#ls
jdk-8u291-linux-x64.tar.gz
[root@zzzcentos1 data]#tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
[root@zzzcentos1 data]#cd /usr/local/
  oot@zzzcentos1 local]#ls
?in  etc  games  include  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@zzzcentos1 local]#ln -s jdk1.8.0_291/ jdk
[root@zzzcentos1 local]#ls
bin  etc  games  include  jdk  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@zzzcentos1 local]#vim /etc/profile.d/jdk.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@zzzcentos1 local]#cat /etc/profile.d/jdk.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@zzzcentos1 local]#

[root@zzzcentos1 local]#cat /etc/profile.d/jdk.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@zzzcentos1 local]#java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[root@zzzcentos1 local]#. /etc/profile.d/jdk.sh
[root@zzzcentos1 local]#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)
[root@zzzcentos1 local]#which java
/usr/local/jdk/bin/java

tomcat 是用java程序写的,不装它Oracle JDK ,tomcat无法运行

Oracle JDK它比较稳定,所以装它

如果让你布局java环境,就是安装它

export JAVA_HOME=/usr/java/default
#设置了JAVA_HOME环境变量,它指向Java开发工具包(JDK)的安装目录。
 
export PATH=$JAVA_HOME/bin:$PATH
#修改了系统PATH环境变量,在原有PATH值前添加了 $JAVA_HOME/bin。这样一来,在执行java等命令时
#系统会在指定的Java bin目录下查找并优先执行相应的命令。也就是先执行$JAVA_HOME里的Java命令
#找到相应的命令后,立即停止查找
 
export JRE_HOME=$JAVA_HOME/jre
#非必须项,但常见做法。设置了JRE_HOME环境变量,指向Java运行时环境(JRE)的安装目录
#通常位于JDK安装目录下的jre子目录。
 
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
#非必须项。设置了CLASSPATH环境变量,用于Java应用程序加载类文件时搜索的路径列表。
#在早期Java版本中,需要通过CLASSPATH来指定自定义类库的位置。

**补充:**如下是报错,可能会影响tomcat安装

#注意:JAVA_HOME变量必须设置,否则tomcat启动时会出报下面错误
[root@centos7 ~]#catalina.sh
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
[root@centos8 ~]#startup.sh 
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program 

三、Tomcat基础功能

3.1Tomcat介绍

官网: Apache Tomcat® - Welcome!

官网文档: Apache Tomcat 8 (8.5.99) - Documentation Index

帮助文档:

Apache Tomcat Home - Apache Tomcat - Apache Software Foundation

FAQ - Apache Tomcat - Apache Software Foundation

Tomcat的核心:

tomcat 和 catalina 关系

Tomcat 的 servlet 容器在4.X版本中被 Craig McClanahan(Apache Struts项目的创始人,也是Tomcat 的 Catalina 的架构师)重新设计为 Catalina.即 Catalina 就是 servlet 容器。
Tomcat 的核心分为3个部分:
(1)Web容器:处理静态页面;
(2)JSP容器:把 jsp 页面翻译成一般的 servlet
(3)catalina: 是一个 servlet 容器,用于处理 servlet

3.2配置文件介绍及核心组件

配置文件

安装目录下 文件介绍

conf 子目录

以.bat结尾的文件一般为windows环境下的相关文件

以.sh结尾的文件为Unix/Linux环境下的相关文件

其中最常用的三个文件为

catalina.sh:Unix/Linux平台下启动、停止和管理Tomcat服务器的主要脚本

startup.sh:启动Tomcat服务器的脚本。

shutdown.sh:关闭Tomcat服务器的脚本。

日志文件

参考文档: Logging - Apache Tomcat - Apache Software Foundation

日志格式: Apache Tomcat 9 Configuration Reference (9.0.86) - The Valve Component

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 管理日志

[root@zzzcentos1 logs]#tail /usr/local/tomcat/conf/server.xml

tomcat服务自动做好日志分割服务

%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

3.3组件

3.3.1组件分层和分类

顶级组件

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 请求过来

connector 连接器(默认监听)接收到此请求, 会转交给 engine (引擎)

engine (引擎) 会处理请求, 遍历 host (虚拟主机) 会交给 客户访问的host, 如果找不到交给默认的 host 会根据 上下文 context (上下文) 映射关系 去找相对应的文件

找到文件后, 交给 JSP 生成代码, 再交给 servlet 生成 html

原路返回 反馈给用户

3.3.2核心组件

  • Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个

  • 创建一个Service提供服务。可以创建多个Service,但一般也只创建一个

    • 每个Service中,是Engine和其连接器Connector的关联配置
  • 可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应

  • Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host

    • Engine对请求头做了分析,将请求发送给相应的虚拟主机

    • 如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机

    • Engine上的缺省虚拟主机可以修改

  • Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配

  • Context 定义应用程序单独的路径映射和配置

引擎:一般而言,引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等

范例:多个组件关系 conf/server.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">
           <Context >
                <Context />
 </Host>
    </Engine>
  </Service>
</Server>

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对象返回给浏览器端

    #接收请求

    '当客户端(通常是Web浏览器)向Tomcat服务器发送一个HTTP请求时,请求首先被监听在
    特定端口上的Connector组件接收。例如,对于默认配置,HTTP Connector通常监听8080端口'

    #解析请求
    'Connector接收到请求后,会根据HTTP协议规范对请求进行解析,提取出请求方法(GET、
    POST等)、请求URI、HTTP头信息以及可能存在的请求体内容'

    #路由请求到适当的Context:
    '解析后的请求将被传递给Engine容器,Engine通过匹配请求的Host头或IP地址找到对应的虚拟
    主机(Host)。
    Host接着根据请求URI找到关联的Web应用程序Context,也就是WAR文件解压后部署的应用目录。'

    #查找并执行Servlet
    'Context容器负责查找请求URI映射到的Servlet,并实例化或重用该Servlet。
    如果请求的URL与某个Servlet的URL映射规则相匹配,则调用Servlet的service()方法来处理请求'

    #处理请求
    '在Servlet内部,根据请求的方法和请求参数,调用相应的doGet()、doPost()等方法处理请求数
    据,并生成响应结果。'

    #创建响应
    'Servlet处理完成后,返回一个HttpServletResponse对象,其中包含了状态码、响应头和响应
    体内容(如HTML页面、JSON数据或其他格式的内容)。'

    #写回响应
    'Context将Servlet生成的响应传递给Host,再由Host传递给Engine,最终由Engine中的
    Connector将响应数据封装成HTTP响应报文并通过网络发送回客户端。'

    #清理资源:
    '在整个处理过程中,Tomcat还负责管理连接、线程池以及其他系统资源,确保请求处理完毕后释放
    相关资源以供后续请求使用'

    #生命周期事件通知:
    'Tomcat在应用启动、停止、上下文初始化、销毁等阶段还会触发相应的生命周期事件,以便开发者
    能够插入自定义的初始化逻辑或资源清理操作。'

1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;

2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;

3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。

4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。

3.4安装 Tomcat

基于包安装 Tomcat

3.4.1CentOS7 包安装
[root@zzzcentos1 ~]#yum list tomcat

CentOS 7 的yum源的tomcat版本老旧,而CentOS8 yum源里无tomcat

目前比较主流的Tomcat是8.5.X版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式

3.4.2 二进制安装 Tomcat

注意:安装tomcat 前必须先部署JDK

官方和镜像站点下载: 
https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/

安装成功了

[root@zzzcentos1 ~]#cd /data/
[root@zzzcentos1 data]#ls
jdk-8u291-linux-x64.tar.gz
[root@zzzcentos1 data]#rz -E
rz waiting to receive.
[root@zzzcentos1 data]#ls
apache-tomcat-9.0.16.tar.gz  jdk-8u291-linux-x64.tar.gz
[root@zzzcentos1 data]#tar xf apache-tomcat-9.0.16.tar.gz
[root@zzzcentos1 data]#ls
apache-tomcat-9.0.16  apache-tomcat-9.0.16.tar.gz  jdk-8u291-linux-x64.tar.gz
[root@zzzcentos1 data]#cp -r apache-tomcat-9.0.16 /usr/local/
[root@zzzcentos1 data]#ls
apache-tomcat-9.0.16  apache-tomcat-9.0.16.tar.gz  jdk-8u291-linux-x64.tar.gz
[root@zzzcentos1 data]#cd /usr/local/
[root@zzzcentos1 local]#ls
apache-tomcat-9.0.16  bin  etc  games  include  jdk  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@zzzcentos1 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@zzzcentos1 local]#cd /usr/local/tomcat/
[root@zzzcentos1 tomcat]#cd bin/
[root@zzzcentos1 bin]#ls
bootstrap.jar       commons-daemon.jar            digest.sh         shutdown.sh           tool-wrapper.sh
catalina.bat        commons-daemon-native.tar.gz  makebase.bat      startup.bat           version.bat
catalina.sh         configtest.bat                makebase.sh       startup.sh            version.sh
catalina-tasks.xml  configtest.sh                 setclasspath.bat  tomcat-juli.jar
ciphers.bat         daemon.sh                     setclasspath.sh   tomcat-native.tar.gz
ciphers.sh          digest.bat                    shutdown.bat      tool-wrapper.bat
[root@zzzcentos1 bin]#pwd
/usr/local/tomcat/bin
[root@zzzcentos1 bin]#/usr/local/tomcat/bin/startup.sh   #启动tomcat
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.

[root@zzzcentos1 ROOT]#/usr/local/tomcat/bin/shutdown.sh  #关闭tomcat服务
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
[root@zzzcentos1 ROOT]#

tomcat 有三个端口 8080(web端口)、 8005、8009

8005
'这个端口是Tomcat的shutdown端口。当需要关闭Tomcat时,可以通过向这个端口发送一个特
定的命令来安全地终止服务。例如,通过运行bin/shutdown.sh(在Unix/Linux系统)
或bin/shutdown.bat(在Windows系统),或者直接通过网络发送请求到该端口来关闭Tomcat。'
 
8009
'这个端口是用于AJP协议(Apache JServ Protocol)的连接器监听端口。AJP是一种高效、轻
量级的通信协议,主要用于将Web服务器(如Apache HTTP Server)与Java应用服务器(如Tomcat)
之间的负载均衡和代理功能进行整合。通过配置Apache HTTP Server使用mod_proxy_ajp模块并
将其反向代理指向8009端口,可以实现HTTP请求从Apache透明地转发给Tomcat处理,从而实现高性
能的Web部署架构。'
 
8080
这是最常见的端口,它是Tomcat用来接收外部HTTP请求的默认监听端口。任何通过标准HTTP协
议访问Tomcat上托管的Web应用程序的客户端(如浏览器)都会连接到这个端口。如果您希望更
改Tomcat提供HTTP服务的端口号,可以在conf/server.xml文件中找到相关的Connector配置,
并修改其port属性值。

补充1:

去浏览器访问,出现下面页面安装好了

补充2:

交给systemctl进行管理
[root@zzzcentos1 ROOT]#useradd -s /sbin/nologin tomcat -M
[root@zzzcentos1 ROOT]#
[root@zzzcentos1 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@zzzcentos1 ROOT]#cd ..
[root@zzzcentos1 webapps]#cd ..
[root@zzzcentos1 tomcat]#pwd
/usr/local/tomcat
[root@zzzcentos1 tomcat]#cd ..
[root@zzzcentos1 local]#chown tomcat:tomcat /usr/local/tomcat/ -R
[root@zzzcentos1 local]#systemctl daemon-reload
[root@zzzcentos1 local]#systemctl start tomcat
[root@zzzcentos1 local]#systemctl status tomcat

去浏览器访问:

tomcat的web服务监听的端口号是8080,所以访问时需要使用web浏览器访问本机的8080端口

安装成功了

小问题

tocmat已经开启,为什么过滤不到 tomcat ?

omcat 是运行在Java虚拟机里面,他只能检测到java程序

Tomcat 子配置文件是针对项目而言的

(一)缓存文件

work 目录一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存)

缓存文件,有访问记录时会生成,在升级tomcat服务时需要将缓文件删除,才能正常升级

故障案例:tomcat版本升级升不上去,什么导致的?原因:可能是因为之前缓存没有删

如果不清缓存,他就会一直访问缓存,也就是旧版本,导致升级升不上去!

由此看到jsp缓存目录多了两个文件,当java运行动态程序的时候,需要先转成class码再去执行java程序。如果执行过一次页面访问,会把所需的文件缓存在jsp这个文件夹中,从而加速二次访问。

当升级tomcat失败,如:a1版本升级到a2版本后,依然是a1,会是什么原因?

在a1版本是,每次运行会在缓存目录形成类似于a1.java和a1.class文件;如果没有清理缓存,当拿到a2升级包将其放入到webapps中,运行后依然访问原来的页面, 将原来的缓存文件删除即可**。当升级上线前,可以预热访问生成新的缓存文件,加入用户访问速度。最后定义覆盖原来的软链接。**

(二)tomcat访问目录

去看浏览器检测

以项目为站点, ROOT为默认项目的默认站点

默认的访问目录是在/usr/local/tomcat/webapps/ROOT目录

(三)主页文件的优先级

这是因为在conf/web.xml这个文件中定义了全局的文件访问顺序,在没有局部配置的情况下,都已这个文件定义的为主

主目录文件夹

在webapps/ROOT/WEB-INF/目录下也有一个web-xml文件,这个文件并没有定义访问顺序,所以默认以全局配置文件为主。想要在局部生效,可以通过设置该文件

①编辑配置文件

②去浏览器访问:没有生效

③需要修改权限:

3.5tomcat 端口号

8080: 默认接收 http 请求的端口

8005: 安全端口,可以关闭tomcat

8009: apache 和 tomcat 联动 AJP 协议

3.6常见配置详解

在conf/server.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。

3.7打包jar包实际操作

  • .war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等

  • .jar:EJB类文件的打包压缩类zip格式文件,,包括很多的class文件, 网景公司发明

  • .rar:资源适配器类打包文件,目前已不常用

  • .ear:企业级WebApp打包,目前已不常用

传统应用开发测试后,通常打包为war格式,这种文件部署到Tomcat的webapps目录下,并默认会自动

实验:模拟jar包

① 模拟文件打包成jar包

② 拷贝jar包至webapps文件夹

③下线只要删除war包

下线的话要删除 app1.war包,否则会再次生成

相关推荐
zquwei12 分钟前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
TT哇18 分钟前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
火烧屁屁啦41 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
ihengshuai1 小时前
HTTP协议及安全防范
网络协议·安全·http
w_31234541 小时前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安1 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA1 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_19284999061 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S2 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring