前言
Tomcat作为一款网站服务器,目前市面上Java程序使用的比较多,作为运维工人,有必要了解一款如何去运行Java环境的网站服务。
目录
一、Java相关介绍
1. Java历史
2. Java跨平台服务
3. Java实现动态网页功能
3.1 servelt
3.2 jsp
4. JDK
4.1 JDK和JRE关系
4.2 虚拟机各种版本
4.2.1 Oracle JDK
4.2.2 OpenJDK
5. Web架构
5.1 web资源和访问
5.2 后台应用架构
二、Tomcat部署
1. 历史介绍
2. 官网地址
3. 架构
4. 部署
4.1 部署Java环境
4.2 安装Tomcat
4.2.1 基于包安装tomcat
4.2.2 二进制安装tomcat
4.3 启动Tomcat
4.4 指定用户管理Tomcat
5. 配置文件介绍及核心组件
5.1 配置文件
5.1.1 日志文件
5.2 组件
5.2.1 组件分层和分类
5.2.2 核心组件
5.2.3 tomcat 处理请求过程
5.3 项目站点访问
5.4 主页文件的优先级
6. 打包jar包实际操作
一、Java相关介绍
1. Java历史
Java语言最早是在1991年开始设计的,最初叫Oak项目,它初衷是跑在不同机顶盒设备中的。Sun公司第一个Java公开版本1.0发布于1996年。口号是"一次编写,到处运行"(Write once,Run anywhere),跨平台运行。后来被Oracle甲骨文公司收购,他有一款程序叫做java虚拟机,类似我们平时使用的VMware等虚拟机。但是也存在部分区别:
VisualBox、VMware就属于系统虚拟机,用来模拟系统。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
Java虚拟机是典型的程序虚拟机,专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都呗限制于虚拟机提供的资源中。
2. Java跨平台服务
同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台。
图示:
由于各种操作系统ABl不一样,采用编译方式,需要为不同操作系统编译成相应格式的二进制程序才能运行。 java程序写好后,使用java的编译器,编译成字节码(二进制文件),运行在java虚拟机上,再编译成各个系统的的执行文件。
3. Java实现动态网页功能
3.1 servelt
本质是一段java程序,用于扩展服务器功能,原理就是在java程序中嵌入html语言。其作用就是将java的动态效果和静态页面组合成一个特定的文件,即外面是java语言,里面是html语言。在Web服务器上形成一个静态页面交给Nginx传给代理端最终到达客户端。在Servlet中最大的问题是,HTML输出和java代码混在一起,如果网页布局要调整,Java源代码就需要随之进行调整,对于开发人员来说就是噩梦。
3.2 jsp
为了解决servelt弊端,衍生出了jsp技术,jsp是一种用于开发动态Web内容的Java技术。它允许开发人员在HTML页面中嵌入Java代码,从而能够生成动态内容。果网页布局需要调整,JAVA源代码不需要很大的调整。当然了,最后jsp文件还是要转换成servelt,jsp相当于提供了另外的模板。
综上:
Servlet主要用于处理HTTP请求和生成动态内容;Servlet可以直接与请求和响应对象交互,因此非常适合处理复杂的业务逻辑和动态内容生成。JSP用于创建动态Web页面,JSP页面会被转换成 Servlet,并且在用户请求时动态生成HTML内容。ervlet和JSP通常一起使用以构建完整的 Java Web 应用程序。Servlet处理后端逻辑,而JSP负责前端页面呈现,二者相辅相成,共同构建出功能强大的动态Web应用程序。
4. JDK
4.1 JDK和JRE关系
Java Development Kit(JDK)是Java编程语言的软件开发工具包。它提供了编译、调试和运行 Java 程序所需的工具和库。JDK包括Java运行时环境(JRE),以及用于开发Java应用程序的编译器、调试器和其他工具。 JDK还包含了许多类库和支持文件。
JDK 的核心组件包括:
- Java 编译器(javac):用于将 Java 源代码编译成 Java 字节码文件。
- Java 运行时环境(JRE):用于执行 Java 应用程序的运行时环境。
- 开发工具(如调试器、性能分析器等):用于开发和调试 Java 应用程序。
- Java 类库:包括标准的 Java 类和接口,以及支持文件,可帮助开发人员构建各种类型的应用程序。
架构图示:
4.2 虚拟机各种版本
4.2.1 Oracle JDK
安装oracle官方JDK:
官方下载链接:
#注意需要注册登录后,才能下载JDK,这里只能下载8版本的,后面版本收费
https://www.oracle.com/java/technologies/downloads/#java8
(1) Oracle JDK的rpm安装:
① 准备rpm包,yum安装
[root@localhost data]# ls
jdk-8u291-linux-x64.rpm
[root@localhost data]# yum install jdk-8u291-linux-x64.rpm -y
已安装:
jdk1.8.x86_64 2000:1.8.0_291-fcs
[root@localhost data]# rpm -q jdk1.8.x86_64
jdk1.8-1.8.0_291-fcs.x86_64
② 查看当前系统中Java的版本信息
[root@localhost data]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)
③ 设置环境变量
将默认环境变量openjdk修改为oraclejdk,Oracle JDK相较于OpenJDK更加稳定。
[root@localhost data]# which java
/usr/bin/java
[root@localhost data]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 3月 1 12:10 /usr/bin/java -> /etc/alternatives/java
#系统自带的java不是刚刚安装的java,所以需要修改环境变量
[root@localhost 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@localhost data]# cd /usr/java/jdk1.8.0_291-amd64/bin/
#查看执行文件
[root@localhost ~]# vim /etc/profile
78 export JAVA_HOME=/usr/java/default #指明变量,java程序目录
79 export PATH=$JAVA_HOME/bin:$PATH #指明PATH路径变量
80 export JRE_HOME=$JAVA_HOME/jre #指向Java运行时环境(JRE)的安装目录,非必要项
81 export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/ #层级目录,非必要项
[root@localhost ~]# . /etc/profile
[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)
#后期所有安装的jdk将变成oraclejdk
(2) Oracle JDK的二进制文件安装:
二进制安装属于编译安装的一种,只是没有执行make install。
① 准备二进制包解压
[root@localhost data]# ls
jdk-8u291-linux-x64.tar.gz
[root@localhost data]# tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
② 创建软链接,设置环境变量
[root@localhost data]# 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]# vim /etc/profile
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
③ 查看当前系统中Java的版本信息
[root@localhost 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@localhost local]# which java
/usr/local/jdk/bin/java
4.2.2 OpenJDK
在CentOS中,可以使用yum仓库安装openjdk:
[root@localhost ~]# yum list "*jdk*"
#查看可以安装哪些版本
[root@localhost ~]# yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
#安装jdk环境
[root@localhost ~]# java -version
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-b06)
OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)
#查看版本
5. Web架构
在Tomcat的Web架构中,资源是指Web应用程序中的组件,例如HTML、CSS、JavaScript文件、图像、Servlet和JSP等。这些资源在Tomcat中存储在特定目录结构中,以供访问和处理。
5.1 web资源和访问
图示:
PC端或移动端浏览器访问:从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上,从图片服务器请求图片资源显示,从业务服务器访问动态内容,动态内容是请求后台服务访问数据库后得到的,最终返回到浏览器端。
手机 App访问:内置了HTML和JS文件,不需要从静态WEB服务器下载JS或HTML。为的就是减少文件的发送,现代前端开发使用的文件太多或太大了,按需从图片服务器请求图片,从业务服务器请求动态数据。用户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
5.2 后台应用架构
图示:
① 单体应用架构
传统架构(单机系统)。一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统一部署,一个进程。即所有的服务部署在一台服务器上,并且代码存放在一起,这样缺点显然很明显,一个板块完成度很慢会影响整个项目上线,同时项目完成打包成一个文件夹,这个文件夹会非常臃肿;另外,只要有一个板块故障,会影响全部架构。
- all in one的架构方式,把所有的功能单元放在一 个应用里。然后把整个应用部署到一台服务器上。如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问
- Java实现: JSP、 Servlet,打包成一个jar. war部署
- 易于开发和测试:也十分方便部署:当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了
- 如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适合当今互联网业务功能的快速迭代
- 特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工合作都是问题。如果项目庞大,管理难度大
- web应用服务器:开源的tomcat. jetty. glassfish。 商用的有weblogic、websphere. Jboss
② 微服务与soa基本理念差不多,只是微服务更细
SOA:拆分功能模块,比如支付、订单、库存、登录进行拆分,这样就需要四台服务器支持。最根本的是,这些模块之间的联动、数据如何交互成为了开发的难题,自然成本也将升高。所以逐渐被市场淘汰。
Microservice:一台服务器软件系统被划分为一组小型、独立部署的服务,归功于容器技术的兴盛,给微服务带来了极大的便利。微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁;分布式系统中,不同的服务可以使用各自独立的数据库。
二、Tomcat部署
1. 历史介绍
Apache Tomcat,通常简称为Tomcat,是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat具有处理HTML页面的功能,它还是一个Servlet和JSP容器 ,由Apache软件基金会开发和维护。Tomcat的主要功能是实现和提供Java Servlet和JavaServer Pages(JSP)的运行环境。
2. 官网地址
官网: 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
3. 架构
4. 部署
4.1 部署Java环境
部署tomcat首先要安装jdk,环境部署在前文已经介绍,这里就不过多赘述,可以参考4.2.1 Oracle JDK,总体步骤如下:
① 解压安装包
② 创建软链接,设置环境变量
③ 测试java(java -version)
4.2 安装Tomcat
4.2.1 基于包安装tomcat
[root@localhost ~]# yum list tomca
可安装的软件包
tomcat.noarch 7.0.76-16.el7_9
#这里版本太老了,不建议使用yum安装
4.2.2 二进制安装tomcat
CentOS 7 的yum源的tomcat版本老旧,而CentOS8 yum源里无tomcat。目前比较主流的Tomcat是8和9版本,推荐从Apache官网下载二进制tomcat包进行安装,此为生产常用方式。
官方和镜像站点下载:
https://tomcat.apache.org/download-80.cgi
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
① 解压安装包
[root@localhost data]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost data]# tar xf apache-tomcat-9.0.16.tar.gz
[root@localhost data]# ls
apache-tomcat-9.0.16 apache-tomcat-9.0.16.tar.gz jdk-8u291-linux-x64.tar.gz
[root@localhost data]# cp -r apache-tomcat-9.0.16 /usr/local/
② 创建软链接,后期可多版本部署tomcat
[root@localhost data]# cd /usr/local/
[root@localhost local]# ln -s apache-tomcat-9.0.16/ tomcat
[root@localhost local]# ls
apache-tomcat-9.0.16 bin etc games include jdk jdk1.8.0_291 lib lib64 libexec sbin share src tomcat
③ 定义环境变量
[root@localhost local]# vim /etc/profile
83 export CATALINA_HOME=/usr/local/tomcat
[root@localhost local]# . /etc/profile
注意:如果已经设置了JAVA_HOME环境变量,那么在安装Tomcat时,按需设置CATALINA_HOME环境变量即可。
4.3 启动Tomcat
① 启动tomcat
[root@localhost local]# cd tomcat/
[root@localhost tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@localhost tomcat]# cd bin/
[root@localhost 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@localhost bin]# /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.
② 检查端口
[root@localhost local]# ss -natp | grep java
LISTEN 0 100 :::8080 :::* users:(("java",pid=2370,fd=57))
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=2370,fd=82))
LISTEN 0 100 :::8009 :::* users:(("java",pid=2370,fd=62))
关于端口:
- 8080:默认接收http请求的端口
- 8005:安全端口,可以关闭tomcat
- 8009:apache和tomcat联动ajp协议
③ 访问8080
页面地址:/usr/local/tomcat/webapps/ROOT/index.jsp
注意:当目录下存在index.html,访问页面会优先识别index.html。
④ 关闭tomcat
[root@localhost bin]# pwd
/usr/local/tomcat/bin
[root@localhost bin]# bash 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
4.4 指定用户管理Tomcat
① 新建用户
[root@localhost bin]# useradd -s /sbin/nologin tomcat
[root@localhost bin]# chown -R tomcat:tomcat /usr/local/tomcat
[root@localhost bin]# ll /usr/local/tomcat
lrwxrwxrwx. 1 tomcat tomcat 21 3月 1 14:47 /usr/local/tomcat -> apache-tomcat-9.0.16/
#修改属主属组
② 修改systemd服务的配置文件
[root@localhost bin]# 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 bin]# systemctl daemon-reload #重新加载配置
③ 文件夹授权,启动tomcat并查看端口号
[root@localhost local]# chown tomcat:tomcat /usr/local/tomcat/ -R
[root@localhost local]# systemctl start tomcat
[root@localhost local]# ss -natp | grep tomcat
#由于tomcat运行在java虚拟机内,所以无法过滤
[root@localhost local]# ss -natp | grep 8080
LISTEN 0 100 :::8080 :::* users:(("java",pid=39410,fd=54))
5. 配置文件介绍及核心组件
5.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 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
work工作目录结构:
[root@localhost ~]# cd /usr/local/tomcat/work/
[root@localhost work]# ls
Catalina
[root@localhost work]# tree
.
└── Catalina
└── localhost
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class #字节码
└── index_jsp.java #java程序
浏览器访问192.168.190.102:8080/test.jsp ,再次查看查看目录结构:
[root@localhost work]# tree
.
└── Catalina
└── localhost
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class
├── index_jsp.java
├── test_jsp.class
└── test_jsp.java
10 directories, 4 files
由此看到jsp缓存目录多了两个文件,当java运行动态程序的时候,需要先转成class码再去执行java程序。如果执行过一次页面访问,会把所需的文件缓存在jsp这个文件夹中,从而加速二次访问。
当升级tomcat失败,如:a1版本升级到a2版本后,依然是a1,会是什么原因?
在a1版本是,每次运行会在缓存目录形成类似于a1.java和a1.class文件;如果没有清理缓存,当拿到a2升级包将其放入到webapps中,运行后依然访问原来的页面,将原来的缓存文件删除即可。当升级上线前,可以预热访问生成新的缓存文件,加入用户访问速度。最后定义覆盖原来的软链接。
conf子目录 :
文件名 | 说明 |
server.xml | 主配置文件,全局生效。/usr/local/tomcat/conf/server.xml |
web.xml | 每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件 |
tomcat-users.xml | 用户认证的账号和密码文件 |
catalina.policy | 当使用security选项启动omcat时,用于为tomcat设置安全策略 |
catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
5.1.1 日志文件
参考文档: https://cwiki.apache.org/confluence/display/TOMCAT/Logging
日志格式: Apache Tomcat 9 Configuration Reference (9.0.86) - The Valve Component
日志目录:
[root@localhost ~]# cd /usr/local/tomcat/logs/
[root@localhost logs]# ls
catalina.2024-03-01.log #tomcat服务日志
host-manager.2024-03-01.log #host manager管理日志
localhost_access_log.2024-03-01.txt #默认主机访问日志
catalina.out #tomcat服务日志
localhost.2024-03-01.log #默认主机日志
manager.2024-03-01.log #manager管理日志
查看访问日志格式:
[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>
5.2 组件
Tomcat本身是由多个组件组成的。
5.2.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举例,在不同容器组件内分别定义。
- 集群类组件:istener、cluster
① 首先开启 tomcat进程,会有server产生
② 然后产生 一个 service管理组件管理所有其他组件的
③ 用户发送请求httpd请求过来,connector连接器(默认监听)接收到此请求, 会转交给engine (引擎)
④ engine(引擎) 会处理请求, 遍历host(虚拟主机)会交给客户访问的host, 如果找不到交给默认的 host 会根据 上下文 context (上下文) 映射关系 去找相对应的文件
⑤ 找到文件后,交给JSP生成代码, 再交给servlet生成html,原路返回反馈给用户
5.2.2 核心组件
名称 | 说明 |
server | Tomcat中的Server代表整个Tomcat服务器实例。它可以包含多个Service,并负责启动和停止整个Tomcat服务器 |
service | 服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine;Service是Tomcat中的一个抽象概念,它代表了一个具体的服务,通常对应于一个网络连接器(如HTTP)。每个Service可以包含多个Connector,用于处理不同协议或端口的连接。 |
connector | 连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine。它负责监听特定的网络端口,并将传入的请求传递给Engine进行处理。Tomcat支持多种类型的Connector,包括基于HTTP/1.1、基于HTTP/2以及基于AJP协议的Connector。 |
Engine | 即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector,一个Tomcat实例通常只有一个Engine,它可以包含多个虚拟主机(Host)。 |
Host | Host代表Tomcat中的虚拟主机,每个Host可以包含多个Web应用程序。它允许在单个Tomcat实例上托管多个域名或主机名对应的应用程序。 |
Context | 配置特定url路径映射和目录的映射关系: url => directory;Context代表了Web应用程序的上下文,它定义了一个Web应用程序的运行环境。每个Web应用程序都有自己的Context,其中包含了该应用程序的配置信息、Servlet映射、会话管理等。 |
5.2.3 tomcat 处理请求过程
① 接收请求:当Tomcat服务器接收到来自客户端的HTTP请求时,它会将请求传递给适当的组件进行处理。
② Web容器处理:请求首先被传递给Tomcat的Web容器。Web容器根据请求的URL确定是哪个应用程序的请求,并将其传递给该应用程序。
③ Servlet处理:如果请求是针对Servlet的,Web容器会在部署的应用程序中查找匹配的Servlet,并将请求传递给该Servlet进行处理。
④ JSP处理:如果请求是针对JSP页面的,Web容器会将其编译为Servlet,然后按照Servlet的处理方式进行处理。
⑤ 请求处理:Servlet或JSP页面处理请求并生成响应。这可能包括从数据库检索数据、执行业务逻辑等。
⑥ 响应返回:生成的响应被发送回Tomcat服务器。
⑦ 发送响应:Tomcat服务器将响应发送回给客户端,完成整个请求-响应周期。
5.3 项目站点访问
Tomcat中,"ROOT"是默认的上下文路径(context path)。当用户访问Tomcat服务器的根目录时,实际上是在访问部署在名为"ROOT"的默认Web应用程序。
疑问:新建项目文件夹,访问路径是否要发生变化?
① 默认项目ROOT新建web文件,webapps文件夹新建test目录,新建web文件,
[root@localhost ~]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT
[root@localhost webapps]# cd ROOT/
[root@localhost ROOT]# ls
asf-logo-wide.svg bg-nav.png index.jsp tomcat.css tomcat-power.gif
bg-button.png bg-upper.png RELEASE-NOTES.txt tomcat.gif tomcat.svg
bg-middle.png favicon.ico test.jsp tomcat.png WEB-INF
[root@localhost ROOT]# echo ROOT > index.html
[root@localhost webapps]# mkdir test
[root@localhost webapps]# cd test/
[root@localhost test]# echo test > index.html
[root@localhost test]# ls
index.html
② 访问网页
③ 小结
从上面访问结果来看,ROOT是默认站点目录,可以省略。以项目为站点,webapps中每个文件夹代表一个站点,当不指明站点时,会直接去默认站点找web文件;如果指定站点目录,将去该站点目录下寻找匹配文件。
5.4 主页文件的优先级
在Tomcat中,主页文件的优先级规定了服务器在用户访问Web应用程序时应该加载哪个文件作为默认页面。这种优先级顺序的设定有助于确保用户能够快速地找到并浏览网站的内容,同时也提供了一种灵活的方式来组织和展示Web应用程序的内容。
默认优先级:
[root@localhost ~]# vim /usr/local/tomcat/conf/web.xml
4704 <welcome-file-list>
4705 <welcome-file>index.html</welcome-file>
4706 <welcome-file>index.htm</welcome-file>
4707 <welcome-file>index.jsp</welcome-file>
4708 </welcome-file-list>
示例:自定义test项目主页文件优先级
① 复制WEB-INF至test项目中
[root@localhost ROOT]# cd
[root@localhost ~]# cd /usr/local/tomcat/webapps/ROOT/
[root@localhost ROOT]# ls
asf-logo-wide.svg bg-nav.png index.html test.jsp tomcat.png WEB-INF
bg-button.png bg-upper.png index.jsp tomcat.css tomcat-power.gif
bg-middle.png favicon.ico RELEASE-NOTES.txt tomcat.gif tomcat.svg
[root@localhost ROOT]# cp -r WEB-INF/ /usr/local/tomcat/webapps/test/
② 编辑模板配置文件
[root@localhost WEB-INF]# vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml
30 <welcome-file-list>
31 <welcome-file>index.jsp</welcome-file>
32 <welcome-file>index.html</welcome-file>
33 <welcome-file>index.htm</welcome-file>
34 </welcome-file-list>
③ 新建jsp文件,修改文件夹WEB-INF属性
[root@localhost test]# ls
index.html WEB-INF
[root@localhost test]# echo jsp > index.jsp
[root@localhost test]# chown tomcat:tomcat WEB-INF/ -R
④ 访问站点目录
6. 打包jar包实际操作
.war:WebApp打包,类zip格式文件,通常包括一个应用的所有资源,如jsp,html,配置文件等
.jar:EJB类文件的打包压缩类zip格式文件,包括很多的class文件,网景公司发明
.rar:资源适配器类打包文件,目前已不常用
.ear:企业级WebApp打包,目前已不常用
在实际生产中,我们不需要写jar包,只需要将jar包放到webapps文件夹下某一个项目内即可,并且jar包放在这里后会自动解压,自动部署项目,不需要额外操作。
示例:模拟jar包
① 模拟文件打包成jar包
[root@localhost fql]# echo jsp > test.jsp
[root@localhost fql]# echo html > test.html
[root@localhost fql]# ls
test.html test.jsp
[root@localhost fql]# jar cvf /fql/app1.war * ##打包
已添加清单
正在添加: test.html(输入 = 5) (输出 = 7)(压缩了 -40%)
正在添加: test.jsp(输入 = 4) (输出 = 6)(压缩了 -50%)
[root@localhost fql]# ls
app1.war test.html test.jsp
② 拷贝jar包至webapps文件夹
[root@localhost fql]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT test
[root@localhost webapps]# cp /fql/app1.war .
[root@localhost webapps]# ls
app1.war docs examples host-manager manager ROOT test
[root@localhost webapps]# ls
app1 app1.war docs examples host-manager manager ROOT test
#不需要新建项目app1,jar包自动部署
③ 查看项目站点文件
[root@localhost webapps]# ls app1
META-INF test.html test.jsp
④ 下线只要删除war包直接自动删除
[root@localhost webapps]# rm -rf app1.war
[root@localhost webapps]# ls
app1 docs examples host-manager manager ROOT test
[root@localhost webapps]# ls
docs examples host-manager manager ROOT test