所有分类
  • 所有分类
  • 网站源码

开课

本章我们来学习一下另外的一种web服务***cat,这是一个支持jsp页面的web服务,很多开发方向的IT人员,包括运维开发方向的同仁,都会选择使用***cat

知识点

什么是***cat

CentOS8中如何部署***cat

windows系统中如何部署***cat

***cat的相关目录和文件的作用

***cat的管理界面如何使用

如何使用***cat发布静态页面

***cat动态页面的实现

***cat多实例的实现

让nginx和***cat协同工作

***cat的运行模式

***cat运行模式的调整

额外的优化参数

压力测试工具的使用

课程目标

能够知道什么是***cat

能够在不同的系统上部署***cat

能够记住***cat的常用目录和文件

能够知道如何管理***cat

能够在***cat上部署静态网站和***站

能够将nginx和***cat整合并实现多实例

能够对***cat进行简单的调优

能够使用压力测试工具

Tomcat

介绍

Apache Tomcat最早是由Sun开发的,在1999年被捐献给A**(Apache 软件基金会 Apache Software Foundation),隶属于Jakarta(雅加达)项目,现在已经**为一个**项目。因为Tomcat 技术先进、性能稳定,同时也是一个免费的**源代码的Web 应用服务器,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,被很多企业普遍使用,也是开发和调试JSP程序的首选。成为目前比较流行的Web 应用服务器。

官方网站:http://***cat.apache.org/

***cat的同类产品

  • Resin 服务器

Resin是Caucho公司的产品,速度非常快。可以显示动态内容,也可以显示静态内容,但是用户数量少,参考文档也少,使用起来不太方便,一旦涉及到相关文件和内容的更新,系统会自动重新部署并重启。

  • Jetty 服务器

Jetty是一个纯粹的基于Java的web服务器,也是一个开源项目。架构简单,速度快,修改简单,但是对java的支持不如***cat全面,

  • WebLogic 服务器

WebLogic 是BEA公司的产品,可进一步细分为 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特别强大。WebLogic 支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供Java平台所拥有的一切应用服务器的用户来说,WebLogic是一个十分理想的选择。但是不开源且收费

JBoss、WebSphere

Apache nginx ***cat比较

Apache

优点:模块多,功能全面,性能稳定,适合静态HTML

缺点:配置相对复杂,自身不支持动态页面

Nginx

优点:功能较多,负载均衡、反向代理等,速度比Apache快

缺点:轻量级web服务器,功能不如Apache全面

Tomcat

优点:能够处理动态请求,可以**于Apache运行,支持JSP

缺点:对静态内容和大文件的支持有所欠缺

Apache是用C写的,Nigix是用C写的,Tomcat是用Java写的。Tomcat是Apache的拓展,更实质的说是Java应用服务器,用于处理JSP后台语言开发的应用,主要用于处理JSP***页。Tomcat 服务器是一个免费的**源代码的Web 应用服务器(主要用于解析servlet/JSP,同时具备http服务),单纯的Tomcat性能有限,在很多地方表现有欠缺,如活动连接支持、静态内容、大文件和HTTPS等,因此多数都是Apache+Tomcat+JavaSDK的集成。严格的来说,Apache/Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。

安装部署

Linux部署***cat

下载软件包

***cat:https://mirrors.tuna.tsinghua.edu.cn/apache/***cat/***cat-9/v9.0.31/bin/apache-***cat-9.0.31.zip

jdk:https://www.oracle.com/java/technologies/javase-downloads.html

如何想使用***cat9的话,官方要求JRE的版本必须是8以上的,所以在安装之前,我们需要确认一下本机的版本,如果满足需求的话可以直接安装***cat

[root@**nage01 ~]# java -version
bash: java: 未找到命令...
文件搜索失败: Cannot update read-only repo
#系统提示没有找到命令,意味着没有安装相关软件包,所以我们要安装

[root@**nage01 ~]# rpm -ivh jdk-13.0.2_linux-x64_bin.rpm 
警告:jdk-13.0.2_linux-x64_bin.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:jdk-13.0.2-2000:13.0.2-ga ################################# [100%]
安装完成后再次查看
[root@**nage01 ~]# java -version
java version "13.0.2" 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
#java的运行环境,也叫jre
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing) 
#JVM java的虚拟机,可以使Java语言在不同平台上运行时不需要重新编译。Java语言使用Java
虚拟机**了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的字
节码就可以了,这样就可以在多种平台上不加修改地运行。很多语言都采用了这种类似的思路,
才使得他们具有可移植性,比如说python





安装***cat
我们可以看到***cat软件包的名称包含有apache字样,原因很简单,它是由apache资助的项目
[root@**nage01 ~]# unzip apache-***cat-9.0.31.zip -d /opt/
[root@**nage01 ~]# cd /opt/
[root@**nage01 opt]# mv apache-***cat-9.0.31 ***cat1
解压完成,改个名就可以使用了,因为***cat是一个二进制包,什么意思呢?就类似于我们下载
游戏的时候的硬盘版,什么是硬盘版?解压就能玩,所以这个***cat我们就压之后就可以使用了,
不需要安装。

[root@**nage01 bin]# pwd
/opt/***cat1/bin
[root@**nage01 bin]# sh startup.sh 
Cannot find ./catalina.sh
The file is absent or does not have execute permission
This file is needed to run this progr**

启动***cat
[root@**nage01 bin]# chmod +x catalina.sh 
[root@**nage01 bin]# sh startup.sh 
Using CATALINA_BASE: /opt/***cat1
Using CATALINA_HOME: /opt/***cat1
Using CATALINA_TMPDIR: /opt/***cat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/***cat1/bin/bootstrap.jar:/opt/***cat1/bin/***cat-juli.jar
Tomcat started.
[root@**nage01 webapps]# netstat -antp | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 46987/java 
tcp6 0 0 :::8080 :::* LISTEN 46987/java 

***cat的两个端口
8005 是关闭***cat使用的端口,可以使用telnet serverip 8005 然后输入大写的SHUTDOWN
关闭***cat,所以建议更改端口 或者把引号中了命令改成不容易记忆的,个人推荐改命令,因为
改端口没有告诉负责网络安全的同事就会给你**掉………

8080 连接端口

8009 AJP协议使用的端口,***cat的优势是处理jsp页面 但是对于图片,静态页面处理能力特别差,
相对于apache来说,那么这个时候怎么办 做个分流 jsp页面由***cat完成,静态的页面 图片由AJP
来完成,AJP是定向包协议 使用二进制格式来传输可读性文本,在server.xml配置文件中默认不生效

注意***cat的访问端口是8080

提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用
java -version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环
境变量设置文件
[root@**nage01 ~]# vim /root/.bash_profile 
#####java
J**A_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本
PATH=$J**A_HOME/bin:$PATH:$HOME/bin
CLASSPATH=.:$J**A_HOME/lib/tools.jar:$J**A_HOME/lib/dt.jar
e**ort PATH J**A_HOME CLASSPATH CATALINA_HOME

Windows部署***cat

***cat:https://mirrors.tuna.tsinghua.edu.cn/apache/***cat/***cat-9/v9.0.31/bin/apache-***cat-9.0.31-windows-x64.zip

jdk:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html

安装jdk11

如果使用java -version看到的还是以前的提示,重启一下系统

安装***cat

解压***cat的压缩包并进入到bin目录下

server status 查看服务器的状态,包括linux主机的信息,***cat的版本信息,资源使用情况等

**nager app 管理网站

host **nager 虚拟主机的管理

发布静态页面

目录说明

***cat主目录

bin:命令,存放不同平台上启动或关闭的脚本
BUILDING.txt&**p;RUNNING.txt:使用文档,告诉用户如何搭建
conf:各种全局配置文件,最主要的是server.xml和web.xml
CONTRIBUTING.md:捐赠
lib:***cat需要用到的库,主要是各种jar包
LICENSE:许可
logs:存放***cat的日志
NOTICE:通知信息
README.md:读我文档
RELEASE-NOTES:版本信息
temp:临时文件
webapps:***cat的web发布目录,类似于nginx或者apache的html目录
work:***cat的工作目录,存放的是jsp编译后产生的.class文件及.java文件。清空work目录,然后重启***cat,可以达到清除缓存的作用。

bin目录

bin目录下的文件主要有两类,一个是Linux使用的.sh结尾的文件,另外一个是windows使用的.bat结尾的文件,

catalina ***cat的设置脚本,也可以启动&**p;关闭***cat


[root@**nage01 bin]# sh catalina.sh help
Using CATALINA_BASE: /opt/***cat1
Using CATALINA_HOME: /opt/***cat1
Using CATALINA_TMPDIR: /opt/***cat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/***cat1/bin/bootstrap.jar:/opt/***cat1/bin/***cat-juli.jar
Usage: catalina.sh ( com**nds ... )
com**nds:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security **nager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security **nager
start Start Catalina in a separate window
start -security Start in a separate window with security **nager
stop Stop Catalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n seconds for the process to end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest Run a basic syntax check on server.xml - check exit code for result
version What version of ***cat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined
[root@**nage01 bin]# sh catalina.sh stop
[root@**nage01 bin]# sh catalina.sh help
startup 启动脚本
shutdown 关闭脚本

conf目录

这个目录下主要存放的是与***cat设置相关的文件,常用的配置文件主要包含
server.xml 可以设置端口号、设置域名或IP、默认加载的项目、请求编码
web.xml 可以设置***cat支持的文件类型
context.xml 可以用来配置数据源之类的
***cat-users.xml 用来配置管理***cat的用户与权限
Catalina 此目录下可以设置默认加载的项目

webapps目录

ROOT ***cat默认的页面
docs 使用说明文档
ex**ples 例子–***cat首页中的ex**ples按钮对应的内容
host-**nager 首页Host Manager按钮对应的内容
**nager 首页 Manager App按钮对应的内容

***cat相关配置文件简介

server.xml

元素名

属性

解释

server

port

指定一个端口,这个端口负责**关闭***cat的请求

shutdown

指定向端口发送的命令字符串

service

n**e

指定service的名字

Connector(表示客户端和service之间的连接)

port

指定服务器端要创建的端口号,并在这个断口**来自客户端的请求

minProcessors

服务器启动时创建的处理请求的线程数

**xProcessors

最大可以创建的处理请求的线程数

enableLookups

如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址

redirectPort

指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

acceptCount

指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

connectionTimeout

指定超时的时间数(以毫秒为单位)

Engine(表示指定service中的请求处理引擎,接收和处理来自Connector的请求)

defaultHost

指定缺省的处理请求的主机名,它至少与其中的一个host元素的n**e属性值是一样的

Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)

docBase

应用程序的路径或者是WAR文件存放的路径

path

表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/

reloadable

这个属性非常重要,如果为true,则***cat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起***cat的情况下改变应用程序

host(表示一个虚拟主机)

n**e

指定主机名

appBase

应用程序基本目录,即存放应用程序的目录

unpackWARs

如果为true,则***cat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

Logger(表示日志,调试和错误信息)

classN**e

指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口

prefix

指定log文件的前缀

suffix

指定log文件的后缀

timest**p

如果为true,则log文件名中要加入时间,如下例:localhost_log.004-mm-dd.txt

Realm(表示存放用户名,**及role的数据库)

classN**e

指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样)

classN**e

指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息

directory

指定log文件存放的位置

pattern

有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

web.xml

默认Web应用的首页文件的设置

报错文件的设置

session 会话过期时间的设置,单位是分钟

servlet的设置(Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有**于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。)

***cat-users.xml

管理用户配置文件

rolen**e 定义角色,不同的角色管理权限不同,相当于组

**nager-gui 允许访问html接口(即URL路径为/**nager/html/*)
**nager-script 允许访问纯文本接口(即URL路径为/**nager/text/*)
**nager-jmx 允许访问JMX代理接口(即URL路径为/**nager/jm**roxy/*)
**nager-status 允许访问Tomcat只读状态页面(即URL路径为/**nager/status/*)
admin-gui 允许访问html管理界面
admin-script 允许访问文本管理界面

user 定义用户名

usern**e 定义用户名
password 设置**
roles 属于那些角色/组

登录管理***cat

在提示登录的界面点击取消,会看到提示

[root@**nage01 ~]# vim /opt/***cat1/conf/***cat-users.xml 
<role rolen**e="**nager-gui"/>
<role rolen**e="**nager-script"/>
<role rolen**e="**nager-jmx"/>
<role rolen**e="**nager-status"/>
<role rolen**e="admin-gui"/>
<role rolen**e="admin-script"/>
<user usern**e="***cat" password="***cat" roles="**nager-gui,**nager-script,**nager-jmx,**nager-status,admin-gui,admin-script"/>

设置完成之后重启***cat就可以登录后台管理页面了,其中在**nager app中主要管理的是网站是否发布的操作,start=发布网站

stop=停止发布网站,reload=重新加载,undeploy=卸载/删除网站(慎用),e**ire session=会话过期时间

与war文件部署相关的设置,包括定义war文件存放的位置,和上传war文件

war是一个可以直接运行的web模块,通常用于网站,打包部署。以Tomcat来说,将war包放置在其\webapps\目录下,然后启动Tomcat,这个包就会自动解压,就相当于发布了。war包是Sun提出的一种web应用程序格式,与jar类似,是很多文件的压缩包。war包中的文件按照一定目录结构来组织。简单来说,war包是JavaWeb程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。一个war包可以理解为是一个web项目,里面是项目的所有东西。

configuration 定义TLS(安全传输协议)配置文件

diagnostics 检查网站在启动,重新加载或卸载时,是否造成内存溢出,这个操作会触发垃圾回收机制,生产环境中慎用

TLS connector configuration diagnostics 加密诊断,可以帮助用户诊断加密是否有问题

firefox设置中文

[root@**nage01 ~]# dnf install ibus* -y

添加完整的中文环境后重启

重启完成为浏览器添加中文后重启浏览器

再次访问***cat管理界面就会变成中文

发布静态页面

[root@**nage01 webapps]# pwd
/opt/***cat1/webapps
[root@**nage01 webapps]# mkdir test
[root@**nage01 webapps]# echo '<%= new java.util.Date() %>' > test/index.jsp

使用浏览器访问http://ip:8080/test,每次刷新时间都会改变

发布动态页面

我们知道***cat是用来发布jsp网站的,jsp的网站,页面漂亮还安全,上节课我们已经知道如何发布静态页面了,本节课我们一起来看一下如何发布动态页面,我们通过jpress一个使用java开发的建站软件来实现jsp页面

jpress下载地址:http://jpress.io/download

step1 准备jsp页面

[root@**nage01 ~]# mv jpress-v3.2.1.war jpress.war
[root@**nage01 ~]# cp jpress.war /opt/***cat1/webapps/
#重启***cat
[root@**nage01 ~]# cp jpress.war /opt/***cat1/webapps/
[root@**nage01 ~]# sh /opt/***cat1/bin/shutdown.sh 
[root@**nage01 ~]# sh /opt/***cat1/bin/startup.sh 
#重启之后***cat会自己将这个war的压缩包解压,生成一个同名的目录

step2 准备数据库

[root@**nage01 yum.repos.d]# dnf install **riadb **riadb-server -y
[root@**nage01 yum.repos.d]# systemctl restart **riadb.service 
[root@**nage01 ~]# mysql -u root -p
Enter password: 
MariaDB [(none)]> create database jpress charset utf8;
MariaDB [(none)]> grant all on jpress.* to jpress@'localhost' identified by '123456';

step3 安装jpress

***cat多实例

***cat是一个单进程多线程的软件,在很早之前,我们都认为这种模式挺好的,因为早些年的CPU都是单核的,但是现在都是多核心的CPU了,如果还是一个进程的话呢,就比较浪费CPU资源,所以本节课我们要讨论下如果多开几个***cat,也就是我们本节课要实现的是***cat的多实例,这样可以提高资源的利用率,在之前的课程中我们提到过***cat有三个端口8005 8009 8080,其中8005是用来关闭***cat的端口,8080是访问端口,8009是ajp协议使用的端口,如果我想在一台机器上开启多个***cat的话,首先要保证的就是端口不能冲突,否则开不了。

step1 将之前部署好的***cat**一份

[root@**nage01 webapps]# cd /opt/
[root@**nage01 opt]# ls
***cat1
[root@**nage01 opt]# cp -r ***cat1 ***cat2
[root@**nage01 opt]# ls
***cat1 ***cat2

step2 修改刚刚部署完成的***cat的相关配置文件

[root@**nage01 opt]# vim ***cat2/conf/server.xml 
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444" />
#修改端口

step3 启动***cat

[root@**nage01 opt]# sh /opt/***cat1/bin/startup.sh 
[root@**nage01 opt]# sh /opt/***cat2/bin/startup.sh 
[root@**nage01 opt]# netstat -atnp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Progr** n**e 
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 16801/java 
tcp6 0 0 127.0.0.1:8006 :::* 
tcp6 0 0 :::8080 :::* LISTEN 16801/java 
tcp6 0 0 :::8081 :::* LISTEN 17776/java

step4 打开浏览器访问测试

注意:如果是不同用户使用的话,考虑到安全方面的问题,记得修改***cat的用户管理文件。
[root@**nage01 conf]# pwd
/opt/***cat2/conf
[root@**nage01 conf]# vim ***cat-users.xml 
<role rolen**e="**nager-gui"/>
<role rolen**e="**nager-script"/>
<role rolen**e="**nager-jmx"/>
<role rolen**e="**nager-status"/>
<role rolen**e="admin-gui"/>
<role rolen**e="admin-script"/>
<user usern**e="***cat" password="***cat" roles="**nager-gui,**nager-script,**nager-jmx,**nager-status,admin-gui,admin-script"/>

nginx+***cat

之前我们在访问的时候使用的都是类似http://serverip/test或者http://serverip/jpress这种字样的URL,使用起来比较麻烦,所以呢,我们可以将***cat和nginx结合在一起

step1 调整***cat1

[root@**nage01 ~]# cd /opt/***cat1/webapps/
[root@**nage01 webapps]# mv ROOT ***cat
[root@**nage01 webapps]# mv jpress ROOT

step2 调整***cat2

[root@**nage01 ~]# cd /opt/***cat2/webapps/
[root@**nage01 webapps]# mv ROOT ***cat
[root@**nage01 webapps]# mv test ROOT

使用rewrite实现

step1 部署nginx

[root@**nage01 ~]# dnf install nginx -y

step2 调整nginx配置文件

[root@**nage01 ~]# vim /etc/nginx/nginx.conf
[root@**nage01 ~]# sed -i '/#/d' /etc/nginx/nginx.conf
[root@**nage01 ~]# sed -i '/^$/d' /etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_n**e www.a.com;
location / {
rewrite ^/$ http://127.0.0.1:8080/jpress break;
}
}
server {
listen 80;
listen [::]:80;127.0.0.1
server_n**e www.b.com;
location / {
rewrite ^/$ http://127.0.0.1:8081/test break;
}
}
[root@**nage01 ~]# systemctl restart nginx

step 3 修改测试机的hosts文件

[root@**nage01 conf]# vim /etc/hosts
192.168.98.200 www.a.com
192.168.98.200 www.b.com

step4 打开浏览器直接访问域名测试

使用反向代理实现

调整nginx配置文件

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_for**t **in '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log **in;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_**x_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stre**;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_n**e www.a.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
listen [::]:80;
server_n**e www.b.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
}

***cat调优

***cat的优化可以提高网站的并发能力,体现个人的价值,***cat在java项目中的使用率非常高,所以在生产环境对***cat的优化也就变得非常必要了,一般情况下***cat的优化主要从两个方面入手,一个是自身配置,另一个是***cat所运行的jvm虚拟机的优化,优化的工作可以从安装完***cat就开始着手

AJP优化

在前面的课程中我们提到了一个叫AJP的协议,同时我们也知道了这个AJP的作用,但是在生产环境中一般使用的是nginx+***cat的架构,所以大多数时候用不到AJP协议,所以我们可以禁用它,而在我们的server.xml文件中这个AJP默认就是禁用的,如果是其它版本最好看一下

[root@**nage01 conf]# vim /opt/***cat1/conf/server.xml 
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
###

运行模式优化

***cat的运行模式有3种:

bio

性能非常低下,没有经过任何优化处理和支持,适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

nio

nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式它拥有比传统I/O操作(bio)更好的并发运行性能。Tomcat9默认使用nio运行模式。适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂。AIO(NIO2)使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

apr

安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能

进入***cat的服务器状态页面查看默认的模式

如果默认使用的是bio模式

设置使用nio模式
[root@**nage01 logs]# vim /opt/***cat1/conf/server.xml
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"
redirectPort="8443" />

apr

APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。可以大大地提高Tomcat对静态文件的处理性能。 也是在Tomcat上运行高并发应用的首选模式。

系统自带的软件包不是最新的,且缺少相关软件包,所以我们选择源码包安装

所需软件包

apr-1.7.0.tar.gz 主程序包 包含了通用开发组件

apr-iconv-1.2.2.tar.gz 用于实现iconv编码

apr-util-1.6.1.tar.gz 额外的开发组件

***cat-native.tar.gz 关联***cat和apr的组件

arp相关软件包下载
https://mirrors.cnnic.cn/apache/apr/

***cat-native在***cat安装目录的bin下

部署apr环境

step1 环境准备

[root@**nage01 ~]# dnf install -y apr-devel openssl-devel gcc **ke e**at-devel libtool

step2 安装apr主程序包

[root@**nage01 ~]# tar fx apr-1.7.0.tar.gz 
[root@**nage01 ~]# cd apr-1.7.0/
[root@**nage01 ~]# ./configure --prefix=/usr/local/apr
[root@**nage01 apr-1.7.0]# **ke -j4 &**p;&**p; **ke install

step3 安装apr-iconv

[root@**nage01 ~]# tar fx apr-iconv-1.2.2.tar.gz 
[root@**nage01 ~]# cd apr-iconv-1.2.2/
[root@**nage01 ~]# ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv
[root@**nage01 apr-iconv-1.2.2]# **ke -j4 &**p;&**p; **ke install

step4 安装apr-util

[root@**nage01 ~]# tar fx apr-util-1.6.1.tar.gz 
[root@**nage01 ~]# cd apr-util-1.6.1/
[root@**nage01 ~]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
[root@**nage01 apr-util-1.6.1]# **ke -j4 &**p;&**p; **ke install

step5 安装***cat-native

[root@**nage01 ~]# cd /opt/***cat1/bin/
[root@**nage01 bin]# tar fx ***cat-native.tar.gz 
[root@**nage01 bin]# cd ***cat-native-1.2.23-src/native
[root@**nage01 ***cat-native-1.2.23-src]# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk-13.0.2
[root@**nage01 ***cat-native-1.2.23-src]# **ke -j4 &**p;&**p; **ke install

step5 修改并加载环境变量

[root@**nage01 ~]# echo 'e**ort LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
e**ort LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /etc/profile
[root@**nage01 ~]# source /etc/profile

step6 修改***cat配置文件

[root@**nage01 ~]# vim /opt/***cat1/conf/server.xml 
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />

step7 测试

#为了避免干扰先执行关闭
[root@**nage01 ~]# sh /opt/***cat1/bin/shutdown.sh 
#测试
[root@**nage01 ~]# sh /opt/***cat1/bin/catalina.sh run
#如果没有问题可以看到
14-Mar-2020 00:22:23.894 信息 [**in] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-apr-8080"]

注意:如果非root用户启动失败,把apr环境变量在当前用户的.bash_profile中写一份
[root@**nage01 ~]# echo 'e**ort LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
e**ort LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /root/.bash_profile
[root@**nage01 ~]# source /root/.bash_profile

其它优化参数

[root@**nage01 logs]# vim /opt/***cat1/conf/server.xml 
<Connector port="8080" protocol="HTTP/1.1 enableLookups="false" **xThreads="1000" minSpareThreads="100" acceptCount="900" disableUploadTimeout="true" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443"
compression="on" compressionMinSize="1024" useSendfile="false" noCompressionUserAgents="mozilla, traviata" compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript " />
**xThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不**
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressibleMimeType :压缩的文件类型
官方参数文档:http://***cat.apache.org/***cat-9.0-doc/config/http.html

压力测试工具的使用

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能

JMeter的作用

能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC)。

完全的可移植性和100% 纯java。

完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。

精心的GUI设计允许快速操作和更精确的计时。

缓存和离线分析/回放测试结果。

下载地址:
http://jmeter.apache.org/download_jmeter.cgi

JMeter安装使用

将下载好的压缩包在windows中解压(需要先安装JDK),解压后进入到bin目录双击jmeter.bat,等待启动

设置中文

创建测试

添加线程组,使用线程模拟用户的并发

1000个线程循环10次,***cat会收到10000个请求

添加并设置http请求

添加监控

启动测试

查看结果

标签:说明是请求类型,如Http,FTP等请求。
样本总数:也就是图形报表中的样本数目,总共发送到服务器的样本数目。
平均值:也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。
居中的数值:也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
90%&**p;95%&**p;99%:有多少请求的响应时间比给出的数值还要小。
最小:是代表时间的数字,是服务器响应的最短时间。
最大: 是代表时间的数字,是服务器响应的最长时间。
异常%:请求的错误百分比。
吞吐量:也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。
发送/接收KB/sec:是每秒钟发送/接收的字节数。

(时间的单位为ms)

通过上面测试可以看出,***cat在不做任何调整时,吞吐量为587次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为587次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性

调整***cat线程池

[root@**nage01 bin]# vim /opt/***cat1/conf/server.xml 
<Connector port="8080" protocol="HTTP/1.1" **xThreads="1000" 
minSpareThreads="200" prestartminSpareThreads="true" connectionTimeout="20000" 
redirectPort="8443" />
#调整最大线程数为1000,最小为200,这个线程的数量要反复调整,然后对比测试结果,找出一个适合
自己的值

调整队列

[root@**nage01 bin]# vim /opt/***cat1/conf/server.xml 
<Connector port="8080" protocol="HTTP/1.1" **xThreads="1000" 
minSpareThreads="200" prestartminSpareThreads="true" **xQueueSize="100" 
connectionTimeout="20000" redirectPort="8443" />
默认情况下,请求发送到***cat,如果***cat正忙,那么该请求会一直等待。这样虽然可以保证每个
请求都能请求到,但是请求时间就会边长。有些时候,我们也不一定要求请求一定等待,可以设置最大
等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的是
12306。

3分钟了解计算机发展历史-组团学12306。

参数介绍可以去官网查看:
https://***cat.apache.org/***cat-9.0-doc/config/executor.html

章总结

***cat的安装部署

***cat的相关文件介绍

***cat的管理

静态页面和动态页面的发布

如何实现***cat多实例

如何将***cat和nginx整合

***cat的调优及压力测试工具的使用

重点:***cat如何安装、相关目录的作用、如何使用***cat发布网站,后台管理功能的使用,多实例的实现,如何与nginx整合,***cat的调优及压力测试工具的使用

难点:不同操作系统的安装,相关文件的作用,使用***cat发布页面,与nginx的整合方法,调优的方式及压力测试工具

今天东西超级多,我看有几个能从头到尾看完的,哈哈哈哈哈

常见问题
原文链接:https://www.yuanmawu.net/56351.html,转载请注明出处。
0

评论0

请先

显示验证码
没有账号?注册  忘记密码?