[英]Unable to remotely connect to JMX?
由於某些奇怪的原因,我無法使用VisualVM
或jconsole
連接到 JMX。
用於啟動要監控的VM的參數:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100
我檢查過,我可以從本地和遠程 telnet 到這個端口。
盡管如此,VisualVM 或 jconsole 在花費了相當長的時間嘗試連接后仍無法連接。
REMOTE MACHINE with JMX (debian)
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
MY WORKSTATION (OS X)
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
問題是什么?
添加-Djava.rmi.server.hostname = host ip
。 即使我遇到了同樣的問題,這也成功了。
添加此-Djava.rmi.server.hostname = host ip
強制 RMI 服務使用主機 ip 而不是 127.0.0.1
這些是對我有用的步驟(服務器端防火牆后面的 Debian 是從我的本地 Mac 通過 VPN 到達的):
查看服務器公網ip
ifconfig
使用 JVM 參數:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=[jmx port]
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=[server ip from step 1]
運行應用程序
查找正在運行的 java 進程的進程 ID
檢查 JMX/RMI 使用的所有端口
netstat -lp | grep [pid from step 4]
在防火牆上打開第 5 步中的所有端口
瞧。
除了偵聽您指定的端口 (1100) 之外,JMX 服務器還偵聽隨機選擇的(臨時)端口。 檢查,例如使用lsof -i|grep java
如果您在 linux/osx 上,java 進程偵聽哪些端口,並確保您的防火牆也為臨時端口打開。
我遇到了它永遠說“添加”並且似乎無法連接的問題。 我通過更改 jvisualvm 代理設置(工具->選項->網絡)解決了這個問題。 一旦我將選項更改為無代理,我就能夠連接。 我的 jvm 是使用以下選項啟動的:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=2222
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=<external_IP_of_server>
然后當我添加jmx連接時,我指定了“external_IP_of_server:2222”
使用端口轉發時我遇到了類似的問題。 我有一台帶有 Tomcat 的遠程機器,用於偵聽localhost:9000
上的 JMX 交互。
在我的本地機器上,我習慣於使用以下方式進行端口轉發:
ssh -L 9001:localhost:9000 tomcat.example.com
(所以遠程端口 9000 被轉發到我本地機器的端口 9001)。
然后當我嘗試使用 VisualVM 連接到localhost:9001
,連接被拒絕。 JMX 似乎要求雙方的端口號相同。
所以我的解決方案是使用端口號 9000 和 9000:
ssh -L 9000:localhost:9000 tomcat.example.com
現在我本地機器的 VisualVM 通過localhost:9000
成功連接到遠程機器的 Tomcat。
確保您沒有任何其他服務(開發機器上的 Tomcat?)在同一端口上偵聽。
還要看看正確設置參數。
由於我剛剛加入,我無法對 Hett 的回答投贊成票,但它從又一周的反復試驗中挽救了我的生命!
這是一個工作 Dockerfile 的示例:
FROM store/oracle/serverjre:8
RUN mkdir -p /opt/app
ENV APP_PATH /opt/app
WORKDIR $APP_PATH
COPY . $APP_PATH
CMD ["java", \
"-Dcom.sun.management.jmxremote", \
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.rmi.port=9010", \
"-Dcom.sun.management.jmxremote.authenticate=false", \
"-Dcom.sun.management.jmxremote.ssl=false", \
"-Djava.rmi.server.hostname=12.345.67.89", \
"-jar", \
"app-service-0.0.1-SNAPSHOT.jar"]
EXPOSE 9010
我對上述答案的兩分錢..
我看到大多數答案只提到了主機名,但沒有提到端口。 如果我們沒有指定端口,那么服務器將動態分配 RMI 端口。 如果兩台服務器在同一子網中或沒有防火牆問題,則不會有任何問題。 如果有任何問題,我們可以添加下面的JVM參數來凍結。
-Dcom.sun.management.jmxremote.rmi.port
前任:
<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>
確保 RMI 和 JMX 端口應該相同。 更多信息, 請點擊這里
如果您運行jar
文件(通過 -jar 選項),則必須在-jar
選項之前指定所有其他 jvm 選項!
我發現了問題,我的 rmi 服務在主機 ip 上運行,它是“127.0.0.1”。 要遠程連接到 jvm,我必須將外部 ip 綁定到主機名。 要在 unix 系統中執行此操作,請使用命令hostname
來獲取hostname
的名稱。 然后檢查分配給主機名的 ip,找出這個使用ping $(hostname)
你會看到系統正在 ping ping $(hostname)
的 ip。 如果您的主機 IP 是默認的“127.0.0.1”並且您想更改它,只需以超級用戶身份編輯文件 /etc/hosts。 重新啟動 rmi 服務后,您可以從遠程機器訪問它。
如果您的機器沒有錯誤的 IP,請查看 /etc/hosts 示例:127.0.0.1 localhost 127.0.0.2 your_machine 185.12.58.2 your_machine(您機器的好 IP)
JMX 使用 IP 127.0.0.2 而忘記另一個
感謝@Arpit Agarwal,以下對我有用。 添加了這個對我有用的附加 jvm 參數。
-Djava.rmi.server.hostname=192.168.1.16
對我有用的完整列表。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=21845
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=192.168.1.16
-Dcom.sun.management.jmxremote.rmi.port=10099
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.