一、TOMCAT簡介
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的訣竅是,當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。
官網:?Apache Tomcat? - Welcome!
官網文檔: Apache Tomcat 8 (8.5.99) - Documentation Index
幫助文檔:
Apache Tomcat Home - Apache Tomcat - Apache Software Foundation ? ? ? ??
FAQ - Apache Tomcat - Apache Software Foundatio
二、TOMCAT安裝
1.JDK介紹
JDK(Java Development Kit)是 Java 語言的軟件開發工具包,它包含了編譯、運行Java應用程序所需的全部組件。主要包括以下幾個部分:
javac | Java 編譯器,用于將源代碼(.java 文件)編譯為字節碼文件(.class 文件)。 |
java | Java 運行時環境,負責加載和執行字節碼文件。 |
javadoc | Java 文檔生成工具,用于從源代碼注釋中提取信息生成API文檔。 |
jar | Java 打包工具,可以將多個類文件打包成一個.jar文件。 |
jdb | Java 調試器,用于調試Java程序。 |
jps, jinfo, jmap, jhat, jstack, jstat?等 | 這些是用于監控和管理Java虛擬機(JVM)的實用工具。 |
jmod | 在較新版本的JDK中引入的一個模塊化工具,用于處理Java模塊化系統中的模塊。 |
jshell | 自JDK 9起引入的交互式Java Shell工具,可進行快速原型設計和學習Java語法。 |
JDK在Linux中默認是安裝的,但是安裝的是openjdk
OpenJDK:
?1.是一個開源項目,遵循GPL v2許可協議(部分組件使用不同的兼容許可證),由全球的開發者社區共同維護和開發,包括但不限于Oracle和其他公司。
2.通常被視為Java官方參考實現的基礎,任何Java版本的新特性首先會出現在OpenJDK中。
3.更新頻率較快,由于社區驅動,新特性和錯誤修復的集成速度可能更快。
4.不包含一些商業特性,如Flight Recorder(但后來也開源了)、Mission Control等工具,以及某些性能優化或特定平臺的支持。
5.多數Linux發行版默認提供的Java環境就是基于OpenJDK構建的。
Oracle JDK:
1.直到Java SE 11之前,Oracle JDK一直是Oracle公司發布的免費供個人使用的JDK版本,并為企業用戶提供長期支持(LTS)版本。
2.包含了一些OpenJDK沒有的額外商業特性和服務,比如上述提到的高級分析工具和可能存在的性能增強。
3.在授權方面,自Java SE 11起,Oracle JDK對商業用途開始實施訂閱制收費模式,非商業用戶仍然可以免費下載更新和安全補丁,但需要遵循Oracle的技術支持策略。
4.Oracle JDK曾經提供更穩定且及時的技術支持,尤其是對于付費的企業用戶。
總結來說,在大多數情況下,OpenJDK與Oracle JDK在核心功能上差異較小,兩者可以互換使用。然而,Oracle JDK針對企業級應用提供了更多的服務和支持,而OpenJDK則更適合那些尋求完全開源解決方案并愿意接受社區支持的開發者和組織。隨著Java生態的發展,越來越多的第三方廠商也開始發布基于OpenJDK的長期支持版本,為用戶提供與Oracle JDK相媲美的穩定性和技術
2.安裝Oracle JDK
安裝包下載官方鏈接:Java Downloads | Oracle
安裝包下載需要登錄,所以提前準備好安裝包
ram安裝
事先準備好rmp包,而后yum install? 安裝,或者使用日rpm? -ivh? 安裝包名稱;進行安裝
安裝好之后,找到安裝目錄
在該目錄下可以看到很多執行文件,就是一些需要用到的java工具
為了讓系統能夠識別并使用這個JDK版本作為默認Java環境,需要設置一個環境變量
寫在開機自動檢測的文件當中
對于全局生效(所有用戶):編輯 /etc/profile 或 /etc/profile.d/*.sh文件。
對于僅當前用戶生效:編輯 ~/.bashrc 或 ~/.bash_profile 文件。
export JAVA_HOME=/usr/java/default
#設置了JAVA_HOME環境變量,它指向Java開發工具包(JDK)的安裝目錄。
?
export PATH=$JAVA_HOME/bin:$PATH
#修改了系統PATH環境變量,在原有PATH值前添加了 $JAVA_HOME/bin。這樣一來,在執行java等命令時
#系統會在指定的Java bin目錄下查找并優先執行相應的命令。也就是先執行$JAVA_HOME里的Java命令
#找到相應的命令后,立即停止查找
?
export JRE_HOME=$JAVA_HOME/jre
#非必須項,但常見做法。設置了JRE_HOME環境變量,指向Java運行時環境(JRE)的安裝目錄
#通常位于JDK安裝目錄下的jre子目錄。
?
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
#非必須項。設置了CLASSPATH環境變量,用于Java應用程序加載類文件時搜索的路徑列表。
#在早期Java版本中,需要通過CLASSPATH來指定自定義類庫的位置。
3.安裝TOMCAT
安裝tomcat可以使用yum install,但是,yum源中的版本過于老舊,所以不推薦?
可以在官方網站下載好較新版本的安裝包,而后進行二進制安裝
官方網站與鏡像下載站點
Apache Tomcat? - Apache Tomcat 8 Software Downloads
Index of /apache/tomcat
[root@localhost ~]#rpm -ivh jdk-8u201-linux-x64.rpm
#安裝JDK包
警告:jdk-8u201-linux-x64.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID ec551f03: NOKEY
準備中... ################################# [100%]
正在升級/安裝...1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%]
[root@localhost ~]#cd /usr/java/jdk1.8.0_201-amd64/
[root@localhost jdk1.8.0_201-amd64]#ll
總用量 25980[root@localhost jdk1.8.0_201-amd64]#vim /etc/profile
#添加環境變量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@localhost jdk1.8.0_201-amd64]#source /etc/profile
#刷新配置文件
[root@localhost tomcat]#tar zxvf apache-tomcat-9.0.16.tar.gz
[root@localhost tomcat]#cp -r apache-tomcat-9.0.16 /usr/local/tomcat
[root@localhost tomcat]#cd /usr/local/tomcat/
[root@localhost tomcat]#/usr/local/tomcat/bin/startup.sh
#啟動tomcat #catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh
#關閉服務 #catalina.sh stop添加到
[root@localhost bin]#useradd -s /sbin/nologin tomcat
#新建用戶
[root@localhost local]#chown tomcat:tomcat tomcat/ -R
#修改屬主和屬組[root@localhost ~]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Tomcat
After=syslog.target network.target[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat[Install]
WantedBy=multi-user.targetEOF[root@localhost local]#systemctl daemon-reload
[root@localhost local]#systemctl start tomcat
[root@localhost local]#ss -ntap |grep 8080
三、配置文件介紹及核心組件
(一)配置文件
使用tree命令可以查看到在/usr/local/tomcat/目錄下有好多文件
1.目錄文件
bin | 存放啟動和關閉 Tomcat 的腳本文件,比較常用的是 catalina.sh、startup.sh、shutdown.sh 三個文件 |
conf | 存放 Tomcat 服務器的各種配置文件,比較常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四個文件。 |
lib | 存放 Tomcat 服務器的 jar 包,一般不作任何改動,除非連接第三方服務 |
logs | 存放 Tomcat 日志 catalina.out |
temp | 存放 Tomcat 運行時產生的文件 |
webapps | 部署Web應用程序的地方。將WAR文件或解壓后的目錄放在這里,Tomcat會自動檢測并部署這些應用 |
work | Tomcat 工作目錄,一般清除 Tomcat 緩存的時候會使用到(升級版本時注意要刪除里面的緩存) |
2.bin下的啟動文件
以.bat結尾的文件一般為windows環境下的相關文件
以.sh結尾的文件為Unix/Linux環境下的相關文件
其中最常用的三個文件為
catalina.sh:Unix/Linux平臺下啟動、停止和管理Tomcat服務器的主要腳本
startup.sh:啟動Tomcat服務器的腳本。
shutdown.sh:關閉Tomcat服務器的腳本。
3.conf下的子配置文件
Catalina:這不是一個文件,而是指Tomcat服務器的核心容器。它負責處理所有的Web應用請求,并且通過加載conf目錄下的配置文件來管理服務器的行為。
catalina.properties:這個文件包含了Catalina容器的一些全局屬性設置,例如日志路徑、臨時工作目錄、JMX設置等。
jaspic-providers.xml:Java Authentication and Authorization Service Provider Contract for Containers (JAAS) 的提供者配置文件,用于定義和配置安全認證與授權的服務提供商。
jaspic-providers.xsd:對應的XML模式定義文件(XSD),用來驗證jaspic-providers.xml文件是否遵循正確的結構和內容規范。
logging.properties:Tomcat的日志系統配置文件,定義了各種日志級別、日志輸出位置以及格式化樣式。
server.xml:Tomcat服務器的主要配置文件,包括端口號設置、連接器配置(HTTP/HTTPS/AJP)、引擎、主機、上下文(Web應用程序)以及其他全局服務配置。
tomcat-users.xml:用戶賬號和權限信息的配置文件,定義了可以訪問Tomcat Manager應用和其他受保護資源的用戶名、密碼以及角色分配。
tomcat-users.xsd:同樣作為模式定義文件,用于驗證tomcat-users.xml文件的格式正確性。
web.xml:位于conf/webapps/ROOT/WEB-INF或全局配置目錄下,這是Servlet容器的默認部署描述符,定義了所有Web應用通用的初始化參數、Servlet映射、過濾器、監聽器等配置。對于每個單獨的應用,也會有各自的web.xml文件放置在各自的WEB-INF目錄內。
4.日志文件與臨時、緩存文件
(二)組件
Catalina Container Catalina是Tomcat的主要容器,它負責管理整個請求處理生命周期。Catalina遵循Servlet和JavaServer Pages (JSP) 規范,以處理HTTP請求并生成響應。Catalina內部有多個層次的容器結構,包括Engine、Host、Context和Wrapper。
? ? ? ?Engine:引擎,代表整個Catalina Servlet容器,它可以包含多個虛擬主機(Host)。
? ? ? ?Host:虛擬主機,對應一個或多個域名/IP地址,每個Host可以部署多個Web應用程序。
? ? ? ?Context:上下文,代表一個Web應用程序,通常對應于WAR文件解壓后的目錄結構。
? ? ? ?Wrapper:最底層容器,封裝了一個具體的Servlet實例。
Connector Connector是Tomcat與客戶端進行通信的關鍵組件,它監聽指定端口上的HTTP請求,并將這些請求傳遞給相應的Container進行處理。例如,HTTP/1.1協議的Connector會監聽8080端口(默認配置),AJP Connector則監聽8009端口用于與前端代理服務器如Apache HTTP Server進行通信。
Jasper Jasper是Tomcat內置的JSP編譯器和容器,負責將JSP頁面轉換為Java Servlet源代碼,然后編譯成字節碼并加載到容器中執行。
Web Applications Manager (Manager App) Manager是一個Web應用程序,提供了通過瀏覽器界面管理Tomcat上部署的應用程序的功能,比如部署新的WAR文件、啟動、停止及刪除已部署的應用等。
Host Manager Host Manager也是Web應用程序,主要用于管理和配置Tomcat中的虛擬主機。
Libraries and Classloaders Tomcat包含一組庫文件(位于lib目錄下),它們包含了運行時所需的類庫和Tomcat自身功能實現所需要的類。同時,Tomcat具有復雜的類加載機制,確保不同Web應用程序之間的類隔離和資源加載。
Security Manager 安全管理器可選地在Tomcat中啟用,用于實施更細粒度的安全策略控制,限制Web應用程序訪問系統資源的能力。
Logging System Tomcat自帶日志系統,支持靈活的日志級別設置以及多種輸出格式,通過conf/logging.properties配置文件進行定制。
Global JNDI Resources Tomcat提供對Java Naming and Directory Interface (JNDI)的支持,允許在全局范圍內定義和查找資源,例如數據庫連接池、郵件服務等。
1.組件分層和分類
2.核心組件
(三)TOMCAT請求過程
#接收請求
?
'當客戶端(通常是Web瀏覽器)向Tomcat服務器發送一個HTTP請求時,請求首先被監聽在
特定端口上的Connector組件接收。例如,對于默認配置,HTTP Connector通常監聽8080端口'
?
#解析請求
'Connector接收到請求后,會根據HTTP協議規范對請求進行解析,提取出請求方法(GET、
POST等)、請求URI、HTTP頭信息以及可能存在的請求體內容'
?
#路由請求到適當的Context:
'解析后的請求將被傳遞給Engine容器,Engine通過匹配請求的Host頭或IP地址找到對應的虛擬
主機(Host)。
Host接著根據請求URI找到關聯的Web應用程序Context,也就是WAR文件解壓后部署的應用目錄。'
?
#查找并執行Servlet
'Context容器負責查找請求URI映射到的Servlet,并實例化或重用該Servlet。
如果請求的URL與某個Servlet的URL映射規則相匹配,則調用Servlet的service()方法來處理請求'
?
#處理請求
'在Servlet內部,根據請求的方法和請求參數,調用相應的doGet()、doPost()等方法處理請求數
據,并生成響應結果。'
?
#創建響應
'Servlet處理完成后,返回一個HttpServletResponse對象,其中包含了狀態碼、響應頭和響應
體內容(如HTML頁面、JSON數據或其他格式的內容)。'
?
#寫回響應
'Context將Servlet生成的響應傳遞給Host,再由Host傳遞給Engine,最終由Engine中的
Connector將響應數據封裝成HTTP響應報文并通過網絡發送回客戶端。'
?
#清理資源:
'在整個處理過程中,Tomcat還負責管理連接、線程池以及其他系統資源,確保請求處理完畢后釋放
相關資源以供后續請求使用'
?
#生命周期事件通知:
'Tomcat在應用啟動、停止、上下文初始化、銷毀等階段還會觸發相應的生命周期事件,以便開發者
能夠插入自定義的初始化邏輯或資源清理操作。'