目录
- 一、 Tomcat 概述
- 二、Tomcat 核心组件
- 三、Tomcat 处理请求内部数据流向
- 四、Tomcat 部署
- 五、Tomcat 主目录说明
- 六、Tomcat 虚拟机的配置
- 八、Tomcat 优化
- 八、Tomcat 多实例部署
- 九、扩展 Java 虚拟机(JVM)调优
一、 Tomcat 概述
1. 介绍
Tomcat 是免费的、开放源代码的Web应用服务器
Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的一个核心项目
由Apache、Sun和一些公司及个人共同开发而成
深受Java爱好者的喜爱,并得到部分软件开发商的认可
目前比较流行的Web应用服务器
Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat虽然和 Apache或者 Nginx这些web
服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及 Apache或者Nginx,所以Tomcat 通常是作为一个Servlet 和 JSP 容器,单独运行在后端。
二、Tomcat 核心组件
1. 有哪些系列的组件结构
(1)Web 容器
① 概念
完成 Web 服务器的功能
tomcat <==> web 应用服务
web 可以通过 http(s) 来访问的一个页面 ---> 文件
web 容器 ---> 封装一组文件
集中化管理 ---> 一组组员的对象
可以看成 获取web 动态页面
② 作用
接收、响应请求
展示动态页面
入口、出口
(2)JSP 容器
① 概念
将 JSP 动态网页,翻译成 Servlet 代码
② 作用
将 Java 翻译成 servlet
③ 原理
index.jsp ---> java 类代码(就是执行对接后端的执行代码,所以我们需要在进行与用户交互时,将用户发出的请求、数据、传输到后瑞,但是 index.jsp 中的一些 java 代码无法直接执行对接或者调用,就需要先翻译为能可直接执行的代码方式)---> 格式 servlet 代码格式
(3)Server 容器
用catalina程序/脚本,执行处理Servlet 代码
(4)扩展
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。与CGI(公共网关接口)功能相类似。
JSP 全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以 <%开头,以%> 结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。 JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
2. 核心组件如何进行交互
(1) Tomcat 架构图
(2)交互流程图
3. 功能组件结构
Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和wrapper 四个容器组成,用于管理和调用Servlet相关逻辑。
Service:对外提供的 web服务。主要包含Connector和Container 两个核心组件,以及其他功能组件。Tomcat可以管理多个service,且各service 之间相互独立。
Container 结构分析
每个service 会包含一个Container 容器。在Container内部包含了4个子容器,4个子容器的作用分别是:
(1)Engine:引擎,用来管理多个虚拟主机,一个Service 最多只能有一个Engine
(2)Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点
(3)Context:代表一个web应用,包含多个 servlet 封装器
(4)wrapper:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 wrapper,这四个容器之间属于父子关系。
容器有一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 web 应用。每个 web 应用会有多个 Servlet 封装器。
三、Tomcat 处理请求内部数据流向
1. Tomcat 请求过程
1、用户在浏览器中输入网址,请求被发送到本机端口8080,被在那里监听的Connector获得
2、Connector 把该请求交给它所在的Service 的 Engine (Container)来处理,并等待Engine 的回应
3、请求在Engine、Host、Context 和 wrapper,这四个容器之间层层调用,最后在Servlet
中执行对应的业务逻辑、数据存储等
4、执行完之后的请求响应在Context、Host、Engine 容器之间层层返回,最后返回给Connector,并通过 Connector 返回给客户端
2. 详细请求过程
假设来自客户的请求为:http://localhost:8080/test/test_index.jsp
(1)请求被发送到本机端口8080,被在那里侦听的 coyote HTTP/1.1 Connector 获得
(2)Connector 把该请求交给它所在的 service 的 Engine 来处理,并等待来自 Engine 的回应
(3)Engine 获得请求 localhost/test/test_index.jsp,匹配它所拥有的所有虚拟主机Host
(4)Engine 匹配到名为 localhost 的Host (即使匹配不到也把请求交给该 Host 处理,因为该 Host 被定义为该Engine的默认主机)
(5)localhost Host 获得请求 /test/test_index.jsp,匹配它所拥有的所有Context
(6)Host 匹配到路径为 /test的 Context(如果匹配不到就把该请求交给路径名为""的 Context 去处理)
(7)path="/test"的 Context 获得请求 /test_index.jsp,在它的 mapping table 中寻找对应的servlet
(8)Context 匹配到 URL PATTERN 为 * .jsp的 servlet,对应于 Jspservlet 类
(9)构造 HttpServletRequest 对象 和 HttpServletResponse 对象,作为参数调用 JspServlet 的doGet或doPost方法
(10)Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
(11)Host 把 HttpservletResponse 对象返回给Engine
(12)Engine 把 HttpservletResponse 对象返回给 Connector
(13)connector 把 HttpservletResponse 对象返回给客户 browser
3. 总结
tomcat:首先是一种web 应用服务
tocmat:所处的位置一般来说是 Nginx 之后,作为动态处理的服务
tomcat:职能作为 JAVA 类语言开发的应用所执行和持续运行的平台
tomcat 组成部分:web容器、jsp容器、servlet容器
tomcat工作流程:80端口 -----> 8080端口(是由 connector 连接器监听 ---> 给与容器的 engin 引擎 ---> Host项目(webapps中,对应项目的代码(解压后)) ---> 通过 context 传递代码、连接 ---> 应用的运行环境,最后执行 servlet 代码(动态请求任务),---> 最后要么对数据库、要么直接返回给nginx ---> 展示给用户查看)
四、Tomcat 部署
下载 JDK 安装 JDK 设置环境变量 安装tomcat启动
tomcat ---> java平台环境 ---> 依赖于JDK---> 合适的JDK版本的选择tomcat中
webapps 的作用?
tomcat 工作目录下主要的子目录做什么用?
1. 准备所需安装包
所需要的安装包:
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz
2. 安装 JDK
(1)安装
cd /opt
rpm -ivh jdk-8u371-linux-x64.rpm
(2)设置 JDK 变量环境
vim /etc/profile.d/java.sh
export JAVA_HOME=/urs/java/jdk1.8.0-x64
export CLASSPATH=.$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
:wq!
source /etc/profile.d/java.sh
专业名词 | 作用 |
---|---|
CLASSPATH | 编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件 |
dt.jar | 是关于运行环境的类库,主要是可视化的 swing 的包 |
tools.jar | 主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等 |
JDK | java development kit (java开发工具) |
JRE | java runtime environment (java运行时环境) |
JVM | java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件 |
3. 安装 Tomcat
# 解压 tomcat 包
tar -xf /opt/apache-tomcat-8.5.16.tar.gz
# 切换 tomcat 位置
mv /opt/apache-tomcat-8.5.16 /usr/local/tomcat
# 开启 tomcat
/usr/local/tomcat/bin/startup.sh
浏览器访问
192.168.23.10:8080
五、Tomcat 主目录说明
六、Tomcat 虚拟机的配置
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个Tomcat服务,这样会消耗太多的系统资源。此时,就需要使用到Tomcat虚拟主机。例如现在新增两个域名 www.test1.com 和 www.test2.com,希望通过这两个域名访问到不同的项目内容。
1. 创建项目 目录和文件
mkdir /usr/local/tomcat/webapps/test1
mkdir /usr/local/tomcat/webapps/test2
echo "this is test1 page" > /usr/local/tomcat/webapps/test1/index.jsp
echo "this is test2 page" > /usr/local/tomcat/webapps/test2/index.jsp
2. 修改 Tomcat 主配置文件
vim /usr/local/tomcat/conf/server.xml
# 第 165 行添加
<Host name="www.test1.com" appBase="webapps" unpackWARs="true" autoDeply="true"
xmlvaildation="false" xmlnamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test1" path="" relocadble="true" />
</Host>
<Host name="www.test2.com" appBase="webapps" unpackWARs="true" autoDeply="true"
xmlvaildation="false" xmlnamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test2" path="" relocadble="true" />
</Host>
:wq!
/usr/local/tomcat/bin/shotdown.sh
/usr/local/tomcat/bin/startup.sh
设置 | 作用 |
---|---|
name | 域名 |
appBase | Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps |
unpackWARs | 在启用此 webapps 时是否对 WAR 格式的归档文件先进行展开;默认为true |
autoDeploy | 自动部署,在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行 deploy;默认为true |
xmlVaildation | 是否验证xml文件执行有效性检验的标志 |
xmlNamespaceAware | 是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验 |
docBase | 相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径 |
path | 相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径 / |
reloadable | 是否允许重新加载此context相关的Web应用程序的类;默认为false |
浏览器访问
http://www.test1.com:8080
http://www.test2.com:8080
HTTP 请求过程:
(1)Connector 连接器监听的端口是 8080。由于请求的端口和监听的端口一致,连接器接受了该请求。
(2)因为引擎的默认虚拟主机是 www.test.com,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。
(3)访问的路径为根路径,URI 为空,即空是 Web 程序的应用名,也就是 context。此时请求找到 /usr/local/tomcat/webapps/kgc 目录,解析 index.jsp 并返回。
八、Tomcat 优化
Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。
Tomcat 配置文件参数优化
常用的优化相关参数如下:
【redirectPort】如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口。
【maxThreads】Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可创建的最大的线程数,即支持的最大并发连接数,默认值是 200。
【minSpareThreads】最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
【maxSpareThreads】最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制)。一般不需要指定。
【URIEncoding】指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 Web服务器软件配置方便,需要分别指定。
【connnectionTimeout】网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常默认 20000 毫秒就可以。
【enableLookups】是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为 false,则直接返回 IP 地址,为了提高处理能力,应设置为 false。
【disableUploadTimeout】上传时是否使用超时机制。应设置为 true。
【connectionUploadTimeout】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
【acceptCount】指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为 100 个。
【compression】是否对响应的数据进行GZIP压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为 off,压缩数据后可以有效的减少页面的大小,一般可以减小 1/3 左右,节省带宽。
【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是 2048。
【compressableMimeType】压缩类型,指定对哪些类型的文件进行数据压缩。
【noCompressionUserAgents="gozilla, traviata"】对于以下的浏览器,不启用压缩
以上是一些常用的配置参数,还有好多其它的参数设置,还可以继续深入的优化,HTTP Connector 与 AJP Connector 的参数属性值,可以参考官方文档的详细说明进行学习。
vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/11.1"
connectionTimeout="20000"
redirectPort="8443"
--71行--插入
minSpareThreads="50"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/>
八、Tomcat 多实例部署
web tomcat 动静分离
先安装好 jdk 再进行多实例部署
1. 安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
# 创建两个实例
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
2. 配置 tomcat 环境变量
vim /etc/profile.d/tomcat.sh
# tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1
# tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2
:wq!
source /etc/profile.d/tomcat.sh
3. 修改 server.xml 文件
(1)tomcat1的server.xml
默认即可,不需要修改
vim /usr/local/tomcat/tomcat1/conf/server.xml
# 第22、69、116行
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
(2)tomcat的server.xml
需要保证端口不冲突
vim /usr/local/tomcat/tomcat2/conf/server.xml
# 第22、69、116行
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Server port="8006" shutdown="SHUTDOWN">
这是一个定义 Tomcat 服务器配置的元素。port
属性指定了服务器控制端口号为8006
,用于接收关闭服务器的命令。shutdown
属性指定了可以用来关闭服务器的命令字符串为SHUTDOWN
。<Connector port="8081" protocol="HTTP/1.1"
这是定义一个连接器(Connector)的元素,用于处理 HTTP 请求。该连接器监听在为8081
的端口上,并使用协议为HTTP/1.1
。这意味着当客户端发送 HTTP 请求时,该连接器会接受请求并将其传递给 Tomcat 服务器进行处理。<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
这也是定义一个连接器的元素,但是这个连接器使用 AJP(Apache JServ Protocol)协议。AJP 协议通常用于将请求从前端的 Web 服务器(如 Apache)转发到后端的 Tomcat 服务器。该连接器监听在8010
端口上,并使用协议为AJP/1.3
。当需要进行重定向时,请求将被重定向到端口8443
。
4. 向实例启动和关闭文件中添加环境变量
修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/tomcat1/bin/startup.sh
# 末行添加
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# 末行添加
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
vim /usr/local/tomcat/tomcat2/bin/startup.sh
# 末行添加
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# 末行添加
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
5. 重启各个实例
重启先关闭,再重启
# 关闭
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
# 开启
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
6. 浏览器访问测试
访问 8080 端口
访问 8081 端口
九、扩展 Java 虚拟机(JVM)调优
/bin/catalina.sh
-server:jvm的server工作模式,对应的有client工作模式。使用“java -version”可以查看当前工作
模式
-Xms1024m:初始Heap大小,使用的最小内存
-Xmx1024m:Java heap最大值,使用的最大内存。经验: 设置Xms大小等于Xmx大小
-XX:NewSize=512m:表示新生代初始内存的大小,应该小于 -Xms的值
-XX:MaxNewSize=1024M:表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值
-XX:PermSize=1024m:设定内存的永久保存区域,内存的永久保存区域,VM 存放Class 和 Meta
信息,JVM在运行期间不会清除该区域
-XX:MaxPermSize=1024m:设定最大内存的永久保存区域。经验: 设置PermSize大小等于
MaxPermSize大小
-XX:+DisableExplicitGC:自动将System.gc() 调用转换成一个空操作,即应用中调用System.gc()
会变成一个空操作,避免程序员在代码里进行System.gc()这种危险操作。System.gc()
除非是到了万不得也的情况下使用,都应该交给 JVM。
标签:Tomcat,tomcat,部署,优化,export,usr,local,请求
From: https://www.cnblogs.com/m-zhuang/p/17520825.html