程式設計師,我教你玩轉Tomcat監控管理
轉載請宣告出處!
Tomcat Manager
Tomcat Manager是一個Tomcat內建的管理介面, 管理介面隨Tomcat的每次安裝一起啟動,提供包括快速入門指南和相關檔案的連結。通過此介面,您可以檢視Tomcat指標,並通過JMX代理Servlet查詢指標資料。
Tomcat Manager角色和許可權
雖然管理介面是開箱即用的,但是在沒有設定適當的使用者和角色之前,您將無法訪問。Tomcat提供多個角色訪問Tomcat Manager,主要的兩個角色是:
-
manager-jmx :提供對JMX代理servlet和Tomcat伺服器狀態頁面的訪問
-
manager-gui
如果需要從管理介面訪問Tomcat指標,您需要為使用者分配適當的角色。您可以通過更新Tomcat的conf / tomcat-users.xml配置檔案來完成此操作:
<role rolename="manager-gui"/>
<role rolename="manager-jmx"/>
<user username="tomcat-jmx" password="<YOUR_PASSWORD>" roles="manager-jmx,manager-gui" />
複製程式碼
此程式碼段首先定義了我們要分配給使用者的兩個角色。然後,它建立一個新的 tomcat-jmx
使用者,為其分配這些角色,併為使用者設定密碼。如果您使用全新安裝的Tomcat,則需要建立一個新使用者; 否則,您可以將角色分配給現有使用者。
Tomcat Manager的Web介面
預設情況下,可以從 http://localhost:8080
本地訪問Tomcat Manager,你也可以在Tomcat的伺服器配置檔案中進行更改。當你訪問Web介面前,系統將提示您登入。主要的資料指標如下:
-
伺服器和應用程式狀態頁面 :顯示JVM,聯結器和應用程式指標的高階概述,包括記憶體使用,執行緒計數和請求處理時間
-
應用程式管理器 :提供診斷工具,用於調查應用程式中的記憶體洩漏
-
JMX代理 :用於查詢Tomcat指標的基於文字的介面
Tomcat的伺服器狀態頁面
應用程式和伺服器狀態的高階檢視 ,可以導航到 /manager/status
頁面或單擊主頁上的“Server Status”按鈕。此頁面包含有關Tomcat伺服器及其AJP和HTTP聯結器的資訊,以及JVM的記憶體使用情況。
每個聯結器部分顯示有關執行緒使用情況的資訊(例如,最大執行緒數,當前執行緒數和當前繁忙執行緒數)以及請求吞吐量和效能(例如,處理時間,錯誤計數和接收的位元組數),以及每個聯結器的資訊。
每個執行緒在處理請求時都會經歷一系列階段:
-
**就緒(Ready):**該執行緒可用於處理請求。
-
**解析和準備請求(Parse and prepare request):**該執行緒正在解析請求頭或準備讀取請求的主體。
-
**服務(Service):**執行緒正在處理並生成傳入請求的響應。
-
**完成(Finishing):**執行緒已完成處理請求並將生成的響應傳送回客戶端。
-
**Keep-Alive:**執行緒保持連線開啟,以便同一客戶端傳送另一個請求。此階段的最長持續時間由伺服器配置檔案中設定的
keepAliveTimeout
值確定。連線超時後,執行緒返回就緒階段。
執行緒階段可以幫助您準確地衡量準備接受傳入請求的執行緒數。您還可以在伺服器狀態頁面上的Tomcat應用程式列表中檢視每個已部署應用程式的請求計數。
Tomcat應用程式狀態頁面
如果要檢視所有已部署應用程式的狀態,您可以導航到 manager/status/all
頁面。此頁面(頁面往下拉)列出了所有應用程式,包括Tomcat Manager本身,因此您可以快速檢視處理時間,活動會話以及為每個應用程式載入的JSP servlet數量。
應用程式管理器
要執行診斷程式,您可以在 /manager/html
導航到Tomcat的應用程式管理器介面,或者單擊Tomcat Manager主頁上的“Manager App”按鈕。應用程式管理器提供了一個用於快速管理應用程式的簡單介面,以及用於排除記憶體洩漏故障的診斷部分。
“Find leaks”按鈕可以對應用程式中的記憶體洩漏執行診斷檢查。當垃圾收集器無法通過刪除應用程式不再需要的物件來釋放工作記憶體時,會發生記憶體洩漏。這會導致應用程式使用更多資源,直到它用完為止,從而產生致命的記憶體錯誤甚至記憶體溢位。請注意,應謹慎使用此診斷檢查,因為它會觸發垃圾回收,對效能有一定的影響。
這個介面只是簡單的訪問Tomcat伺服器的狀態,使您能夠快速檢視相關資料。後面的章節會有詳細的講解。
查詢Tomcat指標
Tomcat Manager可以使用 manager-jmx
角色訪問JMX代理servlet,該角色允許您從Web瀏覽器查詢。您可以在 http://localhost:8080/manager/jmxproxy
找到Tomcat的可用MBean列表(純文字格式)。
如果要查詢特定MBean的資料,可以按以下格式將引數新增到MBean的域,型別,名稱和屬性的URL中:
http://localhost:8080/manager/jmxproxy/?get=<DOMAIN>:type=<TYPE>,name="<NAME>"&att=<JMX_ATTRIBUTE>
複製程式碼
在上述的JMX屬性和MBean列中找到這些引數。您可以使用以下命令檢視HTTP聯結器的最大請求處理時間的資料:
http://localhost:8080/manager/jmxproxy/?get=Catalina:type=GlobalRequestProcessor,name="http-nio-8080"&att=maxTime
複製程式碼
這將產生以下結果:
OK - Attribute get 'Catalina:type=GlobalRequestProcessor,name="http-nio-8080"' - maxTime = 189`
複製程式碼
命令模式使用起來比較複雜並且不直觀,同時不能比較多個指標或檢視資料隨時間的變化情況。為了更深入地瞭解Tomcat的執行狀況和效能,我們需要使用其他工具,如JConsole。
為Tomcat監視工具啟用遠端JMX連線
在使用JConsole監視Tomcat伺服器之前,需要為JMX啟用遠端連線。JConsole可能會消耗大量系統資源,因此Oracle 建議僅通過連線到遠端主機,將JConsole與正在監視的伺服器隔離。請注意,啟用遠端JMX訪問需要適當的安全預防措施,因為JMX提供有限制的訪問控制。為了演示的方便,我們禁用SSL。
首先,在Tomcat的**/ bin目錄中建立一個setenv.sh**檔案,幷包含以下內容:
export JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote" export
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.port=<PORT>" export
JAVA_OPTS="${JAVA_OPTS} -Djava.rmi.server.hostname=<TOMCAT_HOST_OR_IP>" export
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.ssl=false" export
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.authenticate=true" export
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.access.file=${CATALINA_BASE}/conf/jmxremote.access export
JAVA_OPTS="${JAVA_OPTS} -Dcom.sun.management.jmxremote.password.file=${CATALINA_BASE}/conf/jmxremote.password
複製程式碼
這將設定JConsole可用於遠端連線到Tomcat伺服器的主機名和埠。您可以指定任何主機名和未使用的埠。雖然此示例不包含SSL,但它確實啟用了密碼驗證,並指定了在何處查詢訪問(使用者名稱)和密碼檔案; 如果它們尚不存在,您可能需要建立它們。您可以通過編輯**$ {CATALINA_BASE} /conf/jmxremote.access**檔案來新增新使用者併為他們提供兩種許可權之一( readonly
和 readwrite
):
tomcatUserRead readonly
tomcatUserWrite readwrite
複製程式碼
第一行授予 tomcatUserRead
使用者 readonly
許可權,這意味著該使用者可以檢視MBean屬性並接收通知。
第二行 tomcatUserWrite
使用者提供了 readwrite
許可權,允許該使用者新增和刪除MBean,設定屬性和執行操作。
接下來,在**$ {CATALINA_BASE} /conf/jmxremote.password**檔案中為這些使用者設定密碼:
tomcatRead <PASSWORD> tomcatWrite <PASSWORD>
複製程式碼
儲存檔案並重新啟動Tomcat伺服器。接下來,開啟JConsole並執行以下命令,確保包含您在setenv.sh檔案中定義的主機和埠:
jconsole <TOMCAT_HOST_OR_IP>:<PORT>
複製程式碼
這將開啟JConsole介面,您可以在其中開始檢視與JVM和Tomcat伺服器相關的資料。
使用JConsole
JConsole是JDK附帶的圖形介面。JConsole提供了一種更直觀的方式來監視關鍵JVM指標,如堆記憶體使用情況,執行緒使用情況和CPU使用情況。而不是通過有限的介面(如JMX代理)查詢資料,您可以使用JConsole快速檢視多個指標的資料,並深入檢視Tomcat的Catalina和JVM的java.lang域的特定MBean型別和屬性。您可以導航到六個不同的選項卡:概覽,記憶體,執行緒,類,VM摘要和MBean。每個選項卡都提供一個下拉選單,使您可以檢視作用於不同時間範圍的資料,例如最近五分鐘,過去一個月或從伺服器開始(在下拉列表中顯示為“全部”選項)。
概覽
JConsole的Overview選項卡顯示了與JVM的記憶體使用情況,執行緒數,應用程式載入的Java類以及CPU使用率相關的資訊,因此您可以一目瞭然地監視虛擬機器器的執行狀況。
VM摘要
在“VM摘要”選項卡中,您可以檢視有關JVM體系結構及其特徵的更多詳細資訊。如果您需要快速檢視系統級屬性或JVM配置設定,這將非常有用。這包括您在Tomcat的**/bin/setenv.sh**配置檔案中指定的任何引數。
記憶體
在“記憶體”選項卡下,您可以檢視有關虛擬機器器堆和非堆記憶體使用情況的更詳細統計資訊,以及有關記憶體池的資料。在此選項卡中,您可以單擊“執行GC”以執行垃圾回收,就像在Tomcat管理器中一樣。
如果需要檢視與特定記憶體池相關的資料,可以從“記憶體”選項卡左上角的“圖表”下拉列表中選擇該資料。
執行緒
JConsole的“執行緒”選項卡提供有關可用JVM執行緒的更多詳細資訊以及對死鎖執行緒的檢查。“執行緒”列表顯示執行緒名稱,狀態(類似於您在Tomcat的伺服器狀態頁面上看到的執行緒“階段”),以及每個可用執行緒的堆疊跟蹤。死鎖檢查對於查詢可能導致應用程式掛起的執行緒非常有用。如果找到任何死鎖執行緒,您將看到一個新的死鎖選項卡,其中包含有關導致死鎖的更多資訊。
MBean
要檢視與您正在監視的Tomcat指標相關的實時資料,您可以在MBeans選項卡下檢視Catalina和java.lang域,並深入檢視特定屬性。與Tomcat Manager一樣,JConsole從MBean伺服器收集資料,但提供了一個更簡單的介面來查詢所需的指標。
JConsole提供了JVM和MBean資料的完美摘要,它使您能夠繪製JVM資料圖形,以視覺化資源使用趨勢。
自定義Tomcat訪問和伺服器日誌
預設情況下,Tomcat訪問日誌使用公共日誌格式 ,並記錄伺服器處理的所有請求。您可以在Tomcat的conf / server.xml配置檔案中檢視訪問日誌中包含的內容:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />`
複製程式碼
Valve
元素的 pattern
屬性指定應包含在每個日誌條目中的每個請求(及其響應)的資訊:
-
發出請求的客戶端的主機名或IP地址(
%h
) -
來自identd服務的使用者名稱(總是返回' - ')(
%l
) -
經過身份驗證的使用者名稱(返回
-
如果未使用)(%u
) -
請求的日期和時間(
%t
) -
請求方法和URI(
%r
) -
響應的HTTP狀態程式碼(
%s
) -
返回給客戶端的物件大小,以位元組為單位(
%b
)
上面示例中使用的模式將按以下格式記錄請求:
192.168.33.1 - - [21/Sep/2018:16:51:59 +0000] "GET /sample/ HTTP/1.1" 403 1145
複製程式碼
Tomcat預設也會生成伺服器日誌,並使用java.util.logging 包來實現 。伺服器日誌顯示與Tomcat JVM和Catalina伺服器相關的資訊,包括記憶體不足(OOM)錯誤和部署活動,如下例所示:
16-Oct-2018 18:37:08.624 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 16-Oct-2018 18:37:08.625 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/9.0.10 16-Oct-2018 18:37:08.629 SEVERE [main] org.apache.catalina.startup.HostConfig.beforeStart Unable to create directory for deployment: [/opt/tomcat/conf/Catalina/localhost] 16-Oct-2018 18:37:08.672 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/webapps/sample.war] 16-Oct-2018 18:37:09.341 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/webapps/sample.war] has finished in [667] ms
複製程式碼
Tomcat將伺服器日誌寫入控制檯和Catalina日誌檔案(例如, catalina.2018-07-03.log)。您可以自定義Tomcat應記錄的資訊型別,例如Tomcat日誌記錄屬性檔案( conf / logging.properties )中的最小日誌級別,輸出目錄和輸出格式。
處理程式是處理傳入日誌訊息並格式化其輸出的Java元件,使用格式化程式記錄到檔案( FileHandler
)或控制檯( ConsoleHandler
)。Tomcat的日誌記錄屬性檔案包括Catalina伺服器,Tomcat Manager和已部署的Web應用程式日誌的配置:
############################################################
# Handler specific properties. # Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.FileHandler.level = FINE 1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE 2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.FileHandler.prefix = localhost.
3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384 java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
############################################################
# Facility specific properties. # Provides extra control for each logger.
############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
2localhost.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].
[/manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \ 3manager.org.apache.juli.FileHandler
複製程式碼
預設情況下,Tomcat為其處理程式( FINE
)和工具( INFO
)設定兩個不同的日誌級別。FINE
日誌級別包括有關伺服器活動的詳細資訊, INFO
級別記錄更高階別的資訊性訊息。處理程式屬性整體管理Tomcat日誌,而工具屬性使您可以管理每個已部署應用程式的配置,包括Tomcat Manager。例如,要調整Tomcat Manager的日誌級別,可以編輯以下處理程式和工具屬性:
1. `3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = ${catalina.
複製程式碼
總結
通過設定一些簡單許可權,您可以立即開始使用Tomcat Manager檢視Tomcat和JVM資料。一旦為JMX啟用了遠端連線,就可以使用JConsole等工具通過簡單的圖形介面監控Tomcat資料。Tomcat還在其訪問和伺服器日誌中提供有關請求和伺服器活動的基本診斷資訊。
你的贊和關注是我繼續創作的動力~