簡體   English   中英

JMX:無法從Windows框連接到Linux系統上的JMX端口

[英]JMX : cant connect from Windows box to monitor JMX port on a Linux system

我在JDK1.6中有jconsole.exe和JVisualVM.exe的很多經驗,並且已經通過JMX.remote從Windows JVM連接到另一台機器上的Windows JVM數千次,但是當我嘗試監視時它失敗了一個在Linux主機上運行的java實例(來自Windows主機,我在redhat上嘗試了JMX監聽器,在Amazon EC2上嘗試了SUSE)。 我也嘗試使用jconsole.exe並得到類似的錯誤。

是否有任何人可以想到的原因,為什么這種JMX連接會有問題。 我可以嘗試任何想法嗎? 有沒有人“實際”做到這一點,可以說如果我堅持下去會有效嗎?

我從JVisualVM獲得的錯誤(在遠程連接嘗試中)是這樣的:

"Cannot connect using service:jmx:rmi:///jndi/rmi://<jmx service ip>:8001/jmxrmi"

我的遠程JMX服務配置是這樣的:

 -Dcom.sun.management.jmxremote
 -Dcom.sun.management.jmxremote.port=8001
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.hostname=<jmx service ip>

此鏈接中發現了類似的問題,但它沒有回答我的問題。

我確認“iptables”沒有作為服務啟用而且沒有打開,所以我沒有成像,有任何類型的防火牆阻塞。 此外,Windows和Linux機器都在10.0.0.0私有內部子網上。 我能夠telnet到端口8001來驗證它的存在,並在linux機器上監聽它(netstat -ap)。

請參閱系統屬性java.rmi.server.hostname 在Linux服務器JVM上,將此系統屬性設置為主機的公共IP。 然后在您的客戶端JMX URL中使用公共IP。

我認為您的問題是RMI實現很難通過防火牆來處理,例如它需要的不僅僅是您指定的端口才能工作。 如果您連接到自己的計算機或同一網絡上的計算機,通常不會注意到的事情。 這篇文章描述了你將遇到的問題

如果我是你,我會嘗試將jmxmp設置為替代協議。 為此,您需要添加jmxremote_optional.jar(從Oracle免費下載, 從此處下載“JMX Remote API 1.0.1_04參考實現” )到服務器和jvisualvm類路徑,但這是值得的。

如果你google for jmxmp你會發現很多關於如何設置的例子,我的第一個點擊是http://pub.admc.com/howtos/jmx/distributed-chapt.html#jmxmp-sect有點過於面向代碼,但無論如何我都在這里添加它,因為它解釋了像jmxmp這樣的東西,在一些好的句子中。

如何定義服務器端端點取決於您正在運行的內容。 大多數應用服務器都允許您輸入啟用jmxmp的jmx服務URL,但如果服務器是從頭開始編寫的,您可能需要自己在代碼中設置它,而不是使用-D開關到您習慣的java。

如果您遇到問題,請嘗試並返回更具體的問題。

編輯:將jar添加到類路徑后,您在代碼中必須做的唯一事情(假設您沒有使用已經為您處理它的服務器應用程序)如下(省略聲明,異常處理等等)無論如何你會弄清楚):

url=new JMXServiceURL(jmxurl);
this.server = JMXConnectorServerFactory.newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer());
this.server.start();

您是否嘗試過從Windows機器創建到Linux機箱的SSH隧道? http://oldsite.precedence.co.uk/nc/putty.html

或者如果您有cygwin,只需嘗試ssh -f your-user@remote-server.com -L 7777:remote-server.com:123 -N其中7777是您的Windows機器上的端口, 123是該端口上的端口偵聽JMX命令的遠程Linux框。

使用上述任一方法,您可以在Windows框中使用jconsole或visualvm並連接到localhost:7777

我知道iptables已被禁用,但只需通過SSH連接到Linux框並嘗試使用jconsole的命令行JMX模式(在Linux機器上)來確認JMX在該端口上正常工作。

我實際上只是自己解決了這個問題並弄明白了。

我打賭問題是RMI連接 - 你無法預測它將使用哪些端口,所以你不能讓它與防火牆一起工作。

解決方法是使用SSH代理:

  1. SSH到運行應用程序的框但是使用-D選項,如下所示:

    ssh user @ remoteHost -D 9999

    當你在Windows上時,你可以使用Cygwin來運行上面的命令,或者你也可以通過GUI對Putty做同樣的事情(指南: http//blog.ashurex.com/2012/03/15/creating- ssh-proxy-tunnel-putty /

    這將在端口9999上的本地計算機上啟動socks代理。

  2. 打開JVisualVM,在首選項中,在“network”下將其配置為在localhost上使用socks代理,在端口9999上。

如果您執行上述操作,則應該能夠正常連接到遠程計算機,並且因為所有RMI流量現在都通過SSH代理,所以它通過防火牆打孔並且運行良好。

祝好運 :-)

暫無
暫無

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

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