本章我们来学习一下另外的一种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进行简单的调优
能够使用压力测试工具
Apache Tomcat最早是由Sun开发的,在1999年被捐献给ASF(Apache 软件基金会 Apache Software Foundation),隶属于Jakarta(雅加达)项目,现在已经独立为一个顶级项目。因为Tomcat 技术先进、性能稳定,同时也是一个免费的开放源代码的Web 应用服务器,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,被很多企业普遍使用,也是开发和调试JSP程序的首选。成为目前比较流行的Web 应用服务器。
官方网站:http://tomcat.apache.org/
Resin是Caucho公司的产品,速度非常快。可以显示动态内容,也可以显示静态内容,但是用户数量少,参考文档也少,使用起来不太方便,一旦涉及到相关文件和内容的更新,系统会自动重新部署并重启。
Jetty是一个纯粹的基于Java的web服务器,也是一个开源项目。架构简单,速度快,修改简单,但是对java的支持不如tomcat全面,
WebLogic 是BEA公司的产品,可进一步细分为 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特别强大。WebLogic 支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。对于那些正在寻求能够提供Java平台所拥有的一切应用服务器的用户来说,WebLogic是一个十分理想的选择。但是不开源且收费
JBoss、WebSphere
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 上)。
下载软件包
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按钮对应的内容
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 属于那些角色/组
在提示登录的界面点击取消,会看到提示
[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 加密诊断,可以帮助用户诊断加密是否有问题
[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是一个单进程多线程的软件,在很早之前,我们都认为这种模式挺好的,因为早些年的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的作用,但是在生产环境中一般使用的是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的整合方法,调优的方式及压力测试工具
今天东西超级多,我看有几个能从头到尾看完的,哈哈哈哈哈
上面的章节中我们看到了JavaScript的对象模型是基于原型实现的,特点是简单,缺点是理解起来比传统的类-实例模型要困难,最大的缺点是继承的实现需要编写大量代码,并且需要正确实现原型链。
有没有更简单的写法?有!
新的关键字class从ES6开始正式被引入到JavaScript中。class的目的就是让定义类更简单。
我们先回顾用函数实现Student的方法:
function Student(name) { this.name=name; } Student.prototype.hello=function () { alert('Hello, ' + this.name + '!'); }
如果用新的class关键字来编写Student,可以这样写:
class Student { constructor(name) { this.name=name; } hello() { alert('Hello, ' + this.name + '!'); } }
比较一下就可以发现,class的定义包含了构造函数constructor和定义在原型对象上的函数hello()(注意没有function关键字),这样就避免了Student.prototype.hello=function () {...}这样分散的代码。
最后,创建一个Student对象代码和前面章节完全一样:
var xiaoming=new Student('小明'); xiaoming.hello();
用class定义对象的另一个巨大的好处是继承更方便了。想一想我们从Student派生一个PrimaryStudent需要编写的代码量。现在,原型继承的中间对象,原型对象的构造函数等等都不需要考虑了,直接通过extends来实现:
class PrimaryStudent extends Student { constructor(name, grade) { super(name); // 记得用super调用父类的构造方法! this.grade=grade; } myGrade() { alert('I am at grade ' + this.grade); } }
注意PrimaryStudent的定义也是class关键字实现的,而extends则表示原型链对象来自Student。子类的构造函数可能会与父类不太相同,例如,PrimaryStudent需要name和grade两个参数,并且需要通过super(name)来调用父类的构造函数,否则父类的name属性无法正常初始化。
PrimaryStudent已经自动获得了父类Student的hello方法,我们又在子类中定义了新的myGrade方法。
ES6引入的class和原有的JavaScript原型继承有什么区别呢?实际上它们没有任何区别,class的作用就是让JavaScript引擎去实现原来需要我们自己编写的原型链代码。简而言之,用class的好处就是极大地简化了原型链代码。
你一定会问,class这么好用,能不能现在就用上?
现在用还早了点,因为不是所有的主流浏览器都支持ES6的class。如果一定要现在就用上,就需要一个工具把class代码转换为传统的prototype代码,可以试试Babel这个工具。
需要浏览器支持ES6的class,如果遇到SyntaxError,则说明浏览器不支持class语法,请换一个最新的浏览器试试。
、WEBUI自动化背景
因为web页面经常会变化,所以UI自动化测试的维护成本很高。不如接口的适用面广,所以大部分公司会做接口自动化测试,但是未必会做UI自动化测试;
UI自动化测试要做也是覆盖冒烟测试,不会到很高的覆盖率:
接口自动化测试框架覆盖率:90%+,能做回归测试。
UI自动化测试框架覆盖率【用例】:30%-40%,能做冒烟测试【正常用例】,覆盖核心功能的页面配置,减少重复的页面操作。
二、自动化工具selenium
【其他框架:cypress,RobotFramework,playwright-- 录播课程】
Selenium是用于Web应用自动化测试的工具,开源并且免费
支持Chrome、FireFox、Edge、IE、Safari等主流浏览器 【Chrome支持的最好 最稳定 推荐】
支持Java、Python、Net、Perl等编程语言进行自动化测试脚本编写
官网地址:https://selenium.dev/
三、selenium工具家族
selenium ide : 录制工具。谷歌和火狐的插件。用途:录制回放bug的过程。不推荐用,录制基本都需要再修改;30分钟就学会了。
Firefox可以下载插件,并录制回放;可以导入成为代码脚本,也很方便。
但是这个录制的功能不够灵活,比如需要做一些判断,循环控制等复杂的业务场景自动化,稳定性不太好。
selenium webdriver : 核心,重点学习的,提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序
结合代码(PythonJava,C#,JavaScript、Perl、PHP,Ruby)一起来完成自动化。
提供了非常多的浏览器网页操作的接口【api】
selenium grid :分布式测试,通过Selenium Grid可以将自动化测试脚本分发到不同的测试机器中执行;用例分布不同的设备上运行,提高运行效率。
四、Selenium安装
1、pip install selenium==4.3.0,最好指定版本安装,因为不同的版本可能会有一些兼容性的问题。
注意:检查一下你电脑的urllib3的版本,pip show urllib3 ,如果是2.x 以上的版本,会有兼容性问题。pip uninstall urllib3 ,pip install urllib3==1.26.15 【执行版本安装】
2、下载浏览器驱动:注意 驱动程序要与浏览器的类型和版本匹配。
驱动程序放在了Python的安装目录下:selenium会自动从path环境变量中去找这个驱动文件;如果驱动不在Python安装目录 就需要加参数初始化。
浏览器安装文件及对应的驱动如下图(点击图片看大图):
3、装好浏览器,正确安装。最好在默认的路径下。一定要记得关闭自动更新。
特别注意:chrome浏览器关闭自动更新:
火狐浏览器关闭自动更新:
一旦浏览器自动升级了,原来的驱动就会不能用了,所以一定要记得关闭这个自动更新!
五、quit和close的区别
driver.close():关闭当前正在使用的窗口。
1、如果你的当前浏览器窗口只有一个情况下,它就会关闭窗口并且关闭浏览器
2、如果你的当前浏览器窗口有多个的情况下,它就会关闭driver驱动焦点所在的窗口
driver.quit():真正关闭浏览器(把所有的窗口都关闭,并且退出浏览器,关闭驱动程序)
进阶的用法:
(1)获取页面的url地址
(2)获取页面的标题
(3)获取页面源码
六、元素定位方法
并不是所有的页面内容都有直接对应的方法进行操作的,更多的内容操作需要使用特定方法进行元素的定位。要进行元素定位,需要先知道HTML页面的组成部分:
HTML页面的组成:HTML+CSS+javascript
1、HTML 是用来描述网页的一种语言。指的是超文本标记语言 (Hyper Text Markup Language) ,HTML 不是一种编程语言,而是一种标记语言 (markup language)
l负责定义页面呈现的内容:标签语言:<标签名>标签值</标签名>,每一种类型的元素都有自己独特的标签名来表示,是为了表达页面的内容,有统一的表达标准。
l了解html网页结构:https://www.runoob.com/html/html-paragraphs.html --html页面是树形结 构。
lHTML标签也可称之为元素,元素的特征:文本内容 ----- 【通过 F12可以查看页面源码】
lctrl +F 可以调出来页面的 搜索框 可以用来搜索值 是否唯一。
l所以元素有3个特征:
n1、标签名 :
linput【输入】| a【超链接】| span | button
lHTML 标签是由尖括号包围的关键词,比如, 标签通常是成对出现的,比如 和 ,标签对中的第一个标签是标签头,第二个标签是标签尾;
n2、属性 :
lHTML 元素可拥有属性 :id name class等,元素通用的属性【常见的属性】
lid - 在当前html页面当中,独一无二的身份标识。但是请注意,它可能是变动的(一 般有数字的都很容易变化)。==相当于人的身份证
lclass - 在当前html页面当中,并不唯一。一个元素可以有多个class值,用空格隔 开。(不同的元素用同样的样式设计的,很多元素class一样):class="commenttext quickinput"
lname - 在当前html页面当中,并不唯一。一般来讲跟当前元素的功能有关。
lstyle - 样式,高 宽 背景图片 ---基本很少会用于元素定位
n3、文本内容:标签可以拥有文本内容, 就是标签头和标签尾中间的内容:<span> text</span>
2、CSS:Cascading style sheets控制页面该如何呈现,即布局设置;比如字体颜色,字体大小,在页面呈 现的大小等。
3、Javascript:可以让你页面依据不同的情形做不同的事情。
七、元素的八大定位方法
元素定位的目标:找到要操作的元素(唯一),然后进行操作。一定要找到唯一的元素,如果找到多个,就考虑换一个定位方法。8大元素定位:分为2大类
代码里查找元素的方法:driver.find_element()
1、id属性 :优先选择,因为id一般都是唯一的。
2、class属性:样式,比如颜色,宽高 大小等 ,可以修改。但是要确保class的属性值是唯一的才可以用。
3、name属性
4、tag_name属性 - 标签名 :有多个重复的标签名,会默认找到第一个标签名 ;基本上不用,因为会 有很多个
5、link_text:a元素的文本内容完全匹配:a标签是一个超链接元素,超链接元素有属性target="_blank",超链接会打开一个新的窗口,否则就是在原窗口上打开新页面 ,窗口切换会用。
6、partial_link_text:a元素的文本内容部分匹配,当文本内容非常长的时候用部分匹配
·xpath定位(相对) :万能,推荐使用,重点学习。
·css selector:有弊端,不能支持文本定位,但是xpath可以。而且只支持web页面,app不支持。所 以不如xpath用的多。
八、CSS选择器元素定位
1、根据标签名定位 :它的问题是不唯一,一般页面中会有很多相同标签的元素,所以基本不用
2、根据ID定位
3、根据className定位:可以支持多个样式一起写
3、单属性选择定位: 需要其他的属性一起定位,可以用标签[属性名=“属性值”]
4、多属性选择定位: 如果一个属性不能唯一定位,用个属性组合
九、xpath元素定位
2xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标
2xpath基于XML文档树状结构,是XML路径语言,用来查询xml文档中的节点
2既可以用于XML,也可以用于HTML(因为XML与HTML结构类似,所以xpath都可以解析)
绝对路径:从根节点开始,一层一层写出来,直到要找到元素。父/子 路径和位置都涵盖 了,所以特别不稳定。
l从根节点(/)开始,一层一层写出来,直到要找到元素。父/子 【路径和位置依赖】 copy xpath :/html/body/div[2]/div[2]/div/div[1]/div[2]/ul/li[1]/a[2] -- 9代单传的路径。
相对路径: 以//开头,相对于某个节点的路径来找通过条件在html里面找。
l在页面当中查看xpath表达式,可以匹配多少元素:F12 -- ctrl + F
十、Selenium WebDrive原理
WebDriver协议(制定通讯的规则-底层基于http协议,作为一个翻译的角色):启动驱动程序,就是http 协议 监听某个端口【就是一个服务】;由selenium代码向他发起请求。实现各种操作。
The WebDriver Wire Protocol,由Selenium基于Http设计并定义的协议,各大浏览器厂商都提供了实现 了该协议的驱动程序(ChromeDriver,Geckodriver、EdgeDriver等),通过这套协议我们可以操作浏览 器实现各种控制动作:打开、关闭、最大化、最小化、元素定位、元素操作等等。
原理:核心部分通过统一化WebDriver协议通讯,客户端(代码段端)会发送法指令给驱动程序,驱动程 序是由不同的浏览器厂商开发的,驱动程序会自己内部将指令翻译,再去将翻译之后的指令做转发,转发 给浏览器,浏览器就能去执行对应的指令并且将结果告诉给客户端。
*请认真填写需求信息,我们会在24小时内与您取得联系。