Tomcat 部署及优化

一:Tomcat 概述

1.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容器,单独运行在后端。

1.2: Tomcat 核心组件

Tomcat 由一系列的组件构成,其中核心的组件有三个:

1:web容器:完成web服务器的功能。

2:Servlet容器:名字为catalina,用于处理Servlet代码。

3:JSP 容器:用于将 JSP动态网页翻译成Servlet代码。

JavaServlet

Servlet是Java Servlet 的简称,可以理解为是一个服务连接器,是用Java编写的服务器端程序,具有独立于平台和协议的特性,简单的理解: servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。

JSP容器

JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以< % 开头,以%>结束。

JSP是一种 Java servlet,主要用于实现 Java web应用程序的用户界面部分。

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

1.3: Tomcat 请求处理

1:用户在浏览器中输入网址,请求被发送到本机端口8080,被在那里监听的Connector获得;

2:Connector把该请求交给它所在的Service 的 Engine (Container)来处理,并等待Engine

的回应;

3:请求在Engine、Host、Context和 Wrapper 这四个容器之间层层调用,最后在Servlet 中执行对应的业务逻辑、数据存储等。

4:执行完之后的请求响应在Context、Host、Engine 容器之间层层返回,最后返回给Connector,并通过Connector返回给客户端。

1.4: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元素。

1.5: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封装器。

1.6:Tomcat数据流向

二: Tomcat 服务部署

2.1:案例环境

|---------------------|-----------------------|
| 名称 | 说明 |
| 系统版本 | CentOS7.9(64位) |
| Tomcat 版本 | 9.0.8 |
| jdk版本 | 1.8.0_171 |
| 服务器IP地址 | 192.168.10.101 6G 内存 |
| Windows 客户端IP地址及其配置 | 192.168.10.10 8G 内存 |
| 主机名 | localhost.localdomain |
| Firewalld | 关闭 |
| Selinux | 禁用 |
| Jmeter 版本 | 3.1 |

2.2:下载并安装 JDK

1:安装JDK

root@localhost \~\]# systemctl stop firewalld \[root@localhost \~\]# rpm -ivh jdk-8u171-linux-x64.rpm

2:设置 jdk 的环境变量

root@localhost \~\]# vim /etc/profile export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64 export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib export PATH=$JAVA_HOME/bin:$PATH \[root@localhost \~\]# source /etc/profile \[root@localhost \~\]# java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

2.3:安装启动 Tomcat

1:安装 Tomcat 服务

root@localhost \~\]# tar zxvf apache-tomcat-9.0.8.tar.gz \[root@localhost \~\]# mv apache-tomcat-9.0.8 /usr/local/tomcat \[root@localhost \~\]# /usr/local/tomcat/bin/startup.sh \[root@localhost \~\]# netstat -anpt \| grep java tcp6 0 0 127.0.0.1:8005 :::\* LISTEN 9591/java tcp6 0 0 :::8009 :::\* LISTEN 9591/java tcp6 0 0 :::8080 :::\* LISTEN 9591/java

备注:

8005端口是用于命令行关闭Tomcat服务

8009 Tomcat服务器通过Connector连接器组件与客户程序建立连接使用的端口

8080是Tomcat的web服务端默认口号

浏览器打开 http://192.168.10.101:8080 进行访问会出现 Tomcat 主页

2:优化 Tomcat 服务启动时间

root@localhost \~\]# vim /usr/java/jdk1.8.0_171-amd64/jre/lib/security/java.security securerandom.source=file:/dev/urandom ##已经存在该参数 \[root@localhost \~\]# /usr/local/tomcat/bin/shutdown.sh \[root@localhost \~\]# /usr/local/tomcat/bin/startup.sh

3: Tomcat 目录结构

root@localhost \~\]# ll /usr/local/tomcat/ 总用量 92 drwxr-x---. 2 root root 4096 6月 11 08:04 bin drwx------. 3 root root 254 6月 11 08:04 conf drwxr-x---. 2 root root 4096 6月 11 08:04 lib -rw-r-----. 1 root root 57092 4月 28 2018 LICENSE drwxr-x---. 2 root root 197 6月 11 08:04 logs -rw-r-----. 1 root root 1804 4月 28 2018 NOTICE -rw-r-----. 1 root root 6852 4月 28 2018 RELEASE-NOTES -rw-r-----. 1 root root 16246 4月 28 2018 RUNNING.txt drwxr-x---. 2 root root 30 6月 11 08:04 temp drwxr-x---. 7 root root 81 4月 28 2018 webapps drwxr-x---. 3 root root 22 6月 11 08:04 work

备注:

  • bin 目录:用于存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.shstartup.shshutdown.sh 三个文件。
  • conf 目录:用于存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
  • lib 目录:用于存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包。
  • logs 目录:用于存放 Tomcat 日志。
  • temp 目录:用于存放 Tomcat 运行时产生的文件。
  • webapps 目录:用于存放项目资源的目录。
  • work 目录:是 Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到。

三: Tomcat 配置与优化

3.1:虚拟主机配置

1:创建 www 和 bbs 项目目录和文件

root@localhost \~\]# ****mkdir /usr/local/tomcat/webapps/www**** \[root@localhost \~\]# ****echo "This is www page\\!"\> /usr/local/tomcat/webapps/www/index.jsp**** \[root@localhost \~\]# ****mkdir /usr/local/tomcat/webapps/bbs**** \[root@localhost \~\]# ****echo "This is bbs page\\!"\> /usr/local/tomcat/webapps/bbs/index.jsp****

2:修改 Tomcat 主配置文件

root@localhost \~\]# ****vim /usr/local/tomcat/conf/server.xml**** \ \ \ \ \ \ \ \ \[root@localhost \~\]# ****/usr/local/tomcat/bin/shutdown.sh**** \[root@localhost \~\]# ****/usr/local/tomcat/bin/startup.sh****

备注:

<Host name="bbs.test.com" appBase="/usr/local/tomcat/webapps"

name="bbs.test.com" 网站的服务名称,做基于域名的虚拟主机时,这个参数需要设置如果要做基于端口的虚拟主机,此处的值应修改为原来的localhost

appBase="/usr/local/tomcat/webapps" 站点目录,这个位置可以不用修改

path="" 虚拟目录的目录名,URL/path,指的是斜杠后跟的字符串

reloadable="true" reloadable=true时 当web.xml或者class有改动的时候都会自动重新加载不需要从新启动服务

3:虚拟主机访问测试

客户端绑定两个域名需要写入本机 hosts

备注:

tomcat可以实现基于域名的虚拟主机、基于端口的虚拟主机

Tomcat不支持基于IP的虚拟主机

3.2:Tomcat 优化

1:Tomcat 配置文件参数优化

2:jmeter 压测工具

bin文件夹下jmeter.bat文件是启动脚本

添加线程组(线程数4,循环次数10000)

添加http请求

添加监听器

配置完成后点击上方启动按钮

(1)优化前测试
(2)优化参数

root@localhost \~\]# vim /usr/local/tomcat/conf/server.xml \ \[root@localhost \~\]# ****/usr/local/tomcat/bin/shutdown.sh**** \[root@localhost \~\]# ****/usr/local/tomcat/bin/startup.sh****

(3)优化后测试

优化前

优化后

(1)Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,label显示的就是 Name 属性的值

(2)#Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100,这里显示的应该是150000而不是172649,之所以是172649,是因为我中间点击停止,然后又再原来的基础上重新开始执行。

(3)Average:平均响应时间------默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间

(4)Median:中位数,也就是 50% 用户的响应时间

(5)90% Line:90% 用户的响应时间

(6)Min:最小响应时间

(7)Max:最大响应时间

(8)Error%:本次测试中出现错误的请求的数量/请求的总数

(9)Throughput:吞吐量------默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

(10)KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
这里我们可以看到,在这172649多次的访问之中,tomcat的访问出错率是0.15%,即大概有100多次的请求是由于忙碌而失败了的。当然,这只是一个参考,具体还要根据软硬件的条件才能最终确定下来。

相关推荐
无妄-20247 分钟前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
qqxhb11 分钟前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
猴哥源码41 分钟前
基于Java+SpringBoot的在线小说阅读平台
java·spring boot
lingRJ77742 分钟前
从混沌到掌控:基于OpenTelemetry与Prometheus构建分布式调用链监控告警体系
java·springboot·prometheus·backend·opentelemetry·jaeger·microservices
星辰离彬1 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化
程序猿小D2 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的个人财务管理系统,推荐!
java·数据库·mysql·spring·毕业论文·ssm框架·个人财务管理系统
转转技术团队3 小时前
二奢仓店的静默打印代理实现
java·后端
钢铁男儿3 小时前
C# 接口(什么是接口)
java·数据库·c#
丶小鱼丶4 小时前
排序算法之【归并排序】
java·排序算法
上上迁4 小时前
分布式生成 ID 策略的演进和最佳实践,含springBoot 实现(Java版本)
java·spring boot·分布式