本章我們來學習一下另外的一種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小時內與您取得聯系。