簡體   English   中英

遠程 JMX 連接

[英]Remote JMX connection

我正在嘗試打開一個到遠程機器上運行的 java 應用程序的 JMX 連接。

應用程序 JVM 配置有以下選項:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port=1088
  • com.sun.management.jmxremote.authenticate=false
  • com.sun.management.jmxremote.ssl=false

我可以使用 jconsole 或 jvisualvm 使用localhost:1088進行連接。 但我無法從遠程機器使用xxx.xxx.xxx.xxx:1088進行連接。

服務器之間或操作系統上沒有防火牆。 但是為了消除這種可能性,我telnet xxx.xxx.xxx.xxx 1088並且我認為它已連接,因為控制台屏幕變為空白。

兩台服務器都是 Windows Server 2008 x64。 用 64 位 JVM 和 32 位嘗試過,都不起作用。

如果是在 Linux 上,問題將是localhost 是環回接口,您需要應用程序綁定到您的網絡接口

您可以使用 netstat 來確認它沒有綁定到預期的網絡接口。

您可以通過使用系統參數java.rmi.server.hostname="YOUR_IP"作為環境變量或使用

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

我花了一天多的時間試圖讓 JMX 在本地主機之外工作。 似乎 SUN/Oracle 未能提供關於此的良好文檔。

確保以下命令為您返回真實 IP 或 HOSTNAME。 如果它確實返回了 127.0.0.1、127.0.1.1 或 localhost 之類的內容,它將無法工作,您必須更新/etc/hosts文件。

hostname -i

這是從外部啟用 JMX 所需的命令

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

正如您所假設的, myserver.example.com 必須匹配hostname -i返回的內容。

顯然,您需要確保防火牆不會阻止您,但我幾乎可以肯定這不是您的問題,問題是最后一個未記錄的參數。

在我對 Tomcat 和 Java 8 的測試中,除了為 JMX 指定的端口之外,JVM 還打開了一個臨時端口。 以下代碼修復了我; 如果您在 JMX 客戶端(例如VisualVM未連接)方面遇到問題,請嘗試一下。

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

另請參閱為什么在配置 JMX 時 Java 打開 3 個端口?

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

如果您嘗試訪問位於 NAT 后面的服務器 - 您很可能必須使用該選項啟動您的服務器

-Djava.rmi.server.hostname=<public/NAT address>

以便發送到客戶端的 RMI 存根包含服務器的公共地址,允許客戶端從外部訪問它。

看來你的結束語來得太早了。 它應該在最后一個參數之后。

這個技巧對我有用。

我注意到一些有趣的事情:當我使用以下命令行啟動我的應用程序時:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

如果我嘗試使用 jconsole 從遠程機器連接到此端口,則 TCP 連接成功,在遠程 jconsole 和部署我的 MBean 的本地 jmx 代理之間交換一些數據,然后,jconsole 顯示連接錯誤消息。 我執行了一個wireshark捕獲,它顯示了來自代理和jconsole的數據交換。

因此,這不是網絡問題,如果我在有或沒有 java.rmi.server.hostname 系統屬性的情況下執行 netstat -an,我有以下綁定:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

這意味着在這兩種情況下,在端口 9999 上創建的套接字接受來自任何地址上的任何主機的連接。

我認為這個系統屬性的內容在連接的某個地方使用,並與代理用來與 jconsole 通信的實際 IP 地址進行比較。 如果這些地址不匹配,則連接失敗。

使用 jconsole 從同一台主機連接時,我沒有遇到這個問題,只有從真正的物理遠程主機連接。 所以,我認為只有當連接來自“外部”時才會進行此檢查。

對我有用的是設置 /etc/hosts 將主機名指向 ip 而不是環回接口,然后重新啟動我的應用程序。

貓 /etc/hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

這是我的配置:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

非常感謝,它是這樣工作的:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false - dcom.sun.management.jmxremote.port=25000 -jar myjar .jar

我知道這個線程已經很老了,但是還有一個額外的選項會很有幫助。 見這里: https : //realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/

-Dcom.sun.management.jmxremote.rmi.port=1099

我有同樣的問題,我將與本地主機名匹配的任何主機名更改為 0.0.0.0,這樣做后似乎可以工作。

要啟用 JMX 遠程,請將下面的 VM 參數與 JAVA 命令一起傳遞。

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in

試試這個,我測試訪問 docker 容器內的 JMX

-Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.port=16000 -Dcom.sun.management.jmxremote.rmi.port=16000 -Dcom.sun .management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

然后

$ jconsole 本地主機:16000

嘗試使用高於 3000 的端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM