m-zhuang

导航

Tomcat 部署及优化



一、 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)交互流程图

image-20230629015421174

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

image-20230629202435117


2. 安装 JDK

(1)安装

cd /opt
rpm -ivh jdk-8u371-linux-x64.rpm 

image-20230629202823124

(2)设置 JDK 变量环境

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/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

image-20230629215412260

专业名词 作用
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 

image-20230629232819353

image-20230629232249068


浏览器访问

192.168.23.10:8080

image-20230629232412521



五、Tomcat 主目录说明

image-20230630013208434



六、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

image-20230630030331899

image-20230630030827287


设置 作用
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

image-20230630031451051

image-20230630031527323


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

image-20230702131813231


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" />

image-20230702135316532

image-20230702135347822

image-20230702135418434

  • <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 

image-20230702145156209


6. 浏览器访问测试

访问 8080 端口

image-20230702145948841

访问 8081 端口

image-20230702150121672



九、扩展 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。

posted on 2023-07-02 16:05  m_zhuang  阅读(34)  评论(0编辑  收藏  举报