web server apache tomcat11-21-monitor and management 監控與管理

老马啸西风發表於2024-04-25

前言

整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。

開源專案

從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。

系列文章

web server apache tomcat11-01-官方文件入門介紹

web server apache tomcat11-02-setup 啟動

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

簡介

監控是系統管理的關鍵方面。檢視執行中的伺服器,獲取一些統計資訊或重新配置應用程式的某些方面都是日常管理任務。

啟用 JMX 遠端

注意:只有在您要遠端監視 Tomcat 時才需要此配置。如果您打算使用與 Tomcat 執行的相同使用者在本地監視它,則不需要此配置。

Oracle 網站包含了有關選項列表以及如何在 Java 11 上配置 JMX 遠端的資訊:Java 11 JMX 遠端配置

以下是 Java 11 的快速配置指南:

在 Tomcat 的 setenv.bat 指令碼中新增以下引數(有關詳細資訊,請參閱 RUNNING.txt)。
注意:此語法適用於 Microsoft Windows。命令必須在同一行上。它被包裝以增加可讀性。如果 Tomcat 作為 Windows 服務執行,請使用其配置對話方塊為服務設定 Java 選項。對於 Linux、MacOS 等,請從行的開頭刪除 "set "。

set CATALINA_OPTS=-Dcom.sun.management.jmxremote.port=%my.jmx.port%
  -Dcom.sun.management.jmxremote.rmi.port=%my.rmi.port%
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false

如果不設定 com.sun.management.jmxremote.rmi.port,則 JSR 160 JMX-Adaptor 將隨機選擇一個埠,這將使得配置防火牆以允許訪問變得困難。

如果需要 TLS:

更改並新增以下內容:

  -Dcom.sun.management.jmxremote.ssl=true
  -Dcom.sun.management.jmxremote.registry.ssl=true

要配置協議和/或密碼套件,請使用:

  -Dcom.sun.management.jmxremote.ssl.enabled.protocols=%my.jmx.ssl.protocols%
  -Dcom.sun.management.jmxremote.ssl.enabled.cipher.suites=%my.jmx.cipher.suites%

對於客戶端證書身份驗證,請使用:

  -Dcom.sun.management.jmxremote.ssl.need.client.auth=%my.jmx.ssl.clientauth%

如果需要授權(強烈建議始終使用身份驗證的 TLS):

更改並新增以下內容:

  -Dcom.sun.management.jmxremote.authenticate=true
  -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
  -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

編輯訪問授權檔案 $CATALINA_BASE/conf/jmxremote.access:

monitorRole readonly
controlRole readwrite

編輯密碼檔案 $CATALINA_BASE/conf/jmxremote.password:

monitorRole tomcat
controlRole tomcat

提示:密碼檔案應該是隻讀的,並且只能被 Tomcat 執行的作業系統使用者訪問。

或者,您可以使用以下配置 JAAS 登入模組:

  -Dcom.sun.management.jmxremote.login.config=%login.module.name%

如果需要指定用於傳送到客戶端的 RMI 存根的主機名(例如,因為必須使用的公共主機名與本地主機名不同),則可以設定:

set CATALINA_OPTS=-Djava.rmi.server.hostname

如果需要為 JMX 服務繫結到的特定介面,請設定:

set CATALINA_OPTS=-Dcom.sun.management.jmxremote.host

使用 JMX 遠端 Ant 任務管理 Tomcat

為了簡化 Ant 中的 JMX 使用,提供了一組可用於 antlib 的任務。

antlib:將 catalina-ant.jar 從 $CATALINA_HOME/lib 複製到 $ANT_HOME/lib。

以下示例顯示了 JMX Accessor 的用法:

注意:這裡對 name 屬性值進行了包裝以增加可讀性。它必須全部在同一行上,沒有空格。

<project name="Catalina Ant JMX"
      xmlns:jmx="antlib:org.apache.catalina.ant.jmx"
      default="state"
      basedir=".">
  <property name="jmx.server.name" value="localhost" />
  <property name="jmx.server.port" value="9012" />
  <property name="cluster.server.address" value="192.168.1.75" />
  <property name="cluster.server.port" value="9025" />

  <target name="state" description="Show JMX Cluster state">
    <jmx:open
      host="${jmx.server.name}"
      port="${jmx.server.port}"
      username="controlRole"
      password="tomcat"/>
    <jmx:get
      name=
"Catalina:type=IDataSender,host=localhost,
senderAddress=${cluster.server.address},senderPort=${cluster.server.port}"
      attribute="connected"
      resultproperty="IDataSender.backup.connected"
      echo="false"
    />
    <jmx:get
      name="Catalina:type=ClusterSender,host=localhost"
      attribute="senderObjectNames"
      resultproperty="senderObjectNames"
      echo="false"
    />
    <!-- get current maxActiveSession from ClusterTest application
       echo it to Ant output and store at
       property <em>clustertest.maxActiveSessions.original</em>
    -->
    <jmx:get
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      attribute="maxActiveSessions"
      resultproperty="clustertest.maxActiveSessions.original"
      echo="true"
    />
    <!-- set maxActiveSession to 100
    -->
    <jmx:set
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      attribute="maxActiveSessions"
      value="100"
      type="int"
    />
    <!-- get all sessions and split result as delimiter <em>SPACE</em> for easy
       access all session ids directly with Ant property sessions.[0..n].
    -->
    <jmx:invoke
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      operation="listSessionIds"
      resultproperty="sessions"
      echo="false"
      delimiter=" "
    />
    <!-- Access session attribute <em>Hello</em> from first session.
    -->
    <jmx:invoke
      name="Catalina:type=Manager,context=/ClusterTest,host=localhost"
      operation="getSessionAttribute"
      resultproperty="Hello"
      echo="false"
    >
      <arg value="${sessions.0}"/>
      <arg value="Hello"/>
    </jmx:invoke>
    <!-- Query for all application manager.of the server from all hosts
       and bind all attributes from all found manager MBeans.
    -->
    <jmx:query
      name="Catalina:type=Manager,*"
      resultproperty="manager"
      echo="true"
      attributebinding="true"
    />
    <!-- echo the create properties -->
<echo>
senderObjectNames: ${senderObjectNames.0}
IDataSender.backup.connected: ${IDataSender.backup.connected}
session: ${sessions.0}
manager.length: ${manager.length}
manager.0.name: ${manager.0.name}
manager.1.name: ${manager.1.name}
hello: ${Hello}
manager.ClusterTest.0.name: ${manager.ClusterTest.0.name}
manager.ClusterTest.0.activeSessions: ${manager.ClusterTest.0.activeSessions}
manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED:
 ${manager.ClusterTest.0.counterSend_EVT_SESSION_EXPIRED}
manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS:
 ${manager.ClusterTest.0.counterSend_EVT_GET_ALL_SESSIONS}
</echo>

  </target>

</project>

相關文章