一、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服务器。
官网: Apache Tomcat® - Welcome!
官网文档: Apache Tomcat 8 (8.5.99) - Documentation Index
帮助文档:
Apache Tomcat Home - Apache Tomcat - Apache Software Foundation
FAQ - Apache Tomcat - Apache Software Foundatio
二、TOMCAT安装
1.JDK介绍
JDK(Java Development Kit)是 Java 语言的软件开发工具包,它包含了编译、运行Java应用程序所需的全部组件。主要包括以下几个部分:
javac | Java 编译器,用于将源代码(.java 文件)编译为字节码文件(.class 文件)。 |
java | Java 运行时环境,负责加载和执行字节码文件。 |
javadoc | Java 文档生成工具,用于从源代码注释中提取信息生成API文档。 |
jar | Java 打包工具,可以将多个类文件打包成一个.jar文件。 |
jdb | Java 调试器,用于调试Java程序。 |
jps, jinfo, jmap, jhat, jstack, jstat 等 | 这些是用于监控和管理Java虚拟机(JVM)的实用工具。 |
jmod | 在较新版本的JDK中引入的一个模块化工具,用于处理Java模块化系统中的模块。 |
jshell | 自JDK 9起引入的交互式Java Shell工具,可进行快速原型设计和学习Java语法。 |
JDK在Linux中默认是安装的,但是安装的是openjdk
OpenJDK:
1.是一个开源项目,遵循GPL v2许可协议(部分组件使用不同的兼容许可证),由全球的开发者社区共同维护和开发,包括但不限于Oracle和其他公司。
2.通常被视为Java官方参考实现的基础,任何Java版本的新特性首先会出现在OpenJDK中。
3.更新频率较快,由于社区驱动,新特性和错误修复的集成速度可能更快。
4.不包含一些商业特性,如Flight Recorder(但后来也开源了)、Mission Control等工具,以及某些性能优化或特定平台的支持。
5.多数Linux发行版默认提供的Java环境就是基于OpenJDK构建的。
Oracle JDK:
1.直到Java SE 11之前,Oracle JDK一直是Oracle公司发布的免费供个人使用的JDK版本,并为企业用户提供长期支持(LTS)版本。
2.包含了一些OpenJDK没有的额外商业特性和服务,比如上述提到的高级分析工具和可能存在的性能增强。
3.在授权方面,自Java SE 11起,Oracle JDK对商业用途开始实施订阅制收费模式,非商业用户仍然可以免费下载更新和安全补丁,但需要遵循Oracle的技术支持策略。
4.Oracle JDK曾经提供更稳定且及时的技术支持,尤其是对于付费的企业用户。
总结来说,在大多数情况下,OpenJDK与Oracle JDK在核心功能上差异较小,两者可以互换使用。然而,Oracle JDK针对企业级应用提供了更多的服务和支持,而OpenJDK则更适合那些寻求完全开源解决方案并愿意接受社区支持的开发者和组织。随着Java生态的发展,越来越多的第三方厂商也开始发布基于OpenJDK的长期支持版本,为用户提供与Oracle JDK相媲美的稳定性和技术
2.安装Oracle JDK
安装包下载官方链接:Java Downloads | Oracle
安装包下载需要登录,所以提前准备好安装包
ram安装
事先准备好rmp包,而后yum install 安装,或者使用日rpm -ivh 安装包名称;进行安装
安装好之后,找到安装目录
在该目录下可以看到很多执行文件,就是一些需要用到的java工具
为了让系统能够识别并使用这个JDK版本作为默认Java环境,需要设置一个环境变量
写在开机自动检测的文件当中
对于全局生效(所有用户):编辑 /etc/profile 或 /etc/profile.d/*.sh文件。
对于仅当前用户生效:编辑 ~/.bashrc 或 ~/.bash_profile 文件。
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来指定自定义类库的位置。
3.安装TOMCAT
安装tomcat可以使用yum install,但是,yum源中的版本过于老旧,所以不推荐
可以在官方网站下载好较新版本的安装包,而后进行二进制安装
官方网站与镜像下载站点
Apache Tomcat® - Apache Tomcat 8 Software Downloads
Index of /apache/tomcat
[root@localhost ~]#rpm -ivh jdk-8u201-linux-x64.rpm
#安装JDK包
警告:jdk-8u201-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%]
[root@localhost ~]#cd /usr/java/jdk1.8.0_201-amd64/
[root@localhost jdk1.8.0_201-amd64]#ll
总用量 25980[root@localhost jdk1.8.0_201-amd64]#vim /etc/profile
#添加环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@localhost jdk1.8.0_201-amd64]#source /etc/profile
#刷新配置文件
[root@localhost tomcat]#tar zxvf apache-tomcat-9.0.16.tar.gz
[root@localhost tomcat]#cp -r apache-tomcat-9.0.16 /usr/local/tomcat
[root@localhost tomcat]#cd /usr/local/tomcat/
[root@localhost tomcat]#/usr/local/tomcat/bin/startup.sh
#启动tomcat #catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
#关闭服务 #catalina.sh stop添加到
[root@localhost bin]#useradd -s /sbin/nologin tomcat
#新建用户
[root@localhost local]#chown tomcat:tomcat tomcat/ -R
#修改属主和属组[root@localhost ~]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
[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.targetEOF[root@localhost local]#systemctl daemon-reload
[root@localhost local]#systemctl start tomcat
[root@localhost local]#ss -ntap |grep 8080
三、配置文件介绍及核心组件
(一)配置文件
使用tree命令可以查看到在/usr/local/tomcat/目录下有好多文件
1.目录文件
bin | 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 |
conf | 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。 |
lib | 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务 |
logs | 存放 Tomcat 日志 catalina.out |
temp | 存放 Tomcat 运行时产生的文件 |
webapps | 部署Web应用程序的地方。将WAR文件或解压后的目录放在这里,Tomcat会自动检测并部署这些应用 |
work | Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
2.bin下的启动文件
以.bat结尾的文件一般为windows环境下的相关文件
以.sh结尾的文件为Unix/Linux环境下的相关文件
其中最常用的三个文件为
catalina.sh:Unix/Linux平台下启动、停止和管理Tomcat服务器的主要脚本
startup.sh:启动Tomcat服务器的脚本。
shutdown.sh:关闭Tomcat服务器的脚本。
3.conf下的子配置文件
Catalina:这不是一个文件,而是指Tomcat服务器的核心容器。它负责处理所有的Web应用请求,并且通过加载conf目录下的配置文件来管理服务器的行为。
catalina.properties:这个文件包含了Catalina容器的一些全局属性设置,例如日志路径、临时工作目录、JMX设置等。
jaspic-providers.xml:Java Authentication and Authorization Service Provider Contract for Containers (JAAS) 的提供者配置文件,用于定义和配置安全认证与授权的服务提供商。
jaspic-providers.xsd:对应的XML模式定义文件(XSD),用来验证jaspic-providers.xml文件是否遵循正确的结构和内容规范。
logging.properties:Tomcat的日志系统配置文件,定义了各种日志级别、日志输出位置以及格式化样式。
server.xml:Tomcat服务器的主要配置文件,包括端口号设置、连接器配置(HTTP/HTTPS/AJP)、引擎、主机、上下文(Web应用程序)以及其他全局服务配置。
tomcat-users.xml:用户账号和权限信息的配置文件,定义了可以访问Tomcat Manager应用和其他受保护资源的用户名、密码以及角色分配。
tomcat-users.xsd:同样作为模式定义文件,用于验证tomcat-users.xml文件的格式正确性。
web.xml:位于conf/webapps/ROOT/WEB-INF或全局配置目录下,这是Servlet容器的默认部署描述符,定义了所有Web应用通用的初始化参数、Servlet映射、过滤器、监听器等配置。对于每个单独的应用,也会有各自的web.xml文件放置在各自的WEB-INF目录内。
4.日志文件与临时、缓存文件
(二)组件
Catalina Container Catalina是Tomcat的主要容器,它负责管理整个请求处理生命周期。Catalina遵循Servlet和JavaServer Pages (JSP) 规范,以处理HTTP请求并生成响应。Catalina内部有多个层次的容器结构,包括Engine、Host、Context和Wrapper。
Engine:引擎,代表整个Catalina Servlet容器,它可以包含多个虚拟主机(Host)。
Host:虚拟主机,对应一个或多个域名/IP地址,每个Host可以部署多个Web应用程序。
Context:上下文,代表一个Web应用程序,通常对应于WAR文件解压后的目录结构。
Wrapper:最底层容器,封装了一个具体的Servlet实例。
Connector Connector是Tomcat与客户端进行通信的关键组件,它监听指定端口上的HTTP请求,并将这些请求传递给相应的Container进行处理。例如,HTTP/1.1协议的Connector会监听8080端口(默认配置),AJP Connector则监听8009端口用于与前端代理服务器如Apache HTTP Server进行通信。
Jasper Jasper是Tomcat内置的JSP编译器和容器,负责将JSP页面转换为Java Servlet源代码,然后编译成字节码并加载到容器中执行。
Web Applications Manager (Manager App) Manager是一个Web应用程序,提供了通过浏览器界面管理Tomcat上部署的应用程序的功能,比如部署新的WAR文件、启动、停止及删除已部署的应用等。
Host Manager Host Manager也是Web应用程序,主要用于管理和配置Tomcat中的虚拟主机。
Libraries and Classloaders Tomcat包含一组库文件(位于lib目录下),它们包含了运行时所需的类库和Tomcat自身功能实现所需要的类。同时,Tomcat具有复杂的类加载机制,确保不同Web应用程序之间的类隔离和资源加载。
Security Manager 安全管理器可选地在Tomcat中启用,用于实施更细粒度的安全策略控制,限制Web应用程序访问系统资源的能力。
Logging System Tomcat自带日志系统,支持灵活的日志级别设置以及多种输出格式,通过conf/logging.properties配置文件进行定制。
Global JNDI Resources Tomcat提供对Java Naming and Directory Interface (JNDI)的支持,允许在全局范围内定义和查找资源,例如数据库连接池、邮件服务等。
1.组件分层和分类
2.核心组件
(三)TOMCAT请求过程
#接收请求
'当客户端(通常是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在应用启动、停止、上下文初始化、销毁等阶段还会触发相应的生命周期事件,以便开发者
能够插入自定义的初始化逻辑或资源清理操作。'