การเชื่อมต่อ JMX ระยะไกล


97

ฉันกำลังพยายามเปิดการเชื่อมต่อ JMX กับแอปพลิเคชัน java ที่ทำงานบนเครื่องระยะไกล

JVM ของแอปพลิเคชันถูกกำหนดค่าด้วยตัวเลือกต่อไปนี้:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

ฉันสามารถเชื่อมต่อโดยlocalhost:1088ใช้ jconsole หรือ jvisualvm แต่ฉันไม่สามารถเชื่อมต่อโดยใช้xxx.xxx.xxx.xxx:1088เครื่องระยะไกลได้

ไม่มีไฟร์วอลล์ระหว่างเซิร์ฟเวอร์หรือบนระบบปฏิบัติการ แต่เพื่อกำจัดความเป็นไปได้นี้ฉันtelnet xxx.xxx.xxx.xxx 1088และฉันคิดว่ามันเชื่อมต่อกันเมื่อหน้าจอคอนโซลว่างเปล่า

เซิร์ฟเวอร์ทั้งสองคือ Windows Server 2008 x64 พยายามกับ JVM 64 บิตและ 32 บิตไม่ทำงาน


1
น่าจะเกี่ยวข้องกับstackoverflow.com/questions/151238/…
tuler

นี่คือคำแนะนำโดยละเอียดstackoverflow.com/a/11654322/99834
sorin

คำตอบ:


119

หากพบปัญหาบน Linux ก็คือ localhost เป็นอินเทอร์เฟซแบบวนกลับคุณต้องใช้แอปพลิเคชันเพื่อเชื่อมโยงกับอินเทอร์เฟซเครือข่ายของคุณเชื่อมต่อเครือข่าย

คุณสามารถใช้ netstat เพื่อยืนยันว่าไม่ผูกมัดกับอินเทอร์เฟซเครือข่ายที่คาดไว้

คุณสามารถทำงานนี้ได้โดยเรียกใช้โปรแกรมด้วยพารามิเตอร์ระบบjava.rmi.server.hostname="YOUR_IP"ไม่ว่าจะเป็นตัวแปรสภาพแวดล้อมหรือใช้

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

7
อย่าลืมhostname -iดูรายละเอียดที่stackoverflow.com/a/11654322/99834
sorin

ทำงานแล้ว! ในสภาพแวดล้อมของเราเราใช้เครื่องเสมือน VMWare เซิร์ฟเวอร์อยู่บน VM VM ถูกใช้งานโดยมีรั้วกั้นดังนั้นจึงมีที่อยู่ IP ภายในและภายนอก เราเริ่มต้นกระบวนการ java เซิร์ฟเวอร์ด้วย -Djava.rmi.server.hostname = <external-ip-address>
buzz3791

ในการตั้งค่า ip โฮสต์หรือเปลี่ยน localhost ip ลิงค์นี้จะมีประโยชน์
Reza Ameri

ฉันมีสองคำถามที่นี่ - 1) จะเกิดอะไรขึ้นถ้ามีใครต้องการใช้ JMXMP แทน JMX อะไรคือการกำหนดค่าสำหรับสิ่งนั้น? และ 2) เป็นไปได้หรือไม่ที่จะทำการเชื่อมต่อ JMX โดยไม่ต้องโหลดโปรโตคอล RMI
Kumar Vaibhav

66

ฉันใช้เวลามากกว่าหนึ่งวันในการพยายามทำให้ JMX ทำงานจาก localhost ภายนอก ดูเหมือนว่า SUN / Oracle ไม่สามารถจัดเตรียมเอกสารที่ดีเกี่ยวกับเรื่องนี้ได้

ตรวจสอบให้แน่ใจว่าคำสั่งต่อไปนี้ส่งคืน IP จริงหรือ HOSTNAME ให้คุณ หากส่งคืนบางสิ่งเช่น 127.0.0.1, 127.0.1.1 หรือ localhost มันจะไม่ทำงานและคุณจะต้องอัปเดต/etc/hostsไฟล์

hostname -i

นี่คือคำสั่งที่จำเป็นในการเปิดใช้งาน JMX แม้จากภายนอก

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

ตามที่คุณสันนิษฐาน myserver.example.com ต้องตรงกับสิ่งที่hostname -iส่งคืน

เห็นได้ชัดว่าคุณต้องแน่ใจว่าไฟร์วอลล์ไม่ได้บล็อกคุณ แต่ฉันเกือบจะแน่ใจแล้วว่านี่ไม่ใช่ปัญหาของคุณปัญหาคือพารามิเตอร์สุดท้ายที่ไม่มีการบันทึกไว้


การเพิ่ม -Djava.rmi.server.hostname = myserver.example.com ทำเคล็ดลับ! ขอบคุณ!
Jim Bethancourt

ฉันใช้เสรีภาพในการเปิดจุดบกพร่องของเอกสาร JDK สำหรับสิ่งนี้: bugs.openjdk.java.net/browse/JDK-8066405
Klara

3
"ตรวจสอบให้แน่ใจว่าคำสั่งต่อไปนี้ส่งคืน IP จริงหรือ HOSTNAME ให้คุณหากส่งคืนค่าบางอย่างเช่น 127.0.0.1, 127.0.1.1 หรือ localhost จะไม่ทำงานและคุณจะต้องอัปเดตไฟล์ / etc / hosts" อะไร?
PedroD

1
ไม่เร็ว ๆjava.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>นี้. หวังว่านี่จะช่วยใครบางคนได้
Sonny

@PedroD: YOu ต้องเข้าสู่ / etx / โฮสต์ด้วย IP สาธารณะของคุณและชื่อโฮสต์ที่คุณใช้สำหรับ "-Djava.rmi.server.hostname"
Sebastian

24

ในการทดสอบของฉันกับ Tomcat และ Java 8 JVM กำลังเปิดพอร์ตชั่วคราวนอกเหนือจากที่ระบุไว้สำหรับ JMX รหัสต่อไปนี้แก้ไขฉัน; ลองใช้ดูหากคุณประสบปัญหาที่ไคลเอนต์ JMX ของคุณ (เช่นVisualVMไม่ได้เชื่อมต่อ

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

ดูเพิ่มเติมว่าเหตุใด Java จึงเปิด 3 พอร์ตเมื่อกำหนดค่า JMX


12

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_pro issues_in_jconsole

หากคุณกำลังพยายามเข้าถึงเซิร์ฟเวอร์ที่อยู่เบื้องหลัง NAT คุณอาจต้องเริ่มเซิร์ฟเวอร์ของคุณด้วยตัวเลือกนี้

-Djava.rmi.server.hostname=<public/NAT address>

เพื่อให้ต้นขั้ว RMI ที่ส่งไปยังไคลเอนต์มีที่อยู่สาธารณะของเซิร์ฟเวอร์ที่อนุญาตให้ไคลเอ็นต์เข้าถึงได้จากภายนอก


8

มันทำให้คำพูดตอนจบของคุณมาเร็วเกินไป ควรอยู่หลังพารามิเตอร์สุดท้าย

เคล็ดลับนี้ใช้ได้ผลสำหรับฉัน

ฉันสังเกตเห็นสิ่งที่น่าสนใจ: เมื่อฉันเริ่มแอปพลิเคชันโดยใช้บรรทัดคำสั่งต่อไปนี้:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

หากฉันพยายามเชื่อมต่อกับพอร์ตนี้จากเครื่องระยะไกลโดยใช้ jconsole การเชื่อมต่อ TCP จะสำเร็จข้อมูลบางอย่างจะถูกแลกเปลี่ยนระหว่าง jconsole ระยะไกลและตัวแทน jmx ภายในที่ซึ่ง MBean ของฉันถูกปรับใช้จากนั้น jconsole จะแสดงข้อความแสดงข้อผิดพลาดในการเชื่อมต่อ ฉันทำการจับ Wirehark และแสดงการแลกเปลี่ยนข้อมูลที่มาจากทั้งตัวแทนและ jconsole

ดังนั้นนี่ไม่ใช่ปัญหาเครือข่ายถ้าฉันดำเนินการ netstat -an ที่มีหรือไม่มีคุณสมบัติระบบ java.rmi.server.hostname ฉันมีการผูกต่อไปนี้:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

หมายความว่าในทั้งสองกรณีซ็อกเก็ตที่สร้างบนพอร์ต 9999 ยอมรับการเชื่อมต่อจากโฮสต์บนแอดเดรสใด ๆ

ฉันคิดว่าเนื้อหาของคุณสมบัติระบบนี้ถูกใช้ที่ใดที่หนึ่งในการเชื่อมต่อและเปรียบเทียบกับที่อยู่ IP จริงที่ตัวแทนใช้เพื่อสื่อสารกับ jconsole และหากที่อยู่เหล่านั้นไม่ตรงกันแสดงว่าการเชื่อมต่อล้มเหลว

ฉันไม่มีปัญหานี้ในขณะที่เชื่อมต่อจากโฮสต์เดียวกันโดยใช้ jconsole จากโฮสต์ระยะไกลจริงเท่านั้น ดังนั้นฉันคิดว่าการตรวจสอบนี้จะทำเมื่อการเชื่อมต่อมาจาก "ภายนอก" เท่านั้น


"คำพูดตอนจบของคุณมาเร็วเกินไป" หมายความว่าอย่างไร ฉันมีปัญหาเดียวกันฉันเห็นการเชื่อมต่อ TCP แต่ในที่สุด jconsole อ้างว่าเชื่อมต่อไม่สำเร็จ
tsuna

ฉันไม่รู้ว่าถ้าฉันจำไม่ผิดมีคำพูดเปิดอยู่ที่ไหนสักแห่งและคำพูดนี้ไม่ได้อยู่ที่ส่วนท้ายของพารามิเตอร์ บางทีมันอาจจะอยู่ในสคริปต์แบทช์ฉันก็จำไม่ได้ แต่ฉันต้องยอมรับว่าคำตอบนี้ไม่สมเหตุสมผลกับคำถาม ... บางทีคำถามอาจถูกแก้ไข? ไม่มีการแก้ไขการแจ้งเตือนภายใต้คำถาม ... ฉันไม่รู้ฉันขอโทษ
yohann.martineau

6

สิ่งที่ได้ผลสำหรับฉันคือการตั้งค่า / etc / hosts เพื่อชี้ชื่อโฮสต์ไปที่ ip ไม่ใช่ไปที่อินเทอร์เฟซแบบวนกลับและรีสตาร์ทแอปพลิเคชันของฉัน

แมว / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

นี่คือการกำหนดค่าของฉัน:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

5

ขอบคุณมากมันใช้งานได้ดังนี้:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false - Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar



0

ฉันมีปัญหาเดียวกันและฉันเปลี่ยนชื่อโฮสต์ใด ๆ ที่ตรงกับชื่อโฮสต์ท้องถิ่นเป็น 0.0.0.0 ดูเหมือนว่าจะใช้งานได้หลังจากที่ฉันทำเช่นนั้น


0

ในการเปิดใช้งาน JMX remote ให้ส่งผ่านพารามิเตอร์ VM ด้านล่างพร้อมกับคำสั่ง JAVA

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in

1
คุณบอกฉันได้ไหมว่าทำไมมันถึงเชื่อมโยงกับ 0.0.0.0 และไม่ใช่กับ IP ที่เฉพาะเจาะจง
Babu James

0

ลองทำเช่นนี้ฉันทดสอบเพื่อเข้าถึง JMX ภายใน Docker container

-Dcom.sun.management.jmxremote = จริง -Djava.rmi.server.hostname = localhost -Dcom.sun.management.jmxremote.port = 16000 -Dcom.sun.management.jmxremote.rmi.port = 16000 -Dcom.sun .management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

แล้ว

$ jconsole localhost: 16000


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.