2011-02-18 48 views
6

對不起,這個問題必須多次提出,但我無法成功解決我的問題。 我讀過很多博客,網站,論壇......並沒有在我的案例中找到任何解決方案。VisualVM通過防火牆 - RMI故障排除

案例: 我需要將我盒子上的VisualVM連接到性能/線程/內存監控的遠程服務器(tomcats,weblogics)。 這些服務器安裝在受防火牆保護的(物理或虛擬)機器上。 大量的端口在防火牆中打開,可以使用,但不是所有的端口。

測試

  • 我在VisualVM的通過JMX試圖直接連接,使用在服務器端以下JVM選項在服務器啓動時:
     
    -Djava.rmi.server.hostname=[hostname] 
    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=[port] 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Dcom.sun.management.jmxremote.authenticate=false 
    

我一種高精度的主機名,因爲從我的網絡來看,服務器的主機名和IP地址與遠程服務器網絡的主機名和IP地址不一樣。

沒有成功,VisualVM似乎總是搜索未知的服務器。

  • 試圖從我的盒子一個端口進行訪問(-p選項)上開始對服務器端jstatd(此端口作品的telnet),但該主機與jstatd端口上啓動VisualVM的時候,它似乎仍然等待東西無法訪問....與jps連接到此遠程主機的行爲相同。

  • 在服務器上使用相同的工具嘗試使用較少的網絡保護,並且工作正常。所以我已經看到了我的盒子和服務器之間的連接,它們在不同於我指定給jstatd的端口上完成。 我知道這個端口是第一次通信所需要的(類型的握手),而實際的通信是在其他端口上完成的,但是不可預測(例如:60305,55197,...)。不知道我非常瞭解RMI是如何工作的。

請幫助我,我要瘋了!

+0

如果您使用的是Java 7 update 4,則希望標記爲''-Dcom.sun.management.jmxremote.rmi.port = 7091'' 請參閱此博文: http://hirt.se/ blog /?p = 289 – davey

回答

7

不幸的是,JMX會嘗試打開除您配置的端口以外的端口。就在昨天,我成功地通過JMX連接到防火牆後面的tomcat。這兩個棘手的部分是:

  • 把一個叫jmxremote.accessCATALINA_HOME/conf文件,該文件包含以下行:

    monitorRole readonly 
    controlRole readwrite 
    
  • server.xml設置將通過JMX使用的端口,通過一個特殊的Tomcat的監聽器(卡塔利娜-JMX-remote.jar與/ lib需要):

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
        rmiRegistryPortPlatform="9009" rmiServerPortPlatform="9010" /> 
    

然後在防火牆上打開這兩個端口。有用。但這只是爲了tomcat。

另一種選擇是使用ssh tunnelling。簡而言之 - 您通過SSH進行連接並將其配置爲將某個本地端口(jmx客戶端正在運行的端口)轉發到隧道另一端的某些端口。

參考文獻:

+2

你應該添加一個,也必須將'catalina-jmx-remote.jar'複製到'CATALINA_HOME/libs'中,否則會拋出'ClassNotFoundException'。有關此主題的進一步閱讀,請參閱http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener – ubuntudroid

0

在您的[主機名],打開[港口]和TCP端口範圍40000-60000只有你的IP。 這對我來說相當不錯。

+0

爲什麼此答案被低估了這麼多?這是唯一真正幫助我的人。 –

+2

因爲只是打開機器的幾乎所有端口到世界其他地方都可能在開發機器上工作,但在生產/企業環境中肯定不可行。 –

1

下面是步驟來做到這一點:

  1. 啓動在遠程主機的ejstatd這樣(在ejstatd文件夾):mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101"(用於「jstatd」型連接)
  2. 啓動Java應用程序這些額外的Java參數:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1102 -Dcom.sun.management.jmxremote.rmi.port=1102 -Djava.rmi.server.hostname=[remote_host_name](用於「JMX」類型連接)(此處僅需要java.rmi.server.hostname,因爲網絡中的IP和主機名與服務器的角度不同)
  3. 打開您的4個端口遠程主機並使它們可用於您的本地機:1099110011011102
  4. 啓動JVisualVM
    1. 上右鍵單擊「遠程」>「添加遠程主機...」,並在「主機名」中輸入您的遠程主機名(如果您不要使用端口1099,您可以在「高級設置」中更改此項)
    2. 右鍵單擊剛剛創建的遠程主機>「添加JMX連接...」,在「添加JMX連接...」中輸入「[remote_host_name]:1102」連接「輸入,並勾選」不需要SSL連接「
    3. 您的Java進程將出現兩次:一次來自」jstatd 「連接類型,還有一個來自」JMX「連接類型。

免責聲明:我開源ejstatd工具的作者。