tomcat安装和使用(tomcat安装与使用)
本章我们来学习一下另外的一种web服务tomcat,这是一个支持JSP页面的web服务,很多开发方向的IT人员,包括运维开发方向的同仁,都会选择使用tomcat
知识点什么是tomcat
CentOS8中如何部署tomcat
windows系统中如何部署tomcat
Tomcat的相关目录和文件的作用
tomcat的管理界面如何使用
如何使用tomcat发布静态页面
tomcat动态页面的实现
tomcat多实例的实现
让nginx和tomcat协同工作
tomcat的运行模式
tomcat运行模式的调整
额外的优化参数
压力测试工具的使用
课程目标能够知道什么是tomcat
能够在不同的系统上部署tomcat
能够记住tomcat的常用目录和文件
能够知道如何管理tomcat
能够在tomcat上部署静态网站和动态网站
能够将nginx和tomcat整合并实现多实例
能够对tomcat进行简单的调优
能够使用压力测试工具
Tomcat介绍
Apache Tomcat最早是由Sun开发的,在1999年被捐献给ASF(Apache 软件基金会 Apache Software Foundation),隶属于Jakarta(雅加达)项目,现在已经独立为一个顶级项目。因为Tomcat 技术先进、性能稳定,同时也是一个免费的开放源代码的Web 应用服务器,因而深受JAVA 爱好者的喜爱并得到了部分软件开发商的认可,被很多企业普遍使用,也是开发和调试JSP程序的首选。成为目前比较流行的Web 应用服务器。
官方网站:http://tomcat.apache.org/
tomcat的同类产品- Resin 服务器
Resin是Caucho公司的产品,速度非常快。可以显示动态内容,也可以显示静态内容,但是用户数量少,参考文档也少,使用起来不太方便,一旦涉及到相关文件和内容的更新,系统会自动重新部署并重启。
- Jetty 服务器
Jetty是一个纯粹的基于Java的web服务器,也是一个开源项目。架构简单,速度快,修改简单,但是对Java的支持不如tomcat全面,
- WebLogic 服务器
WebLogic 是BEA公司的产品,可进一步细分为 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特别强大。WebLogic 支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供Java平台所拥有的一切应用服务器的用户来说,WebLogic是一个十分理想的选择。但是不开源且收费
JBoss、WebSphere
Apache nginx tomcat比较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部署tomcat下载软件包
tomcat:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31.zip
jdk:https://www.oracle.com/java/technologies/javase-downloads.html
如何想使用tomcat9的话,官方要求JRE的版本必须是8以上的,所以在安装之前,我们需要确认一下本机的版本,如果满足需求的话可以直接安装tomcat
[root@manage01 ~]# java -version
bash: java: 未找到命令...
文件搜索失败: Cannot update read-only repo
#系统提示没有找到命令,意味着没有安装相关软件包,所以我们要安装
[root@manage01 ~]# 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@manage01 ~]# 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
安装tomcat
我们可以看到tomcat软件包的名称包含有apache字样,原因很简单,它是由apache资助的项目
[root@manage01 ~]# unzip apache-tomcat-9.0.31.zip -d /opt/
[root@manage01 ~]# cd /opt/
[root@manage01 opt]# mv apache-tomcat-9.0.31 tomcat1
解压完成,改个名就可以使用了,因为tomcat是一个二进制包,什么意思呢?就类似于我们下载
游戏的时候的硬盘版,什么是硬盘版?解压就能玩,所以这个tomcat我们就压之后就可以使用了,
不需要安装。
[root@manage01 bin]# pwd
/opt/tomcat1/bin
[root@manage01 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 program
启动tomcat
[root@manage01 bin]# chmod x catalina.sh
[root@manage01 bin]# sh startup.sh
Using CATALINA_BASE: /opt/tomcat1
Using CATALINA_HOME: /opt/tomcat1
Using CATALINA_TMPDIR: /opt/tomcat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@manage01 webapps]# netstat -antp | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 46987/java
tcp6 0 0 :::8080 :::* LISTEN 46987/java
tomcat的两个端口
8005 是关闭tomcat使用的端口,可以使用telnet serverip 8005 然后输入大写的SHUTDOWN
关闭tomcat,所以建议更改端口 或者把引号中了命令改成不容易记忆的,个人推荐改命令,因为
改端口没有告诉负责网络安全的同事就会给你屏蔽掉………
8080 连接端口
8009 AJP协议使用的端口,tomcat的优势是处理jsp页面 但是对于图片,静态页面处理能力特别差,
相对于apache来说,那么这个时候怎么办 做个分流 jsp页面由tomcat完成,静态的页面 图片由AJP
来完成,AJP是定向包协议 使用二进制格式来传输可读性文本,在server.xml配置文件中默认不生效
注意tomcat的访问端口是8080
提示:如果之前系统中安装过java环境的话,可能会出现即便安装完成新的jdk之后,使用
java -version命令所查询的结果依然是老版本的,这个问题是由于环境变量引起的,所以需要修改环
境变量设置文件
[root@manage01 ~]# vim /root/.bash_profile
#####java
JAVA_HOME=/usr/java/jdk-13.0.2#对应自己安装的版本
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH JAVA_HOME CLASSPATH CATALINA_HOME
tomcat:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.31/bin/apache-tomcat-9.0.31-windows-x64.zip
jdk:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
安装jdk11
如果使用java -version看到的还是以前的提示,重启一下系统
安装tomcat
解压tomcat的压缩包并进入到bin目录下
server status 查看服务器的状态,包括linux主机的信息,tomcat的版本信息,资源使用情况等
manager app 管理网站
host manager 虚拟主机的管理
发布静态页面目录说明tomcat主目录
bin:命令,存放不同平台上启动或关闭的脚本BUILDING.txt&RUNNING.txt:使用文档,告诉用户如何搭建conf:各种全局配置文件,最主要的是server.xml和web.xml CONTRIBUTING.md:捐赠lib:tomcat需要用到的库,主要是各种jar包LICENSE:许可logs:存放tomcat的日志NOTICE:通知信息README.md:读我文档RELEASE-NOTES:版本信息temp:临时文件 webapps:tomcat的web发布目录,类似于nginx或者apache的html目录 work:tomcat的工作目录,存放的是jsp编译后产生的.class文件及.java文件。清空work目录,然后重启tomcat,可以达到清除缓存的作用。
bin目录
bin目录下的文件主要有两类,一个是Linux使用的.sh结尾的文件,另外一个是windows使用的.bat结尾的文件,
catalina tomcat的设置脚本,也可以启动&关闭tomcat
[root@manage01 bin]# sh catalina.sh help
Using CATALINA_BASE: /opt/tomcat1
Using CATALINA_HOME: /opt/tomcat1
Using CATALINA_TMPDIR: /opt/tomcat1/temp
Using JRE_HOME: /usr
Using CLASSPATH: /opt/tomcat1/bin/bootstrap.jar:/opt/tomcat1/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
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 tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined
[root@manage01 bin]# sh catalina.sh stop
[root@manage01 bin]# sh catalina.sh help
startup 启动脚本
shutdown 关闭脚本
conf目录
这个目录下主要存放的是与tomcat设置相关的文件,常用的配置文件主要包含server.xml 可以设置端口号、设置域名或IP、默认加载的项目、请求编码 web.xml 可以设置tomcat支持的文件类型 context.xml 可以用来配置数据源之类的 tomcat-users.xml 用来配置管理tomcat的用户与权限 Catalina 此目录下可以设置默认加载的项目
webapps目录
ROOT tomcat默认的页面docs 使用说明文档examples 例子--tomcat首页中的examples按钮对应的内容host-manager 首页Host Manager按钮对应的内容manager 首页 Manager App按钮对应的内容
tomcat相关配置文件简介server.xml
元素名 |
属性 |
解释 |
server |
port |
指定一个端口,这个端口负责监听关闭tomcat的请求 |
shutdown |
指定向端口发送的命令字符串 | |
service |
name |
指定service的名字 |
Connector(表示客户端和service之间的连接) |
port |
指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 |
minProcessors |
服务器启动时创建的处理请求的线程数 | |
maxProcessors |
最大可以创建的处理请求的线程数 | |
enableLookups |
如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 | |
redirectPort |
指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 | |
acceptCount |
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 | |
connectionTimeout |
指定超时的时间数(以毫秒为单位) | |
Engine(表示指定service中的请求处理引擎,接收和处理来自Connector的请求) |
defaultHost |
指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的 |
Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范) |
docBase |
应用程序的路径或者是WAR文件存放的路径 |
path |
表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/ | |
reloadable |
这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序 | |
host(表示一个虚拟主机) |
name |
指定主机名 |
appBase |
应用程序基本目录,即存放应用程序的目录 | |
unpackWARs |
如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 | |
Logger(表示日志,调试和错误信息) |
className |
指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 |
prefix |
指定log文件的前缀 | |
suffix |
指定log文件的后缀 | |
timestamp |
如果为true,则log文件名中要加入时间,如下例:localhost_log.004-mm-dd.txt | |
Realm(表示存放用户名,密码及role的数据库) |
className |
指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 |
Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样) |
className |
指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 |
directory |
指定log文件存放的位置 | |
pattern |
有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多 |
web.xml
默认Web应用的首页文件的设置
报错文件的设置
session 会话过期时间的设置,单位是分钟
servlet的设置(Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。)
tomcat-users.xml
管理用户配置文件
rolename 定义角色,不同的角色管理权限不同,相当于组
manager-gui 允许访问html接口(即URL路径为/manager/html/*)manager-script 允许访问纯文本接口(即URL路径为/manager/text/*)manager-JMX 允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)manager-status 允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)admin-gui 允许访问html管理界面admin-script 允许访问文本管理界面
user 定义用户名
username 定义用户名password 设置密码roles 属于那些角色/组
登录管理tomcat
在提示登录的界面点击取消,会看到提示
[root@manage01 ~]# vim /opt/tomcat1/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
设置完成之后重启tomcat就可以登录后台管理页面了,其中在manager app中主要管理的是网站是否发布的操作,start=发布网站
stop=停止发布网站,reload=重新加载,undeploy=卸载/删除网站(慎用),expire 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@manage01 ~]# dnf install ibus* -y
添加完整的中文环境后重启
重启完成为浏览器添加中文后重启浏览器
再次访问tomcat管理界面就会变成中文
发布静态页面
[root@manage01 webapps]# pwd
/opt/tomcat1/webapps
[root@manage01 webapps]# mkdir test
[root@manage01 webapps]# echo '<%= new java.util.Date() %>' > test/index.jsp
使用浏览器访问http://ip:8080/test,每次刷新时间都会改变
发布动态页面我们知道tomcat是用来发布jsp网站的,jsp的网站,页面漂亮还安全,上节课我们已经知道如何发布静态页面了,本节课我们一起来看一下如何发布动态页面,我们通过jpress一个使用java开发的建站软件来实现jsp页面
jpress下载地址:http://jpress.io/download
step1 准备jsp页面
[root@manage01 ~]# mv jpress-v3.2.1.war jpress.war
[root@manage01 ~]# cp jpress.war /opt/tomcat1/webapps/
#重启tomcat
[root@manage01 ~]# cp jpress.war /opt/tomcat1/webapps/
[root@manage01 ~]# sh /opt/tomcat1/bin/shutdown.sh
[root@manage01 ~]# sh /opt/tomcat1/bin/startup.sh
#重启之后tomcat会自己将这个war的压缩包解压,生成一个同名的目录
step2 准备数据库
[root@manage01 yum.repos.d]# dnf install mariadb mariadb-server -y
[root@manage01 yum.repos.d]# systemctl restart mariadb.service
[root@manage01 ~]# 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
tomcat多实例
tomcat是一个单进程多线程的软件,在很早之前,我们都认为这种模式挺好的,因为早些年的CPU都是单核的,但是现在都是多核心的CPU了,如果还是一个进程的话呢,就比较浪费CPU资源,所以本节课我们要讨论下如果多开几个tomcat,也就是我们本节课要实现的是tomcat的多实例,这样可以提高资源的利用率,在之前的课程中我们提到过tomcat有三个端口8005 8009 8080,其中8005是用来关闭tomcat的端口,8080是访问端口,8009是ajp协议使用的端口,如果我想在一台机器上开启多个tomcat的话,首先要保证的就是端口不能冲突,否则开不了。
step1 将之前部署好的tomcat复制一份
[root@manage01 webapps]# cd /opt/
[root@manage01 opt]# ls
tomcat1
[root@manage01 opt]# cp -r tomcat1 tomcat2
[root@manage01 opt]# ls
tomcat1 tomcat2
step2 修改刚刚部署完成的tomcat的相关配置文件
[root@manage01 opt]# vim tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8444" />
#修改端口
step3 启动tomcat
[root@manage01 opt]# sh /opt/tomcat1/bin/startup.sh
[root@manage01 opt]# sh /opt/tomcat2/bin/startup.sh
[root@manage01 opt]# netstat -atnp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
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 打开浏览器访问测试
注意:如果是不同用户使用的话,考虑到安全方面的问题,记得修改tomcat的用户管理文件。
[root@manage01 conf]# pwd
/opt/tomcat2/conf
[root@manage01 conf]# vim tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
之前我们在访问的时候使用的都是类似http://serverip/test或者http://serverip/jpress这种字样的URL,使用起来比较麻烦,所以呢,我们可以将tomcat和nginx结合在一起
step1 调整tomcat1
[root@manage01 ~]# cd /opt/tomcat1/webapps/
[root@manage01 webapps]# mv ROOT tomcat
[root@manage01 webapps]# mv jpress ROOT
step2 调整tomcat2
[root@manage01 ~]# cd /opt/tomcat2/webapps/
[root@manage01 webapps]# mv ROOT tomcat
[root@manage01 webapps]# mv test ROOT
step1 部署nginx
[root@manage01 ~]# dnf install nginx -y
step2 调整nginx配置文件
[root@manage01 ~]# vim /etc/nginx/nginx.conf
[root@manage01 ~]# sed -i '/#/d' /etc/nginx/nginx.conf
[root@manage01 ~]# sed -i '/^$/d' /etc/nginx/nginx.conf
server {
listen 80;
listen [::]:80;
server_name www.a.com;
location / {
rewrite ^/$ http://127.0.0.1:8080/jpress break;
}
}
server {
listen 80;
listen [::]:80;127.0.0.1
server_name www.b.com;
location / {
rewrite ^/$ http://127.0.0.1:8081/test break;
}
}
[root@manage01 ~]# systemctl restart nginx
step 3 修改测试机的hosts文件
[root@manage01 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_format main '$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 main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
listen [::]:80;
server_name www.a.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
listen [::]:80;
server_name www.b.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
}
tomcat的优化可以提高网站的并发能力,体现个人的价值,tomcat在java项目中的使用率非常高,所以在生产环境对tomcat的优化也就变得非常必要了,一般情况下tomcat的优化主要从两个方面入手,一个是自身配置,另一个是tomcat所运行的jvm虚拟机的优化,优化的工作可以从安装完tomcat就开始着手
AJP优化在前面的课程中我们提到了一个叫AJP的协议,同时我们也知道了这个AJP的作用,但是在生产环境中一般使用的是nginx tomcat的架构,所以大多数时候用不到AJP协议,所以我们可以禁用它,而在我们的server.xml文件中这个AJP默认就是禁用的,如果是其它版本最好看一下
[root@manage01 conf]# vim /opt/tomcat1/conf/server.xml
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
###
tomcat的运行模式有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问题,大幅度的提高性能
进入tomcat的服务器状态页面查看默认的模式
如果默认使用的是bio模式
设置使用nio模式
[root@manage01 logs]# vim /opt/tomcat1/conf/server.xml
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"
redirectPort="8443" />
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 额外的开发组件
tomcat-native.tar.gz 关联tomcat和apr的组件
arp相关软件包下载 https://mirrors.cnnic.cn/apache/apr/
tomcat-native在tomcat安装目录的bin下
部署apr环境
step1 环境准备
[root@manage01 ~]# dnf install -y apr-devel openssl-devel gcc make expat-devel libtool
step2 安装apr主程序包
[root@manage01 ~]# tar fx apr-1.7.0.tar.gz
[root@manage01 ~]# cd apr-1.7.0/
[root@manage01 ~]# ./configure --prefix=/usr/local/apr
[root@manage01 apr-1.7.0]# make -j4 && make install
step3 安装apr-iconv
[root@manage01 ~]# tar fx apr-iconv-1.2.2.tar.gz
[root@manage01 ~]# cd apr-iconv-1.2.2/
[root@manage01 ~]# ./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv
[root@manage01 apr-iconv-1.2.2]# make -j4 && make install
step4 安装apr-util
[root@manage01 ~]# tar fx apr-util-1.6.1.tar.gz
[root@manage01 ~]# cd apr-util-1.6.1/
[root@manage01 ~]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
[root@manage01 apr-util-1.6.1]# make -j4 && make install
step5 安装tomcat-native
[root@manage01 ~]# cd /opt/tomcat1/bin/
[root@manage01 bin]# tar fx tomcat-native.tar.gz
[root@manage01 bin]# cd tomcat-native-1.2.23-src/native
[root@manage01 tomcat-native-1.2.23-src]# ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk-13.0.2
[root@manage01 tomcat-native-1.2.23-src]# make -j4 && make install
step5 修改并加载环境变量
[root@manage01 ~]# echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /etc/profile
[root@manage01 ~]# source /etc/profile
step6 修改tomcat配置文件
[root@manage01 ~]# vim /opt/tomcat1/conf/server.xml
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
step7 测试
#为了避免干扰先执行关闭
[root@manage01 ~]# sh /opt/tomcat1/bin/shutdown.sh
#测试
[root@manage01 ~]# sh /opt/tomcat1/bin/catalina.sh run
#如果没有问题可以看到
14-Mar-2020 00:22:23.894 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-apr-8080"]
注意:如果非root用户启动失败,把apr环境变量在当前用户的.bash_profile中写一份
[root@manage01 ~]# echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /root/.bash_profile
[root@manage01 ~]# source /root/.bash_profile
[root@manage01 logs]# vim /opt/tomcat1/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1 enableLookups="false" maxThreads="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 " />
maxThreads:最大线程数,默认150。增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressibleMimeType :压缩的文件类型
官方参数文档:http://tomcat.apache.org/tomcat-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次,tomcat会收到10000个请求
添加并设置http请求
添加监控
启动测试
查看结果
标签:说明是请求类型,如Http,FTP等请求。样本总数:也就是图形报表中的样本数目,总共发送到服务器的样本数目。平均值:也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。居中的数值:也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。90%&95%&99%:有多少请求的响应时间比给出的数值还要小。最小:是代表时间的数字,是服务器响应的最短时间。最大: 是代表时间的数字,是服务器响应的最长时间。异常%:请求的错误百分比。吞吐量:也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。发送/接收KB/sec:是每秒钟发送/接收的字节数。
(时间的单位为ms)
通过上面测试可以看出,tomcat在不做任何调整时,吞吐量为587次/秒。这个吞吐量跟接口的业务逻辑关系很大,如果业务逻辑复杂,需要比较长时间计算的,可能吞吐量只有几十次/秒,我这里测试的时候没有添加任务业务逻辑,才会出现吞吐量为587次/秒的情况。这里的吞吐量最好是经过多次测试取平均值,因为单次测试具有一定的随机性
调整tomcat线程池
[root@manage01 bin]# vim /opt/tomcat1/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000"
minSpareThreads="200" prestartminSpareThreads="true" connectionTimeout="20000"
redirectPort="8443" />
#调整最大线程数为1000,最小为200,这个线程的数量要反复调整,然后对比测试结果,找出一个适合
自己的值
调整队列
[root@manage01 bin]# vim /opt/tomcat1/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" maxThreads="1000"
minSpareThreads="200" prestartminSpareThreads="true" maxQueueSize="100"
connectionTimeout="20000" redirectPort="8443" />
默认情况下,请求发送到tomcat,如果tomcat正忙,那么该请求会一直等待。这样虽然可以保证每个
请求都能请求到,但是请求时间就会边长。有些时候,我们也不一定要求请求一定等待,可以设置最大
等待队列大小,如果超过就不等待了。这样虽然有些请求是失败的,但是请求时间会虽短。典型的是
12306。
3分钟了解计算机发展历史-组团学12306。
参数介绍可以去官网查看:https://tomcat.apache.org/tomcat-9.0-doc/config/executor.html
章总结tomcat的安装部署
tomcat的相关文件介绍
tomcat的管理
静态页面和动态页面的发布
如何实现tomcat多实例
如何将tomcat和nginx整合
tomcat的调优及压力测试工具的使用
重点:tomcat如何安装、相关目录的作用、如何使用tomcat发布网站,后台管理功能的使用,多实例的实现,如何与nginx整合,tomcat的调优及压力测试工具的使用
难点:不同操作系统的安装,相关文件的作用,使用tomcat发布页面,与nginx的整合方法,调优的方式及压力测试工具
今天东西超级多,我看有几个能从头到尾看完的,哈哈哈哈哈
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com