Tomcat(82)如何在Tomcat中启用远程JMX?

275 阅读2分钟

在Tomcat中启用远程JMX可以让你通过网络远程监控和管理Tomcat服务器。以下是详细的步骤和代码示例,帮助你在Tomcat中启用远程JMX。

步骤1:配置Tomcat的启动脚本

你需要在Tomcat的启动脚本 (catalina.shcatalina.bat) 中添加JMX相关的系统属性。

编辑 catalina.sh(适用于Linux/Unix/macOS)

catalina.sh中找到以下行:

# OS specific support.  $var _must_ be set to either true or false.

在该行之前添加以下内容:

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9010"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=9010"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=true"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=your.server.ip"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access"

编辑 catalina.bat(适用于Windows)

catalina.bat中找到以下行:

rem OS specific support.  $var _must_ be set to either true or false.

在该行之前添加以下内容:

set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.port=9010"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.rmi.port=9010"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.authenticate=true"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.ssl=false"
set "CATALINA_OPTS=%CATALINA_OPTS% -Djava.rmi.server.hostname=your.server.ip"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.password.file=%CATALINA_BASE%/conf/jmxremote.password"
set "CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.access.file=%CATALINA_BASE%/conf/jmxremote.access"

在这些配置中:

  • com.sun.management.jmxremote:启用JMX远程监控。
  • com.sun.management.jmxremote.port:设置JMX连接的端口。
  • com.sun.management.jmxremote.rmi.port:设置RMI连接的端口。
  • com.sun.management.jmxremote.authenticate:是否启用JMX连接的认证。
  • com.sun.management.jmxremote.ssl:是否启用JMX连接的SSL。
  • java.rmi.server.hostname:设置RMI服务器的主机名。
  • com.sun.management.jmxremote.password.filecom.sun.management.jmxremote.access.file:设置JMX的用户名和权限文件。

步骤2:配置JMX认证文件

为了确保安全,你需要配置JMX的认证文件。这包括jmxremote.passwordjmxremote.access文件。

创建 jmxremote.password

$CATALINA_BASE/conf目录下创建一个名为jmxremote.password的文件:

monitorRole  secret
controlRole  secret

创建 jmxremote.access

$CATALINA_BASE/conf目录下创建一个名为jmxremote.access的文件:

monitorRole  readonly
controlRole  readwrite \
  create javax.management.monitor.*,javax.management.timer.* \
  unregister

确保这两个文件具有适当的权限,仅允许Tomcat进程读取:

chmod 600 $CATALINA_BASE/conf/jmxremote.password
chmod 600 $CATALINA_BASE/conf/jmxremote.access

步骤3:启动Tomcat

配置完毕后,重新启动Tomcat:

catalina.sh start

或者在Windows上:

catalina.bat start

步骤4:连接到远程JMX

你可以使用JConsole或其他JMX客户端连接到Tomcat的JMX服务。以下是通过Java代码连接到远程JMX的示例:

示例代码

import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.HashMap;
import java.util.Map;

public class JMXClient {
    public static void main(String[] args) throws Exception {
        String hostname = "your.server.ip";
        int port = 9010;
        String urlPath = "/jndi/rmi://" + hostname + ":" + port + "/jmxrmi";
        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + hostname + ":" + port + "/jmxrmi");

        // 设置JMX连接的认证信息
        Map<String, Object> env = new HashMap<>();
        String[] credentials = {"controlRole", "secret"};
        env.put(JMXConnector.CREDENTIALS, credentials);

        JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

        // 获取Tomcat的Catalina MBean
        String[] domains = mbsc.getDomains();
        for (String domain : domains) {
            if (domain.contains("Catalina")) {
                System.out.println("Found Catalina domain: " + domain);
                // 获取MBean信息
                // ...
            }
        }
        jmxc.close();
    }
}

在这个示例中,我们创建了一个JMXServiceURL来指定JMX服务的地址,连接到JMX服务,并获取MBeanServerConnection。然后,我们遍历所有域,查找包含"Catalina"的域,这通常是Tomcat的MBean域。

通过上述步骤和代码示例,你可以在Tomcat中启用远程JMX,并通过网络远程监控和管理Tomcat服务器。