目录
一、Tomcat介绍
Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
1.1 Tomcat
常意义上的 Web 服务器接受请求后,只是单纯地响应静态资源,如 HTML 文件,图片 文件等,不能在后端进行一定的处理操作。 Tomcat 是 Apache 下的一个子项目,它具备 Web 服务器的所有功能(WEB容器嵌入Servlet-》动态请求),不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范 的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式写回客户端。
1.2 核心的组件
① Web容器
负责WEB服务的TCP/IP、HTTP等协议响应、处理 (nginx 处理静态页面的应用交互) http://www.baidu.com(:80)/
③ JSP容器(JAVA Scripts page)
简介:Tomcat 中 做为JAVA前端展示的一个组件 index.jsp 因为index.jsp <html /html> 标签,标签中会嵌套了很多JAVA代码,书写形式是, <%开头 以%>,是一种servlet(java后端逻辑业务的任务)
JSP全称:Java Server Pages: 是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头 以%>结束。JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。 JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP: 容器内提供了多个以index.jsp为结尾的JAVA前端页面展示,而index.jsp中由很多HTML标签,HTML标签中会嵌套很多JAVA代码,这些JAVA代码,最终会被翻译为Servlet 代码,(而本身JSP容器不具备解析与分析代码的功能,所以会给交给Servlet容器)
③ Servlet容器
Servlet 翻译index.jsp中这些java代码,执行一些servlet任务操作,比如数据库交互、加密、支付宝、人脸识别, 处理完后,将这些数据返回给JSP ,通过jsp中的index.jsp 展示出来(JAVA)
动态交互处理,会将JSP传递过来的代码翻译为Servlet 由catalina脚本帮忙处理的servlet代码,主要处理后端逻辑业务(比如与数据库交互、加密、支付宝、人脸识别等) catalina实际处理的是Servlet代码,而Servlet代码是由Java编写的
1.3 Tomcat处理请求过程
1.3.1 Tomcat 功能组件结构
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用Servlet 相关逻辑。
Service:对外提供的 Web 服务。主要包含 Connector 和 Container
两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。
1.3.2 Container 结构分析
每个 Service 会包含一个 Container 容器,在 Container 内部包含了 4 个子容器。
4个子容器的作用分别是:
(1)Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
(2)Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
(3)Context:代表一个 Web 应用,包含多个 Servlet 封装器,用于连接Host项目和servlet容器
(4)Wrapper:封装器,容器的最底层。每一个 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。
容器由一个引擎可以管理多个虚拟主机。
每个虚拟主机可以管理多个 Web 应用。
每个 Web 应用会有多个 Servlet 封装器。
请求过程:
- 用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
- Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
- 请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet中执行对应的业务逻辑、数据存储等。
- 执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过Connector 返回给客户端。
1.3.3 tomcat核心和功能组件作用
Tomcat核心组件有6个,分别为Tomcat有Server、Service、Connector、Engine、Host和Context等
1、Server
Server元素在最顶层,代表整个Tomcat容器,因此它必须是server.xml中唯一一个最外层的元素。一个Server元素中可以有一个或多个Service元素。
Server的主要任务,就是提供一个接口让客户端能够访问到这个Service集合,同时维护它所包含的所有的Service的声明周期,包括如何初始化、如何结束服务、如何找到客户端要访问的Service。
2、Service
Service的作用,是在Connector和Engine外面包了一层,把它们组装在一起,对外提供服务。一个Service可以包含多个Connector,但是只能包含一个Engine;其中Connector的作用是从客户端接收请求,Engine的作用是处理接收进来的请求。Tomcat可以提供多个Service,不同的Service监听不同的端口。
3、Connector
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。通过配置Connector,可以控制请求Service的协议及端口号。
4、Engine
Engine组件在Service组件中有且只有一个;Engine是Service组件中的请求处理组件。Engine组件从一个或多个Connector中接收请求并处理,并将完成的响应返回给Connector,最终传递给客户端。
实际上,Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。
5、Host
Host是Engine的子容器。Engine组件中可以内嵌1个或多个Host组件,每个Host组件代表Engine中的一个虚拟主机。Host组件至少有一个,且其中一个的name必须与Engine组件的defaultHost属性相匹配。
Host虚拟主机的作用,是运行多个Web应用(一个Context代表一个Web应用),并负责安装、展开、启动和结束每个Web应用。
6、Context
Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。Context是Host的子容器,每个Host中可以定义任意多的Context元素。
变量 | 说明 |
---|---|
CLASSPATH | 编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件 |
dt.jar | 是关于运行环境的类库,主要是 swing 的包 |
tools.jar | 主要是一些jdk工具的类库,包括javac,java,javap,javadoc等 |
JDK | java development kit (java开发工具) |
JRE | java runtime environment (java运行时环境) |
JVM | java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文 |
二、部署Tomcat
2.1 安装JDK环境
2.1.1 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.1.2 上传软件包
2.1.3 解压软件包
rpm -ivh jdk-8u201-linux-x64.rpm
2.1.4 设置JDK的环境变量
vim /etc/profile.d/java.sh #/etc/profile.d/ 环境变量脚本目录
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 #输出指定java所需的类文件
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar #可执行文件的位置
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh 加载生效、
java -version 查看版本
2.1.5 测试是否成功
设置好以后,编写java脚本来验证安装
vim a.java
#类名、接口名命令:英文大小写字母、数字字符、$和_,不能使用关键字和数字开头;
一个单词命名时第一个单词的首字母要大写;多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰命名法)
public class abc {
public static void main(String[] args){
System.out.println("Hello world!");
}
}
javac a.java
java a
2.2 安装启动 Tomcat
2.2.1 解压tomcat包
cd /opt/Tomcat
tar zxvf apache-tomcat-9.0.16.tar.gz 解包
mv apache-tomcat-9.0.16 /usr/local/tomcat #将解压后的包剪切到/usr/local 目录中,并改名为tomcat
2.2.2 查看tomcat文件及文件说明
我们如果要执行、持续运行一个java开发应用服务,在经过简单配置之后,可以直接将war包、jar包,放入到webapps中,来让tomcat运行。
主要目录说明
1、bin :存放启动和关闭Tomcat的脚本文件,比较常用的是:catalina.sh 、 startup.sh 、 shutdown.sh
2、conf: 存放Tomcat服务器的各种配置文件,比较常用的是server.xml、context.xml、tomcat-users.xml、web.xml
3、lib: 存放Tomcat服务器的jar包,一般不做任何改动,除非连接第三方服务,比如redis,那就需要添加对应的jar包。
4、logs:存放Tomcat日志
5、temp:存放Tomcat运行时产生的文件
6、webapps:存放项目资源的目录
7、work: Tomcat工作目录,一般清除Tomcat缓存的时候会使用到
8、src: 存放Tomcat 的源代码
9、doc: 存放Tomcat文档
Tomcat配置文件详解
1、catalina.policy :权限控制配置文件
2、catalina.properties: Tomcat的属性配置文件
3、context.xml : 上下文配置文件
4、logging.properties:日志相关配置文件
5、server.xml : 主配置文件,通过配置文件,可以修改tomcat的启动端口,网站目录,虚拟主机,开启https等功能
6、tomacat-user.xml/.xsd: 管理用户配置文件
7、web.xml: tomcal的servlet、servlet-mapping、filter、MIME等相关配置
2.2.3 优化管理tomcat
启动tomcat
#优化管理
ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
将启动脚本放入环境中方便启动
后台启动
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start
前台启动(终端关闭,tomacat停止运行)
/usr/local/tomcat/bin/catalina.sh run
关闭
/usr/local/tomcat/bin/shutdown.sh
三、Tomcat 优化
生产环境中第一次启动 tomcat 可能会发现 tomcat 启动很慢,默认情况下可能需要几十秒,此时可以修改 jdk 参数进行优化
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
------修改117行-----
securerandom.source=file:/dev/urandom
##/dev/random和/dev/urandom都是伪终端,但是/dev/urandom提供的数据流更快
#主配置文件/usr/local/tomcat/conf/server.xml
#搜索8080(69行)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" # 连接超时时间(毫秒)
redirectPort="8443" /> #SSL 重定向/映射443,从8080端口进来都会加密为(https)
<Connector 连接器,连接前web服务
port="8080" 端口
protocol="HTTP/1.1" 版本协议,表示长连接
#/dev/random和/dev/urandom都是伪终端,但是/dev/urandom提供的数据流更快
四、Tomcat虚拟主机配置
很多时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。
[root@zzh5 webapps] mkdir /usr/local/tomcat/webapps/laoshu
[root@zzh5 webapps] mkdir /usr/local/tomcat/webapps/abc
[root@zzh5 webapps] echo "this is laoshu page\!" > /usr/local/tomcat/webapps/laoshu/index.jsp
[root@zzh5 webapps] echo "this is abc page\!" > /usr/local/tomcat/webapps/abc/index.jsp
vim /usr/local/tomcat/conf/server.xml
#搜索/Host name,查看Host(虚拟主机)及其属性
</Host>
<Host name="www.laoshu.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/laoshu" path="" reloadable="true" />
</Host>
<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/abc" path="" reloadable="true" />
</Host>
#配置详解
Host name :主机名
appBase : Tomcat程序工作目录,相对路径为webapps,绝对路径为/usr/local/tomcat/webapps
unpackWARs :tomcat在webapps文件夹中发现war包文件时,是否自动将其解压
autoDeploy :设为true,则web.xml发生变化时,tomcat自动重新部署程序。实现这个功能必需允许后台处理
xmlValidation :是否开启对XML文件的验证
xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验
"Context"
docBase : WEB应用的目录(本地路径)
path:设置访问的URI为WEB应用的根目录(URL路径),""表示默认,加载系统中自带的类(class文件)
reloadable :是否在程序有改动时重新载入
shutdown.sh
startup.sh
重新启动一下