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包,否则会再次生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『京墨』1.7.0 发布,开源的诗文(名句)、歇后语、成语、绕口令、节日等的阅读 APP

1.7.0 更新日志 优化 UI 显示&#xff1b;优化数据同步&#xff0c;尤其是诗文同步&#xff1b;【诗文名句】【成语】【歇后语】模块添加收藏功能&#xff1b;添加“滑动翻页”功能。 介绍 『京墨』开源的古诗词文&#xff08;名句&#xff09;、歇后语、成语、绕口令、节日…

C++/WinRT教程(第三篇)API的使用

目录 前言 Windows API 在WinRT中的投影 C/WinRT的头文件&#xff08;投影标头&#xff09; 通过对象、接口或通过 ABI 访问成员 投影类型的初始化方法 不要错误地使用延迟初始化 不要错误地使用复制构造 使用 winrt::make 进行构造 标准构造方法 在WinRT组件中实现A…

【Word如何在表格和标题中间插入一行】

目的&#xff1a;主要是为了满足文件设计需求&#xff0c;标题前面要空出一行 操作步骤&#xff1a; 1、将鼠标光标停在标题行的最前方&#xff0c;点击回车&#xff0c;就会在表格和标题中间插入一行空白标题行。 2、因为空白标题行会影响目录的生成&#xff0c;所以将空白行…

基于springboot+vue的实验室管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

对象的组合(java)

组合与复用 Circle类创建圆对象 Circle类创建圆锥对象&#xff0c;Circle类将Circle类声明的对象作为自己的一个成员 圆锥通过调用方法将某个圆的引用传递给圆锥的Circle类型的成员变量 package Absent;public class Chapter3 {public static void main(String[] args) {// …

jupyter 用pyecharts进行数据分析

一、jupyter和pyecharts下载和打开 因为我是用的pycharm&#xff0c;所以我直接在pycharm项目终端中下载pip install jupyter,pip install pyecharts 在你下载的项目路径中输入jupyter notebook 之后会进入页面 Jupyter 具体使用参考这个链接&#xff1a;Jupyter Notebook基本…

基于tomcat的JavaWeb实现

Tomcat服务器 免费&#xff0c;性能一般的服务器 安装配置 基于Java&#xff0c;故需要配置环境变量&#xff0c;新加系统路径JAVA_HOME&#xff0c;路径为jdk的主目录。 而后打开bin目录下的startup.bat文件出现如下窗口说明配置成功 idea继承tomcat服务器 使用java开发…

HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络

HCIA-Datacom实验指导手册&#xff1a;7 构建简单 IPv6 网络 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 设备基础配置设备命名 步骤 2 配置设备及接口 IPv6 功能步骤 3 配置接口的 link-local 地址&#xff0c…

电脑数据丢失是什么原因 易我数据恢复软件下载 easyrecovery数据恢复软件下载 电脑数据删除了怎么恢复 电脑数据库损坏了怎么找回

目录 一、电脑数据丢失是什么原因 二、电脑数据丢失如何恢复 三、EasyRecovery恢复电脑数据的方法介绍 电脑是我们大家熟悉并且常用的数据存储设备&#xff0c;也是综合性非常强的数据处理设备。对于电脑设备来讲&#xff0c;最主要的数据存储介质是硬盘&#xff0c;电脑硬…

谷歌seo推广培训多少钱?

关于谷歌SEO推广培训的费用&#xff0c;这个问题的答案相当多样&#xff0c;因为涉及到的因素实在是太多了&#xff0c;不同的培训机构或者个人导师提供的课程内容、质量以及服务都会有所不同&#xff0c;这自然就会影响到价格&#xff0c;一些基础的课程&#xff0c;可能就是一…

最佳 M4V 转 MP4 转换器,可免费转换您的媒体文件

在市场上&#xff0c;我们拥有相同数量的 Apple 用户和 Windows 用户&#xff0c;因此每次我们遇到尝试将 Apple 产品的媒体文件共享到任何其他平台时&#xff0c;媒体文件无法打开的情况。这是因为Apple 媒体文件采用M4V 格式&#xff0c;其他媒体播放器不支持该格式。 为了解…

多租户 TransmittableThreadLocal 线程安全问题

在一个多租户项目中&#xff0c;用户登录时,会在自定义请求头拦截器AsyncHandlerInterceptor将该用户的userId,cstNo等用户信息设置到TransmittableThreadLocal中,在后续代码中使用.代码如下: HeaderInterceptor 请求头拦截器 public class HeaderInterceptor implements Asyn…

【Vue3】全局切换字体大小

VueUse 先安装VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

观察者模式 详解 设计模式

观察者模式 观察者模式是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;其相关依赖对象都会得到通知并自动更新&#xff0c;如同发布-订阅模式。常见的情况如&#xff1a;公众号更新内容&#xff0c;所有…

【考研数学】零基础备考全年计划

25考研数学基础差&#xff0c;一定要重视基础的复习&#xff01; 基础不牢&#xff0c;地动山摇&#xff0c;这句话在如今的考研更加贴切 24考研的新形势&#xff1a; 重基础、计算量大、反押题 每一个变化对于基础差的同学都不是好消息。 做过近几年考研真题的人都会发现…

怎么批量管理网站,批量管理网站的工具有哪些

在网站运营和管理过程中&#xff0c;随着网站规模的扩大&#xff0c;单独管理每个网页或内容项的工作量变得越来越大。针对这一挑战&#xff0c;批量管理工具成为了许多网站管理员的选择。本文将介绍网站批量管理的概念、常见工具以及如何有效地进行网站批量管理。 什么是网站批…

大宇、固特、希亦超声波清洗机实测,哪款清洗效果好?一篇掌握

对于那些追求生活品质的朋友来说&#xff0c;眼镜清洗这件事情是一点都不能马虎的&#xff01;超声波清洗机能够深入缝隙中帮我们把污渍给清洁干净&#xff0c;并且一些好的超声波清洗机还能够帮助我们更好的保护眼镜&#xff0c;我们自己手动清洗眼镜的话会非常容易把镜片给清…

K8s控制器

控制器: Deployment: Deployment概述: replicaset:自动创建pod的控制器 Delpoyment控制器: pod的名字需要唯一,在这不写名字,利用标签进行创建 replicas:表示你想要克隆的数量,selector:通过标签.识别哪个pod是我创建出来的.这里的标签和后面元数据里的标签要一致. Cluster…

【嵌入式——QT】QListWidget

QListWidget类提供了一个基于项的列表小部件&#xff0c;QListWidgetItem是列表中的项&#xff0c;该篇文章中涉及到的功能有添加列表项&#xff0c;插入列表项&#xff0c;删除列表项&#xff0c;清空列表&#xff0c;向上移动列表项&#xff0c;向下移动列表项。 常用API a…

操作系统x面试|进程与线程

1. 线程进程的区别 进程可以称为是资源分配的最小单元&#xff0c;而线程可以称为是处理器分配的最小单元。 资源包括内存空间。同时进程是一段代码的执行过程&#xff0c;这段代码需要多少的内存在代码确定时已经确定下来了。 处理器就是执行单元&#xff0c;一个进程可以拆解…