2011-03-21 75 views
3

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

有什麼理由可以想到爲什麼這種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> 

發現在類似的問題this link但它沒有回答我的問題。

我確認「iptables」沒有啓用作爲服務,並且沒有啓動,所以我沒有任何形式的防火牆阻止。另外,windows和linux機器都在一個10.0.0.0私有內部子網上。我能夠遠程登錄到8001端口來驗證它的存在,並在linux機器上偵聽(netstat -ap)。

回答

6

查看系統屬性java.rmi.server.hostname。在您的Linux服務器JVM上,將此係統屬性設置爲主機的公共IP。然後在您的客戶端JMX URL中使用公共IP。

+0

指向java文檔的鏈接已損壞 – harschware 2017-01-17 18:54:59

+1

對不起...更新後的鏈接。我猜沒有人再使用Java 1.4了.... :) – Nicholas 2017-01-17 20:05:48

2

我認爲你的問題是RMI的實現有點難以通過防火牆來工作,比如它需要比指定的端口更多的工作。如果您連接到自己的機器或同一網絡上的一臺機器,您通常不會注意的事情。 This post describes the problems you will run into quite well

如果我是你,我會嘗試設置jmxmp作爲替代協議。爲此,您需要將jmxremote_optional.jar(從Oracle免費下載,請下載"JMX Remote API 1.0.1_04 Reference Implementation" from here)添加到服務器和jvisualvm類路徑中,但這是值得的。

如果你是谷歌的jmxmp,你會發現很多關於如何設置的例子,我的第一個命中之一是http://pub.admc.com/howtos/jmx/distributed-chapt.html#jmxmp-sect,它可能有點過於面向代碼,但無論如何我都在這裏添加它,因爲它解釋了像最喜歡jmxmp的幾句好句子。

如何定義服務器端端點取決於您正在運行的是什麼。大多數應用程序服務器將允許您鍵入啓用了jmxmp的jmx服務url,但如果服務器是從頭開始編寫的,則可能必須自己將其設置爲代碼,而不是使用-D開關轉換爲您習慣的java。

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

編輯: 後您添加的jar到classpath,你有你的代碼做的唯一的事情(你是不是使用已經處理它爲你的服務器應用程序假設)如下(省略聲明,異常處理以及諸如此類的問題):

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

我覈實,沒有端口阻塞(如我上面我說的編輯),但我會看你的建議,並儘快給您答覆。 – djangofan 2011-03-21 21:17:14

+1

問題是,驗證您沒有阻止指定的端口是不夠的。還有更多(如第一個鏈接所述)。無論如何,它有可能得到它的工作,但jmxmp更容易合作,(imho)更好地遠距離工作。 – Fredrik 2011-03-21 21:28:38

+0

我無法找到任何有關「-D」參數的文檔,以便JVM獲取JMXMP偵聽器。或者,除非我用代碼實現它,否則它不起作用,比如Jetty通過配置文件在代碼中實現它的方式? – djangofan 2011-03-21 22:50:20

1

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

或者,如果你有cygwin的,只是儘量ssh -f [email protected] -L 7777:remote-server.com:123 -N其中7777是Windows計算機上的端口,123是在遠程Linux機器偵聽JMX命令的端口。

使用上述任一選項,您可以在Windows窗口中使用jconsole或visualvm並連接到localhost:7777

我知道iptables已禁用,但只需確認JMX在該端口工作正常,即通過SSH進入Linux機器並嘗試將jconsole的命令行JMX模式用於localhost(在Linux機器上)。

+0

我使用Bitwise Tunnelier SSH客戶端來設置客戶端到服務器的端口轉發。仍然無法使它工作,但我會擺弄它一些,因爲它似乎有希望... – djangofan 2011-03-21 22:53:08

+0

要確認您的端口轉發技術的工作原理,只是嘗試使用它在遠程服務器上,你知道工作的一些端口。就像運行在端口80上的Apache實例一樣,您可以使用'curl http:// localhost'從該命令行訪問該端口。一旦你知道這個端口能夠工作,就嘗試從你的windows中設置一個隧道/端口轉發,然後看看你是否能夠訪問它。這樣,您知道端口轉發正在爲您工作,並且可以將問題的範圍限制到JMX服務器。 – domspawn 2011-03-22 11:43:51

0

我實際上剛剛自己解決了這個問題並想出了它。

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

解決方法是使用SSH代理:

  1. SSH到您的應用程序正在運行,但這樣使用-D選項框:

    SSH用戶@ REMOTEHOST -D 9999

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

    這將啓動一個socks代理在本地機器上的端口9999

  2. 打開JVisualVM和喜好,在「網絡」配置爲使用本地主機SOCKS代理,端口9999

如果你這樣做,你應該能夠像往常一樣連接到遠程機器,並且由於所有的RMI流量現在都在通過SSH代理進行傳輸,所以它是通過防火牆穿透並且很好地工作的。

好運:-)