Tomcat10 修補了之前版本的漏洞,主要是javax的漏洞,導(dǎo)致使用javax jar包的項目不能直接部署,需要使用官方工具轉(zhuǎn)換。
Apache官網(wǎng)提供轉(zhuǎn)換程序 https://github.com/apache/tomcat-jakartaee-migration
Apache官方說明:Users of Tomcat 10 onwards should be aware that, as a result of the move from Java EE to Jakarta EE as part of the transfer of Java EE to the Eclipse Foundation, the primary package for all implemented APIs has changed from javax.* to jakarta.*. This will almost certainly require code changes to enable applications to migrate from Tomcat 9 and earlier to Tomcat 10 and later. A migration tool has been developed to aid this process.
大意是:由于Java EE 改為 Jakarta EE,javax. 的包全都換成 jakarta.。Tomcat9以及之前的版本需要使用工具來轉(zhuǎn)換一下。
java -jar jakartaee-migration-版本號-shaded.jar D:\源路徑\demo.war D:\目標(biāo)路徑\newdemo.war
3.將新war包放入tomcat啟動即可。
本章我們來學(xué)習(xí)一下另外的一種web服務(wù)tomcat,這是一個支持jsp頁面的web服務(wù),很多開發(fā)方向的IT人員,包括運維開發(fā)方向的同仁,都會選擇使用tomcat
什么是tomcat
CentOS8中如何部署tomcat
windows系統(tǒng)中如何部署tomcat
tomcat的相關(guān)目錄和文件的作用
tomcat的管理界面如何使用
如何使用tomcat發(fā)布靜態(tài)頁面
tomcat動態(tài)頁面的實現(xiàn)
tomcat多實例的實現(xiàn)
讓nginx和tomcat協(xié)同工作
tomcat的運行模式
tomcat運行模式的調(diào)整
額外的優(yōu)化參數(shù)
壓力測試工具的使用
能夠知道什么是tomcat
能夠在不同的系統(tǒng)上部署tomcat
能夠記住tomcat的常用目錄和文件
能夠知道如何管理tomcat
能夠在tomcat上部署靜態(tài)網(wǎng)站和動態(tài)網(wǎng)站
能夠?qū)ginx和tomcat整合并實現(xiàn)多實例
能夠?qū)omcat進(jìn)行簡單的調(diào)優(yōu)
能夠使用壓力測試工具
Apache Tomcat最早是由Sun開發(fā)的,在1999年被捐獻(xiàn)給ASF(Apache 軟件基金會 Apache Software Foundation),隸屬于Jakarta(雅加達(dá))項目,現(xiàn)在已經(jīng)獨立為一個頂級項目。因為Tomcat 技術(shù)先進(jìn)、性能穩(wěn)定,同時也是一個免費的開放源代碼的Web 應(yīng)用服務(wù)器,因而深受Java 愛好者的喜愛并得到了部分軟件開發(fā)商的認(rèn)可,被很多企業(yè)普遍使用,也是開發(fā)和調(diào)試JSP程序的首選。成為目前比較流行的Web 應(yīng)用服務(wù)器。
官方網(wǎng)站:http://tomcat.apache.org/
Resin是Caucho公司的產(chǎn)品,速度非常快。可以顯示動態(tài)內(nèi)容,也可以顯示靜態(tài)內(nèi)容,但是用戶數(shù)量少,參考文檔也少,使用起來不太方便,一旦涉及到相關(guān)文件和內(nèi)容的更新,系統(tǒng)會自動重新部署并重啟。
Jetty是一個純粹的基于Java的web服務(wù)器,也是一個開源項目。架構(gòu)簡單,速度快,修改簡單,但是對java的支持不如tomcat全面,
WebLogic 是BEA公司的產(chǎn)品,可進(jìn)一步細(xì)分為 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特別強大。WebLogic 支持企業(yè)級的、多層次的和完全分布式的Web應(yīng)用,并且服務(wù)器的配置簡單、界面友好。對于那些正在尋求能夠提供Java平臺所擁有的一切應(yīng)用服務(wù)器的用戶來說,WebLogic是一個十分理想的選擇。但是不開源且收費
JBoss、WebSphere
Apache
優(yōu)點:模塊多,功能全面,性能穩(wěn)定,適合靜態(tài)HTML
缺點:配置相對復(fù)雜,自身不支持動態(tài)頁面
Nginx
優(yōu)點:功能較多,負(fù)載均衡、反向代理等,速度比Apache快
缺點:輕量級web服務(wù)器,功能不如Apache全面
Tomcat
優(yōu)點:能夠處理動態(tài)請求,可以獨立于Apache運行,支持JSP
缺點:對靜態(tài)內(nèi)容和大文件的支持有所欠缺
Apache是用C寫的,Nigix是用C寫的,Tomcat是用Java寫的。Tomcat是Apache的拓展,更實質(zhì)的說是Java應(yīng)用服務(wù)器,用于處理JSP后臺語言開發(fā)的應(yīng)用,主要用于處理JSP動態(tài)網(wǎng)頁。Tomcat 服務(wù)器是一個免費的開放源代碼的Web 應(yīng)用服務(wù)器(主要用于解析servlet/JSP,同時具備http服務(wù)),單純的Tomcat性能有限,在很多地方表現(xiàn)有欠缺,如活動連接支持、靜態(tài)內(nèi)容、大文件和HTTPS等,因此多數(shù)都是Apache+Tomcat+JavaSDK的集成。嚴(yán)格的來說,Apache/Nginx 應(yīng)該叫做「HTTP Server」;而 Tomcat 則是一個「Application Server」,或者更準(zhǔn)確的來說,是一個「Servlet/JSP」應(yīng)用的容器(Ruby/Python 等其他語言開發(fā)的應(yīng)用也無法直接運行在 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以上的,所以在安裝之前,我們需要確認(rèn)一下本機的版本,如果滿足需求的話可以直接安裝tomcat
[root@manage01 ~]# java -version
bash: java: 未找到命令...
文件搜索失敗: Cannot update read-only repo
#系統(tǒng)提示沒有找到命令,意味著沒有安裝相關(guān)軟件包,所以我們要安裝
[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%]
準(zhǔn)備中... ################################# [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的運行環(huán)境,也叫jre
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
#JVM java的虛擬機,可以使Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java
虛擬機屏蔽了與具體平臺相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的字
節(jié)碼就可以了,這樣就可以在多種平臺上不加修改地運行。很多語言都采用了這種類似的思路,
才使得他們具有可移植性,比如說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是一個二進(jìn)制包,什么意思呢?就類似于我們下載
游戲的時候的硬盤版,什么是硬盤版?解壓就能玩,所以這個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 是關(guān)閉tomcat使用的端口,可以使用telnet serverip 8005 然后輸入大寫的SHUTDOWN
關(guān)閉tomcat,所以建議更改端口 或者把引號中了命令改成不容易記憶的,個人推薦改命令,因為
改端口沒有告訴負(fù)責(zé)網(wǎng)絡(luò)安全的同事就會給你屏蔽掉………
8080 連接端口
8009 AJP協(xié)議使用的端口,tomcat的優(yōu)勢是處理jsp頁面 但是對于圖片,靜態(tài)頁面處理能力特別差,
相對于apache來說,那么這個時候怎么辦 做個分流 jsp頁面由tomcat完成,靜態(tài)的頁面 圖片由AJP
來完成,AJP是定向包協(xié)議 使用二進(jìn)制格式來傳輸可讀性文本,在server.xml配置文件中默認(rèn)不生效
注意tomcat的訪問端口是8080
提示:如果之前系統(tǒng)中安裝過java環(huán)境的話,可能會出現(xiàn)即便安裝完成新的jdk之后,使用
java -version命令所查詢的結(jié)果依然是老版本的,這個問題是由于環(huán)境變量引起的,所以需要修改環(huán)
境變量設(shè)置文件
[root@manage01 ~]# vim /root/.bash_profile
#####java
JAVA_HOME=/usr/java/jdk-13.0.2#對應(yīng)自己安裝的版本
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看到的還是以前的提示,重啟一下系統(tǒng)
安裝tomcat
解壓tomcat的壓縮包并進(jìn)入到bin目錄下
server status 查看服務(wù)器的狀態(tài),包括linux主機的信息,tomcat的版本信息,資源使用情況等
manager app 管理網(wǎng)站
host manager 虛擬主機的管理
tomcat主目錄
bin:命令,存放不同平臺上啟動或關(guān)閉的腳本
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發(fā)布目錄,類似于nginx或者apache的html目錄
work:tomcat的工作目錄,存放的是jsp編譯后產(chǎn)生的.class文件及.java文件。清空work目錄,然后重啟tomcat,可以達(dá)到清除緩存的作用。
bin目錄
bin目錄下的文件主要有兩類,一個是Linux使用的.sh結(jié)尾的文件,另外一個是windows使用的.bat結(jié)尾的文件,
catalina tomcat的設(shè)置腳本,也可以啟動&關(guān)閉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 關(guān)閉腳本
conf目錄
這個目錄下主要存放的是與tomcat設(shè)置相關(guān)的文件,常用的配置文件主要包含
server.xml 可以設(shè)置端口號、設(shè)置域名或IP、默認(rèn)加載的項目、請求編碼
web.xml 可以設(shè)置tomcat支持的文件類型
context.xml 可以用來配置數(shù)據(jù)源之類的
tomcat-users.xml 用來配置管理tomcat的用戶與權(quán)限
Catalina 此目錄下可以設(shè)置默認(rèn)加載的項目
webapps目錄
ROOT tomcat默認(rèn)的頁面
docs 使用說明文檔
examples 例子--tomcat首頁中的examples按鈕對應(yīng)的內(nèi)容
host-manager 首頁Host Manager按鈕對應(yīng)的內(nèi)容
manager 首頁 Manager App按鈕對應(yīng)的內(nèi)容
server.xml
元素名 | 屬性 | 解釋 |
server | port | 指定一個端口,這個端口負(fù)責(zé)監(jiān)聽關(guān)閉tomcat的請求 |
shutdown | 指定向端口發(fā)送的命令字符串 | |
service | name | 指定service的名字 |
Connector(表示客戶端和service之間的連接) | port | 指定服務(wù)器端要創(chuàng)建的端口號,并在這個斷口監(jiān)聽來自客戶端的請求 |
minProcessors | 服務(wù)器啟動時創(chuàng)建的處理請求的線程數(shù) | |
maxProcessors | 最大可以創(chuàng)建的處理請求的線程數(shù) | |
enableLookups | 如果為true,則可以通過調(diào)用request.getRemoteHost()進(jìn)行DNS查詢來得到遠(yuǎn)程客戶端的實際主機名,若為false則不進(jìn)行DNS查詢,而是返回其ip地址 | |
redirectPort | 指定服務(wù)器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號 | |
acceptCount | 指定當(dāng)所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理 | |
connectionTimeout | 指定超時的時間數(shù)(以毫秒為單位) | |
Engine(表示指定service中的請求處理引擎,接收和處理來自Connector的請求) | defaultHost | 指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的 |
Context(表示一個web應(yīng)用程序,通常為WAR文件,關(guān)于WAR的具體信息見servlet規(guī)范) | docBase | 應(yīng)用程序的路徑或者是WAR文件存放的路徑 |
path | 表示此web應(yīng)用程序的url的前綴,這樣請求的url為http://localhost:8080/path/ | |
reloadable | 這個屬性非常重要,如果為true,則tomcat會自動檢測應(yīng)用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應(yīng)用程序,我們可以在不重起tomcat的情況下改變應(yīng)用程序 | |
host(表示一個虛擬主機) | name | 指定主機名 |
appBase | 應(yīng)用程序基本目錄,即存放應(yīng)用程序的目錄 | |
unpackWARs | 如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應(yīng)用程序 | |
Logger(表示日志,調(diào)試和錯誤信息) | className | 指定logger使用的類名,此類必須實現(xiàn)org.apache.catalina.Logger 接口 |
prefix | 指定log文件的前綴 | |
suffix | 指定log文件的后綴 | |
timestamp | 如果為true,則log文件名中要加入時間,如下例:localhost_log.004-mm-dd.txt | |
Realm(表示存放用戶名,密碼及role的數(shù)據(jù)庫) | className | 指定Realm使用的類名,此類必須實現(xiàn)org.apache.catalina.Realm接口 |
Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣) | className | 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應(yīng)用程序的訪問信息 |
directory | 指定log文件存放的位置 | |
pattern | 有兩個值,common方式記錄遠(yuǎn)程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應(yīng)代碼,發(fā)送的字節(jié)數(shù)。combined方式比common方式記錄的值更多 |
web.xml
默認(rèn)Web應(yīng)用的首頁文件的設(shè)置
報錯文件的設(shè)置
session 會話過期時間的設(shè)置,單位是分鐘
servlet的設(shè)置(Java Servlet的簡稱,稱為小服務(wù)程序或服務(wù)連接器,用Java編寫的服務(wù)器端程序,具有獨立于平臺和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動態(tài)Web內(nèi)容。)
tomcat-users.xml
管理用戶配置文件
rolename 定義角色,不同的角色管理權(quán)限不同,相當(dāng)于組
manager-gui 允許訪問html接口(即URL路徑為/manager/html/*)
manager-script 允許訪問純文本接口(即URL路徑為/manager/text/*)
manager-jmx 允許訪問JMX代理接口(即URL路徑為/manager/jmxproxy/*)
manager-status 允許訪問Tomcat只讀狀態(tài)頁面(即URL路徑為/manager/status/*)
admin-gui 允許訪問html管理界面
admin-script 允許訪問文本管理界面
user 定義用戶名
username 定義用戶名
password 設(shè)置密碼
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"/>
設(shè)置完成之后重啟tomcat就可以登錄后臺管理頁面了,其中在manager app中主要管理的是網(wǎng)站是否發(fā)布的操作,start=發(fā)布網(wǎng)站
stop=停止發(fā)布網(wǎng)站,reload=重新加載,undeploy=卸載/刪除網(wǎng)站(慎用),expire session=會話過期時間
與war文件部署相關(guān)的設(shè)置,包括定義war文件存放的位置,和上傳war文件
war是一個可以直接運行的web模塊,通常用于網(wǎng)站,打包部署。以Tomcat來說,將war包放置在其\webapps\目錄下,然后啟動Tomcat,這個包就會自動解壓,就相當(dāng)于發(fā)布了。war包是Sun提出的一種web應(yīng)用程序格式,與jar類似,是很多文件的壓縮包。war包中的文件按照一定目錄結(jié)構(gòu)來組織。簡單來說,war包是JavaWeb程序打的包,war包里面包括寫的代碼編譯成的class文件,依賴的包,配置文件,所有的網(wǎng)站頁面,包括html,jsp等等。一個war包可以理解為是一個web項目,里面是項目的所有東西。
configuration 定義TLS(安全傳輸協(xié)議)配置文件
diagnostics 檢查網(wǎng)站在啟動,重新加載或卸載時,是否造成內(nèi)存溢出,這個操作會觸發(fā)垃圾回收機制,生產(chǎn)環(huán)境中慎用
TLS connector configuration diagnostics 加密診斷,可以幫助用戶診斷加密是否有問題
[root@manage01 ~]# dnf install ibus* -y
添加完整的中文環(huán)境后重啟
重啟完成為瀏覽器添加中文后重啟瀏覽器
再次訪問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是用來發(fā)布jsp網(wǎng)站的,jsp的網(wǎng)站,頁面漂亮還安全,上節(jié)課我們已經(jīng)知道如何發(fā)布靜態(tài)頁面了,本節(jié)課我們一起來看一下如何發(fā)布動態(tài)頁面,我們通過jpress一個使用java開發(fā)的建站軟件來實現(xiàn)jsp頁面
jpress下載地址:http://jpress.io/download
step1 準(zhǔn)備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 準(zhǔn)備數(shù)據(jù)庫
[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是一個單進(jìn)程多線程的軟件,在很早之前,我們都認(rèn)為這種模式挺好的,因為早些年的CPU都是單核的,但是現(xiàn)在都是多核心的CPU了,如果還是一個進(jìn)程的話呢,就比較浪費CPU資源,所以本節(jié)課我們要討論下如果多開幾個tomcat,也就是我們本節(jié)課要實現(xiàn)的是tomcat的多實例,這樣可以提高資源的利用率,在之前的課程中我們提到過tomcat有三個端口8005 8009 8080,其中8005是用來關(guān)閉tomcat的端口,8080是訪問端口,8009是ajp協(xié)議使用的端口,如果我想在一臺機器上開啟多個tomcat的話,首先要保證的就是端口不能沖突,否則開不了。
step1 將之前部署好的tomcat復(fù)制一份
[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的相關(guān)配置文件
[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或者h(yuǎn)ttp://serverip/jpress這種字樣的URL,使用起來比較麻煩,所以呢,我們可以將tomcat和nginx結(jié)合在一起
step1 調(diào)整tomcat1
[root@manage01 ~]# cd /opt/tomcat1/webapps/
[root@manage01 webapps]# mv ROOT tomcat
[root@manage01 webapps]# mv jpress ROOT
step2 調(diào)整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 調(diào)整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 打開瀏覽器直接訪問域名測試
調(diào)整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的優(yōu)化可以提高網(wǎng)站的并發(fā)能力,體現(xiàn)個人的價值,tomcat在java項目中的使用率非常高,所以在生產(chǎn)環(huán)境對tomcat的優(yōu)化也就變得非常必要了,一般情況下tomcat的優(yōu)化主要從兩個方面入手,一個是自身配置,另一個是tomcat所運行的jvm虛擬機的優(yōu)化,優(yōu)化的工作可以從安裝完tomcat就開始著手
在前面的課程中我們提到了一個叫AJP的協(xié)議,同時我們也知道了這個AJP的作用,但是在生產(chǎn)環(huán)境中一般使用的是nginx+tomcat的架構(gòu),所以大多數(shù)時候用不到AJP協(xié)議,所以我們可以禁用它,而在我們的server.xml文件中這個AJP默認(rèn)就是禁用的,如果是其它版本最好看一下
[root@manage01 conf]# vim /opt/tomcat1/conf/server.xml
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
###
tomcat的運行模式有3種:
bio
性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持,適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
nio
nio(new I/O),是Java SE 1.4及后續(xù)版本提供的一種新的I/O操作方式它擁有比傳統(tǒng)I/O操作(bio)更好的并發(fā)運行性能。Tomcat9默認(rèn)使用nio運行模式。適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜。AIO(NIO2)使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu),比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持。
apr
安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能
進(jìn)入tomcat的服務(wù)器狀態(tài)頁面查看默認(rèn)的模式
如果默認(rèn)使用的是bio模式
設(shè)置使用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可移植運行庫)的目的如其名稱一樣,主要為上層的應(yīng)用程序提供一個可以跨越多操作系統(tǒng)平臺使用的底層支持接口庫。可以大大地提高Tomcat對靜態(tài)文件的處理性能。 也是在Tomcat上運行高并發(fā)應(yīng)用的首選模式。
系統(tǒng)自帶的軟件包不是最新的,且缺少相關(guān)軟件包,所以我們選擇源碼包安裝
所需軟件包
apr-1.7.0.tar.gz 主程序包 包含了通用開發(fā)組件
apr-iconv-1.2.2.tar.gz 用于實現(xiàn)iconv編碼
apr-util-1.6.1.tar.gz 額外的開發(fā)組件
tomcat-native.tar.gz 關(guān)聯(lián)tomcat和apr的組件
arp相關(guān)軟件包下載 https://mirrors.cnnic.cn/apache/apr/
tomcat-native在tomcat安裝目錄的bin下
部署apr環(huán)境
step1 環(huán)境準(zhǔn)備
[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 修改并加載環(huán)境變量
[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 測試
#為了避免干擾先執(zhí)行關(guān)閉
[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 開始協(xié)議處理句柄["http-apr-8080"]
注意:如果非root用戶啟動失敗,把apr環(huán)境變量在當(dāng)前用戶的.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:最大線程數(shù),默認(rèn)150。增大值避免隊列請求過多,導(dǎo)致響應(yīng)緩慢。
minSpareThreads:最小空閑線程數(shù)。
acceptCount:當(dāng)處理請求超過此值時,將后來請求放到隊列中等待。
disableUploadTimeout:禁用上傳超時時間
connectionTimeout:連接超時,單位毫秒,0代表不限制
URIEncoding:URI地址編碼使用UTF-8
enableLookups:關(guān)閉dns解析,提高響應(yīng)時間
compression:啟用壓縮功能
compressionMinSize:最小壓縮大小,單位Byte
compressibleMimeType :壓縮的文件類型
官方參數(shù)文檔:http://tomcat.apache.org/tomcat-9.0-doc/config/http.html
Apache JMeter是Apache組織開發(fā)的基于Java的壓力測試工具。用于對軟件做壓力測試,它最初被設(shè)計用于Web應(yīng)用測試,但后來擴(kuò)展到其他測試領(lǐng)域。 它可以用于測試靜態(tài)和動態(tài)資源,例如靜態(tài)文件、Java 小服務(wù)程序、CGI 腳本、Java 對象、數(shù)據(jù)庫、FTP 服務(wù)器, 等等。JMeter 可以用于對服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M巨大的負(fù)載,來自不同壓力類別下測試它們的強度和分析整體性能
JMeter的作用
能夠?qū)TTP和FTP服務(wù)器進(jìn)行壓力和性能測試, 也可以對任何數(shù)據(jù)庫進(jìn)行同樣的測試(通過JDBC)。
完全的可移植性和100% 純java。
完全多線程 框架允許通過多個線程并發(fā)取樣和 通過單獨的線程組對不同的功能同時取樣。
精心的GUI設(shè)計允許快速操作和更精確的計時。
緩存和離線分析/回放測試結(jié)果。
下載地址:http://jmeter.apache.org/download_jmeter.cgi
JMeter安裝使用
將下載好的壓縮包在windows中解壓(需要先安裝JDK),解壓后進(jìn)入到bin目錄雙擊jmeter.bat,等待啟動
設(shè)置中文
創(chuàng)建測試
添加線程組,使用線程模擬用戶的并發(fā)
1000個線程循環(huán)10次,tomcat會收到10000個請求
添加并設(shè)置http請求
添加監(jiān)控
啟動測試
查看結(jié)果
標(biāo)簽:說明是請求類型,如Http,F(xiàn)TP等請求。
樣本總數(shù):也就是圖形報表中的樣本數(shù)目,總共發(fā)送到服務(wù)器的樣本數(shù)目。
平均值:也就是圖形報表中的平均值,是總運行時間除以發(fā)送到服務(wù)器的請求數(shù)。
居中的數(shù)值:也就是圖形報表中的中間值,是代表時間的數(shù)字,有一半的服務(wù)器響應(yīng)時間低于該值而另一半高于該值。
90%&95%&99%:有多少請求的響應(yīng)時間比給出的數(shù)值還要小。
最小:是代表時間的數(shù)字,是服務(wù)器響應(yīng)的最短時間。
最大: 是代表時間的數(shù)字,是服務(wù)器響應(yīng)的最長時間。
異常%:請求的錯誤百分比。
吞吐量:也就是圖形報表中的吞吐量,這里是服務(wù)器每單位時間處理的請求數(shù),注意查看是秒或是分鐘。
發(fā)送/接收KB/sec:是每秒鐘發(fā)送/接收的字節(jié)數(shù)。
(時間的單位為ms)
通過上面測試可以看出,tomcat在不做任何調(diào)整時,吞吐量為587次/秒。這個吞吐量跟接口的業(yè)務(wù)邏輯關(guān)系很大,如果業(yè)務(wù)邏輯復(fù)雜,需要比較長時間計算的,可能吞吐量只有幾十次/秒,我這里測試的時候沒有添加任務(wù)業(yè)務(wù)邏輯,才會出現(xiàn)吞吐量為587次/秒的情況。這里的吞吐量最好是經(jīng)過多次測試取平均值,因為單次測試具有一定的隨機性
調(diào)整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" />
#調(diào)整最大線程數(shù)為1000,最小為200,這個線程的數(shù)量要反復(fù)調(diào)整,然后對比測試結(jié)果,找出一個適合
自己的值
調(diào)整隊列
[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" />
默認(rèn)情況下,請求發(fā)送到tomcat,如果tomcat正忙,那么該請求會一直等待。這樣雖然可以保證每個
請求都能請求到,但是請求時間就會邊長。有些時候,我們也不一定要求請求一定等待,可以設(shè)置最大
等待隊列大小,如果超過就不等待了。這樣雖然有些請求是失敗的,但是請求時間會雖短。典型的是
12306。
3分鐘了解計算機發(fā)展歷史-組團(tuán)學(xué)12306。
參數(shù)介紹可以去官網(wǎng)查看:https://tomcat.apache.org/tomcat-9.0-doc/config/executor.html
tomcat的安裝部署
tomcat的相關(guān)文件介紹
tomcat的管理
靜態(tài)頁面和動態(tài)頁面的發(fā)布
如何實現(xiàn)tomcat多實例
如何將tomcat和nginx整合
tomcat的調(diào)優(yōu)及壓力測試工具的使用
重點:tomcat如何安裝、相關(guān)目錄的作用、如何使用tomcat發(fā)布網(wǎng)站,后臺管理功能的使用,多實例的實現(xiàn),如何與nginx整合,tomcat的調(diào)優(yōu)及壓力測試工具的使用
難點:不同操作系統(tǒng)的安裝,相關(guān)文件的作用,使用tomcat發(fā)布頁面,與nginx的整合方法,調(diào)優(yōu)的方式及壓力測試工具
今天東西超級多,我看有幾個能從頭到尾看完的,哈哈哈哈哈