簡體   English   中英

使用jConsole連接遠程tomcat JMX實例

[英]Connecting remote tomcat JMX instance using jConsole

我正在嘗試使用jConsole連接到遠程tomcat JMX實例。 但無法成功連接。 任何的想法?

我在遠程tomcat catalina.sh包含以下選項:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=9004 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false"

我有一個類似的,如果不是相同的問題。 如果我在機器上本地啟動jconsole,我可以連接到JMX服務器。

看來RMI服務器沒有正在偵聽正確的ip。 因此,正如在這個相關問題中所建議的那樣,我添加了以下內容:

-Djava.rmi.server.hostname=<host ip>

JAVA_OPTS ,然后它工作。

我收集了通過網絡傳播的信息,並附有其他成員的提示。

由JMX引起的大多數痛苦是(imo)JMX打開第二個動態分配的網絡端口的事實。 防火牆(如iptables)將阻止此操作。

linux上tomcat的解決方案:

使用tomcat 6.0.24或更新的從apache tomcat extras下載catalina-jmx-remote.jar(在tomcat下載頁面上使用browse)將它復制到$ CTALINA_HOME \\ lib中

這允許您設置JMX使用的兩個端口

編輯server.xml中的Server部分

<Server port="8005" ..>
  ...
  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

設置一些環境變量(例如在setenv.sh中)

CATALINA_OPTS="
  -Djava.rmi.server.hostname=IP-TO-LISTEN
  -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password 
  -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access 
  -Dcom.sun.management.jmxremote.ssl=false"

這會激活JMX的訪問控制

jmxremote.access看起來像

monitorRole readonly
controlRole readwrite

結束jmxremote.password將

monitorRole tomcat
controlRole tomcat

(只是簡單的空間)

重啟tomcat。

現在在服務器上配置防火牆(例如iptables)

的/ etc / SYSCONFIG / iptables的

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT

和/ etc / sysconfig / ip6tables

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT

重啟iptables

完成!

現在在工作站上使用VisualVM或JConsole建立與我們樣本中的rmiRegistryPortPlatform,9840的連接。

如果工作站和服務器之間沒有防火牆,它應該可以工作。

試過Java 8

1.將其添加到java tomcat啟動腳本中:

-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

例如,添加到bin / setenv.sh中:

export CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote.port=1616 \
-Dcom.sun.management.jmxremote.rmi.port=1616 \
-Dcom.sun.management.jmxremote.local.only=true \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false "

2.在您的計算機上執行此操作。

  • Windows用戶

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux和Mac用戶

    ssh user@remote-host -L 1616:remote-host:1616

3.在計算機上啟動jconsole

jconsole localhost:1616

4.玩得開心!

  • PS:在步驟2中,使用ssh-L指定將本地(客戶端)主機上的端口1616轉發到遠程端。
  • PS2。:您可以為JMX和RMI對話指定相同的端口

您使用什么字符串作為JMX連接URL。 我並不是要指出明顯但JConsole有一個糟糕的界面,對我來說需要一個過於復雜的URL才能連接到遠程jmx應用程序。 我看起來像這樣:

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi

在Tomcat8中啟用JMX,在我的POC中成功測試

1 /從apache網站下載catalina-jmx-remote.jar並放在$CATALINA_HOME/lib

2 /獲取server.xml / setenv.sh備份。 server.xml進行更改,如下所示 -

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

3 /對$CATALINA_BASE/bin/setenv.sh進行更改 -

[...]

JVM_OPTS="[...] 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=<eth:0_IP>| <`hostname -i`> 
-Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote=true "

4 /創建這兩個文件 - $touch $CATALINA_BASE/conf/jmxremote.password包含:

管理員letmein

$touch $CATALINA_BASE/conf/jmxremote.access包含:

admin readwrite

$ chmod 600 jmxremote.password

5 /重啟tomcat並在jconsole工具上測試:)

$echo|telnet 10.105.14.90 10001

當你說“但無法成功連接”時,你究竟是什么意思? 有錯誤信息嗎? 嘗試打開登錄jconsole,看看是否有助於調試它。

要打開jconsole日志記錄,請在將要運行jconsole的目錄中編輯名為logging.properties的文件,添加:

handlers= java.util.logging.ConsoleHandler

.level=INFO

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

javax.management.level=FINEST
javax.management.remote.level=FINEST

然后,啟動jconsole:

jconsole -J-Djava.util.logging.config.file=logging.properties

如果您正在使用linux,請修改catalina.sh文件,添加:

                CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<HOST_IP> -Dcom.sun.management.jmxremote.port=<HOST_PORT> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
            export CATALINA_OPTS

或以root身份修改/ etc / profile文件並重新運行該文件(source / etc / profile)

如果您正在使用Windows並且從命令行啟動tomcat,請使用環境變量CATALINA_OPTS

如果您正在使用Windows並且您正在啟動tomcat作為服務,則需要使用monitor service實用程序來配置服務初始化參數(setenv.bat,catalina.bat或env-vars都不起作用)。 為此,您需要出現在services.msc中列出的服務名稱(例如jasperreportsTomcat)。 之后,您需要以管理員身份打開控制台並執行(例如):tomcat6w.exe // MS // jasperreportsTomcat

使用此命令將出現一個托盤圖標,您可以在其中打開面板。 現在,您可以在“Java”選項卡中修改jmx選項。 小心不要添加尾隨空格並使用“[enter]”符號逐行分隔每個選項。

-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.61.101
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

希望能幫助到你

我為你們所有人得到了一些東西,以便完成對這件事的調查。 有一個技巧,它發生了探查器工具使用端口與jvm連接,但jvm使用另一個隨機端口繼續對話。 如果jvm在遠程計算機內運行(例如:tomcat web-app服務器),並且遠程計算機具有針對傳出和傳入連接的保護,則必須設置java系統屬性com.sun.management.jmxremote.rmi.port到名為com.sun.management.jmxremote.port的屬性的相同值

來源: https ://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error並檢查出來: http://blog.cantremember的.com /調試與- JConsole的-JMX的SSH-隧道/

希望能有所貢獻!

還有祝你好運!

檢查您的服務器是否在防火牆后面。 JMX基於RMI,它在啟動時打開兩個端口。 一個是注冊端口,默認為1099,可以通過com.sun.management.jmxremote.port選項指定。 另一種是用於數據通信,並且是隨機的,這是導致問題的原因。 一個好消息是,從JDK6開始,這個隨機端口可以通過com.sun.management.jmxremote.rmi.port選項指定。

在{tomcat_dir} /bin/setenv.sh中添加一行:

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

PROTIP:您需要修復(如具有已知編號)RMI注冊表和JMX / RMI服務器端口。 您可以通過將jar文件放在lib-dir中並配置特殊的偵聽器來完成此操作。 (當然是激活JMX的常用標志

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.port=8999 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

請參閱: http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html上的 JMX遠程生命周期監聽器

更改linux上的/etc/hosts ,我將與我的帳戶關聯的localhost地址替換為機器ip,為我解決了這個問題。

好吧,我在Linux機器盒(虛擬機)中遇到了這個問題,我使用-Djava.rmi.server.hostname屬性修復了它,但有一件事我無法理解。 我的機器有5個tomcat服務器,所有這些服務器都在連續端口(8008,8018,8028 ...)中啟用了jmx,並且只有其中一個服務器連接JMX時遇到此問題。 在任何tomcat中都沒有防火牆,沒有-Djava.rmi.server.hostname屬性....

所以事情就是我理解了這個問題,但我無法理解為什么我的4只貓咪在工作,其中1只沒有。

PD:我知道,我的英語很差。 我很抱歉。

暫無
暫無

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

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