我在tomcat 8.5.63版本和Java 1.8版本上部署了应用程序。每当我部署应用程序时,tomcat 默认都会为 JMX rmi 打开 tcp 端口 1099。我可以使用 jvisualvm 工具连接到远程客户端,而无需进行任何身份验证。我不希望默认情况下打开该端口。我尝试根据 SO 中的其他解决方案更改各种 jvm 参数,但没有成功。 下面给出的是我最近尝试过的配置。
CATALINA_OPTS="-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=16105 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.login.config=Tomcat -Djava.security.auth.login.config=$CATALINA_HOME/login.config -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access -Dcom.sun.management.jmxremote.rmi.port=16106
我特别提到了 -Dcom.sun.management.jmxremote.rmi.port=16106 用于 JMX rmi,但无法理解为什么它仍然监听端口 1099。请指教。
注意:我确实看到一些答案提到传递 XX:+DisableAttachMechanism 作为 jvm 参数来阻止 jxm。但是如果我们想要同时启用 jxm 并且不应该使用默认端口(1099)怎么办?
检查您在 Tomcat 服务器上运行的项目是否使用了
activemq-broker
从版本 5.12.x 到 5.15.x 的库?
如果您的项目是 Spring Boot 并使用下面的依赖项,则有可能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
然后有一个VM选项
org.apache.activemq.broker.jmx.createConnector
默认设置为true
。
它将导致 JMX 连接器被创建并在默认端口上运行
1099
。
要通过另外使用 VM 选项或系统属性启动应用程序来禁用它。例如:
java -Dorg.apache.activemq.broker.jmx.createConnector=false \
-jar jmx/target/jmx-1.0-SNAPSHOT.jar
旁注:5.16.x 中的
activemq-broker
版本默认将此选项设置为 false
。