目录
引言
一、TOMCAT简介
二、TOMCAT安装
(一)JDK简介
(二)安装Oracle JDK
1.rpm安装
2.二进制安装
(三)安装TOMCAT
三、配置文件介绍及核心组件
(一)配置文件
1.目录文件
2.bin下的启动文件
3.conf下的子配置文件
4.日志文件与临时、缓存文件
(二)访问目录
(三)组件
1.组件分层和分类
2.核心组件
(四)TOMCAT请求过程
引言
Apache Tomcat,作为Java应用服务器领域的常青树,以其开源、轻量级和高度兼容Java Servlet及JavaServer Pages(JSP)规范而广受开发者喜爱。它不仅是运行Java Web应用程序的容器,更是学习和理解Java企业级开发的重要起点。本文将带领大家深入了解Tomcat的基本架构、部署方式以及常见问题解决方案。
一、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 Foundation
二、TOMCAT安装
由于 Tomcat 是由 Java 语言实现的,因此需要运行在 Java 虚拟机上,所以使用前要先安装 JDK,以提供运行环境
(一)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:
- 是一个开源项目,遵循GPL v2许可协议(部分组件使用不同的兼容许可证),由全球的开发者社区共同维护和开发,包括但不限于Oracle和其他公司。
- 通常被视为Java官方参考实现的基础,任何Java版本的新特性首先会出现在OpenJDK中。
- 更新频率较快,由于社区驱动,新特性和错误修复的集成速度可能更快。
- 不包含一些商业特性,如Flight Recorder(但后来也开源了)、Mission Control等工具,以及某些性能优化或特定平台的支持。
- 多数Linux发行版默认提供的Java环境就是基于OpenJDK构建的。
Oracle JDK:
- 直到Java SE 11之前,Oracle JDK一直是Oracle公司发布的免费供个人使用的JDK版本,并为企业用户提供长期支持(LTS)版本。
- 包含了一些OpenJDK没有的额外商业特性和服务,比如上述提到的高级分析工具和可能存在的性能增强。
- 在授权方面,自Java SE 11起,Oracle JDK对商业用途开始实施订阅制收费模式,非商业用户仍然可以免费下载更新和安全补丁,但需要遵循Oracle的技术支持策略。
- Oracle JDK曾经提供更稳定且及时的技术支持,尤其是对于付费的企业用户。
总结来说,在大多数情况下,OpenJDK与Oracle JDK在核心功能上差异较小,两者可以互换使用。然而,Oracle JDK针对企业级应用提供了更多的服务和支持,而OpenJDK则更适合那些寻求完全开源解决方案并愿意接受社区支持的开发者和组织。随着Java生态的发展,越来越多的第三方厂商也开始发布基于OpenJDK的长期支持版本,为用户提供与Oracle JDK相媲美的稳定性和技术支持。
(二)安装Oracle JDK
安装包下载官方链接:Java Downloads | Oracle
安装包下载需要登录,所以提前准备好安装包
1.rpm安装
事先准备好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来指定自定义类库的位置。
2.二进制安装
预先准备好二进制安装包
与rpm包安装好后一样,设置环境变量
(三)安装TOMCAT
安装tomcat可以使用yum install,但是,yum源中的版本过于老旧,所以不推荐
可以在官方网站下载好较新版本的安装包,而后进行二进制安装
官方网站与镜像下载站点
Apache Tomcat® - Apache Tomcat 8 Software Downloads
Index of /apache/tomcat
下载完源码包后首先进行解压
将文件复制到指定目录/usr/local目录下并自定义名称为tomcat
创建systemd管理文件
开启进程后过滤tomcat进程时并不能查询到,因为tomcat程序是使用java运行的,所以并不能直接过滤到
tomcat是多端口监听,分别为8005、8009、8080
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属性值。'
tomcat的web服务监听的端口号是8080,所以访问时需要使用web浏览器访问本机的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 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
普通文件
README.md、BUILDING.txt | 提供了关于Tomcat的简要说明和构建过程的文档 |
CONTRIBUTING.md | 如果存在,通常是指导如何为Tomcat项目做出贡献的指南 |
LICENSE 和 NOTICE | 分别包含了Tomcat使用的开源许可证条款和版权归属、第三方软件 声明等法律信息 |
RELEASE-NOTES 或类似的文件 | 记录了当前版本的发布说明和变更日志 |
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.日志文件与临时、缓存文件
tomcat服务自动做好日志分割服务
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 管理日志
临时文件
缓存文件
4.webapps
docs | 这个文件夹包含了Tomcat的官方文档和教程,如安装指南、用户手册、API参考等。 当Tomcat启动后,可以通过浏览器访问 http://localhost:8080/docs/ 来查看这些文档。 |
examples | 提供了一系列示例Web应用程序,包括Servlets、JSPs和其他Java EE技术的演示代码。 通过运行 http://localhost:8080/examples/,您可以浏览并尝试这些示例应用。 |
host-manager | 是一个用于管理和配置虚拟主机(Host)的Web应用程序。管理员可以使用它来添加、 删除或编辑Tomcat中的Host配置。要访问该应用,需要在tomcat-users.xml中设置适当的 权限,并通过 http://localhost:8080/host-manager/ 访问。 |
manager | 是一个更为全面的应用程序部署管理工具,允许管理员上传WAR文件、启动、停止、重新 加载以及删除已经部署的应用程序。同样,访问此应用也需要在tomcat-users.xml中设置权 限,然后通过 http://localhost:8080/manager/ 访问。 |
ROOT | 这是一个特殊的Web应用程序,它的上下文路径是空字符串,所以直接访问服务器地 址 http://localhost:8080/ 时显示的内容就是ROOT应用的内容。通常可以将自定义的网站 主页放置在这个目录下,以便于通过服务器域名或IP地址直接访问主页面。 |
(二)访问目录
默认的访问目录是在/usr/local/tomcat/webapps/ROOT目录
如果在该目录下建立一个index.html文件,就会默认访问这个文件
这是因为在conf/web.xml这个文件中定义了全局的文件访问顺序,在没有局部配置的情况下,都已这个文件定义的为主
在webapps/ROOT/WEB-INF/目录下也有一个web-xml文件,这个文件并没有定义访问顺序,所以默认以全局配置文件为主。想要在局部生效,可以通过设置该文件
保存退出后systemctl restart tomcat 重启服务
这样默认访问的就是idnex.jsp文件,也可以自定义其它文件
(三)组件
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.组件分层和分类
顶级组件
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
2.核心组件
名称 | 说明 |
---|---|
server | 服务器,Tomcat运行的进程实例,一个Server中可以有多个service,但通常就一个 |
service | 服务,用来组织Engine(引擎)和Connector(连接器,端口)的对应关系,一个service中只有一个Engine |
connector | 连接器,负责客户端的HTTP、HTTPS、AJP等协议连接。一个Connector只属于某一个Engine |
Engine | 即引擎,用来响应并处理用户请求。一个Engine上可以绑定多个Connector |
Host | 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分 |
Context | 应用的上下文,配置特定url路径映射和目录的映射关系: url => directory |
结合配置文件来说明一下:
打开配置文件:vim /usr/local/tomcat/conf/server.xml
可以看到,里面有很多不需要的注释信息,可以使用sed命令过滤一下
<>:表示组件开始
</>组件结尾
首位呼应为一段完整的组件
Server
'定义整个服务器级别的属性,如监听关闭命令的端口号(port="8005")以及用于关闭Tomcat服
务的命令字符串(shutdown="SHUTDOWN")。'
Listener
'定义了一系列监听器,它们会在Tomcat启动和停止时执行特定的任务。例如:
VersionLoggerListener:在启动时打印版本信息。
JreMemoryLeakPreventionListener 和 ThreadLocalLeakPreventionListener
用于防止Java内存泄漏问题。
GlobalResourcesLifecycleListener:管理全局命名资源的生命周期。'
GlobalNamingResources
'定义了全局的JNDI资源,此处有一个名为 "UserDatabase" 的资源,它是一个用户数据库,
使用 MemoryUserDatabaseFactory 创建,并关联到 conf/tomcat-users.xml 文件中定义
的用户数据。'
Service
'定义了一个名为 "Catalina" 的服务,它是Tomcat处理请求的核心组件集合,包括多个
Connector和一个Engine。'
Connector
'定义了服务器对外提供HTTP服务的监听器,监听8080端口,协议为HTTP/1.1,设置了连接超时
时间、重定向HTTPS端口等属性。'
Engine
'作为顶级容器,代表整个Catalina Servlet容器,名称为 "Catalina",默认
主机名是 "localhost"。'
Realm
'定义了安全域,用于认证和授权。这里包含两个Realm,首先通过 LockOutRealm 进行锁定策略
控制,然后使用基于内存的 UserDatabaseRealm 实现用户认证,从前面定义的 "UserDatabase"JNDI资源中读取用户信息。'
Host
'定义了名为 "localhost" 的虚拟主机,设置应用基础目录(appBase)为 "webapps",并允许
自动解压WAR文件部署应用、启用自动部署功能。'
Valve
'定义了一个访问日志阀门(AccessLogValve),负责记录访问日志。指定日志存储路径、前缀、后
缀及日志格式。'
(四)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在应用启动、停止、上下文初始化、销毁等阶段还会触发相应的生命周期事件,以便开发者
能够插入自定义的初始化逻辑或资源清理操作。'