【问题标题】:Why Tomcat server is accessible thru jmxrmi port 1099为什么可以通过 jmxrmi 端口 1099 访问 Tomcat 服务器
【发布时间】:2021-03-27 02:53:00
【问题描述】:

我的理解是,如果我们配置以下属性,可以通过 jmxrmi 访问 tomcat 服务器。端口也可以配置。

-Dcom.sun.management.jmxremote.port=30000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=xyz
-Dcom.sun.management.jmxremote.access.file=xyz

之后,可以通过 jconsole 或 jvisualvm 等一些 jmx 工具连接 tomcat 服务器。但我也注意到,同样的 tomcat 服务器也可以连接到默认的 jmxrmi 端口 1099。我没有在任何地方配置端口 1099。即使我评论以上所有属性,我看到tomcat仍然可以连接到jvisualvm的1099端口。

请建议,什么可能会在默认端口上启用此连接。以及如何禁用此连接?

类路径中的其他一些第三方库可能正在这样做,但如何确定是哪一个?

【问题讨论】:

  • Tomcat 版本? JVM 版本?
  • Tomcat 版本 8.0.30 和 Jdk8 (jdk 8.1_144)

标签: java tomcat server rmi jmx


【解决方案1】:

JMX 使用两个端口:一个用于 JMX 连接(您已将其设置为端口 30000),另一个用于 RMI 通信。 Java 默认使用 1099 端口,但如果正在使用,它将选择 1099 之后的第一个可用端口。在 Java 8 中,您无法通过系统属性显式设置此端口。

对于以后的Java版本,可以使用系统属性com.sun.management.jmxremote.rmi.port

Tomcat 对此有一个解决方法。您可以使用JmxRemoteLifecycleListener 设置rmiServerPortPlatform 属性。将其设置为您喜欢的任何端口。

请注意,您不能禁用第二个端口:需要 JMX 才能正常运行。

【讨论】:

  • 感谢@Christopher Schultz。您能否还告诉如果不能访问 tomcat,那么要做什么。我注意到当我没有这些 jmxremote 属性作为 jvm 参数时。仍然可以连接到 1099 端口。
  • 如果要禁用 JMX,为什么要为 JMX 配置 JVM?你可以看看this answer
  • 感谢@Christopher Schultz。是否可以在 rmi 端口上添加一些身份验证机制。真正令人担忧的是,jmxremote 上的连接受身份验证保护,但 1099 上的连接不受保护。
  • RMI 端口应该只服务于类定义。你应该不能通过 RMI 调用任何东西。如果您想完全控制身份验证,您可能需要考虑切换到 Tomcat 的 JMXProxyServlet,它是 Manager 应用程序的一部分。它使用 HTTP 而不是 JMX,并且您可以随意使用 Web 应用程序通常可用的所有身份验证选项。
  • Christopher Schultz - 抱歉,我正在更改已接受的答案。实际上,我确实有其他一些具有类似配置的 tomcat 服务器,它们没有在端口 1099 上侦听。这些 tomcat 实例也能够很好地执行所有 JMX 操作。那么这里缺少的链接是什么。有些服务器正在侦听端口 1099,有些则没有。这是我需要弄清楚的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多