มีใครเคยมี JMX JConsole รีโมทใช้งานได้บ้างครับ?


120

ดูเหมือนว่าฉันจะไม่เคยทำงานนี้มาก่อน ขณะนี้ฉันรู้ว่ามันใช้งานไม่ได้

แต่เราเริ่มกระบวนการ Java ของเรา:

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

ฉันสามารถเทลเน็ตไปที่พอร์ตและ "มีบางอย่างอยู่ที่นั่น" (นั่นคือถ้าฉันไม่เริ่มกระบวนการก็ไม่มีคำตอบ แต่ถ้าฉันทำมันก็ทำได้) แต่ฉันไม่สามารถให้ JConsole ทำงานในการกรอก IP ได้ และพอร์ต

ดูเหมือนว่ามันควรจะเรียบง่าย แต่ไม่มีข้อผิดพลาดไม่มีเสียงดังไม่มีอะไรเลย ไม่ทำงาน

ใครทราบเคล็ดลับสำหรับเรื่องนี้


3
หากคุณใช้ tomcat นี่อาจเป็นทางออก: stackoverflow.com/questions/1263991/…
Hajo Thelen

5
คุณลืมรับบางสิ่งที่นี่ @ จะ?
สีเทา

คำตอบ:


126

ฉันมีวิธีแก้ปัญหานี้:

หากกระบวนการ Java กำลังทำงานบนลินุกซ์หลังไฟร์วอลล์และคุณต้องการที่จะเริ่มต้นJConsole / Java VisualVM / Java ควบคุมภารกิจบน Windows บนเครื่องท้องถิ่นของคุณเพื่อเชื่อมต่อกับJMX พอร์ตของกระบวนการ

คุณต้องเข้าถึงเครื่อง linux ของคุณผ่านการเข้าสู่ระบบ SSH การสื่อสารทั้งหมดจะได้รับการปรับแต่งผ่านการเชื่อมต่อ SSH

เคล็ดลับ:โซลูชันนี้ใช้งานได้ไม่ว่าจะมีไฟร์วอลล์หรือไม่ก็ตาม

ข้อเสีย:ทุกครั้งที่คุณรีสตาร์ทกระบวนการ java คุณจะต้องทำทุกขั้นตอนตั้งแต่ 4 - 9 อีกครั้ง


1. คุณต้องใช้สีโป๊วสำหรับเครื่อง Windows ของคุณจากที่นี่:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

อย่างน้อยputty.exe


2. กำหนดพอร์ตฟรีหนึ่งพอร์ตบนเครื่อง linux ของคุณ:

<jmx-remote-port>

ตัวอย่าง:

jmx-remote-port = 15666      


3. เพิ่มอาร์กิวเมนต์ในกระบวนการ java บนเครื่อง linux

ต้องทำแบบนี้เป๊ะ ๆ หากทำตามด้านล่างนี้จะใช้ได้กับเครื่อง linux หลังไฟร์วอลล์ (ใช้งานได้กับสาเหตุของ-Djava.rmi.server.hostname=localhostอาร์กิวเมนต์)

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

ตัวอย่าง:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main


4. รับรหัสกระบวนการของกระบวนการ Java ของคุณ

ps -ef | grep <java-processname>

result ---> <process-id>

ตัวอย่าง:

ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321


5. ค้นหาพอร์ตที่กำหนดเองสำหรับการดาวน์โหลดต้นขั้ว RMIServer

กระบวนการ java จะเปิดพอร์ต TCP ใหม่บนเครื่อง linux ซึ่งจะมีการดาวน์โหลด RMI Server-Stubs พอร์ตนี้ยังต้องพร้อมใช้งานผ่าน SSH Tunnel เพื่อเชื่อมต่อกับ Java Virtual Machine

ด้วยnetstat -lpพอร์ตนี้สามารถพบได้นอกจากนี้ยังlsof -iให้คำแนะนำว่าพอร์ตใดถูกเปิดจากกระบวนการ java

หมายเหตุ: พอร์ตนี้จะเปลี่ยนแปลงเสมอเมื่อเริ่มกระบวนการ java

netstat -lp | grep <process-id>

tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java


result ---> <rmi-server-port>

ตัวอย่าง:

netstat -lp | grep 24321

tcp        0      0 *:15666     *:*     LISTEN      24321/java
tcp        0      0 *:37123     *:*     LISTEN      24321/java


result ---> 37123


6. เปิดใช้งาน SSH-Tunnels สองช่องจากเครื่อง Windows ของคุณด้วยผงสำหรับอุดรู

Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local       
[x] Auto       

Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local       
[x] Auto

ตัวอย่าง:

Source port: 15666
Destination: localhost:15666
[x] Local       
[x] Auto       

Source port: 37123
Destination: localhost:37123
[x] Local       
[x] Auto


การตั้งค่าเพื่อเปิดอุโมงค์ SSL ผ่าน Putty


7. เข้าสู่ระบบเครื่อง Linux ของคุณด้วย Putty โดยเปิดใช้งาน SSH-Tunnel นี้

เปิดเซสชันสีโป๊วทิ้งไว้

เมื่อคุณเข้าสู่ระบบ Putty จะอุโมงค์ TCP-Connections ทั้งหมดไปยังเครื่อง linux ผ่านพอร์ต SSH 22

JMX-Port:

Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666

RMIServer-กุด-Port:

Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123


8. เริ่ม JConsole / Java VisualVM / Java Mission Control เพื่อเชื่อมต่อกับ Java Process ของคุณโดยใช้ URL ต่อไปนี้

วิธีนี้ใช้ได้ผลทำให้ JConsole / Java VisualVM / Java Mission Control คิดว่าคุณเชื่อมต่อกับพอร์ตบนเครื่อง Windows ในพื้นที่ของคุณ แต่ Putty จะส่งน้ำหนักบรรทุกทั้งหมดไปยังพอร์ต 15666 ไปยังเครื่อง linux ของคุณ

ในเครื่อง linux ขั้นแรกกระบวนการ java จะให้คำตอบและส่งกลับ RMIServer Port ในตัวอย่างนี้ 37123

จากนั้น JConsole / Java VisualVM / Java Mission Control คิดว่ามันเชื่อมต่อกับ localhost: 37123 และผงสำหรับอุดรูจะส่งน้ำหนักบรรทุกทั้งหมดไปยังเครื่อง linux

คำตอบของกระบวนการ java และการเชื่อมต่อเปิดอยู่

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi

ตัวอย่าง:

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi


เชื่อมต่อผ่าน jmx service url


9. สนุก # 8-]


1
คำถามเล็กน้อยที่นี่ - เป็นไปไม่ได้ที่จะทำการเชื่อมต่อ JMX โดยไม่มี rmi?
Kumar Vaibhav

5
ฉันได้รับคำใบ้ว่าเราสามารถตั้งค่า rmi.port เป็นหมายเลขพอร์ตคงที่ได้ดังนั้นเราจึงสามารถตั้งค่าพอร์ตโดยพลการสำหรับการดาวน์โหลดต้นขั้ว RMIServer สิ่งนี้ควรใช้ได้กับคุณสมบัติ Java "com.sun.management.jmxremote.rmi.port = <rmi-server-port>" ดูเหมือนคุณลักษณะที่ไม่มีเอกสารใน Oracle Java VM
sushicutta

1
แน่นอนว่าต้องตั้งค่าที่เก็บคีย์และ
ร้านค้าที่เชื่อถือได้

กระบวนการเดียวกัน แต่ฉันไม่พบวัตถุดังกล่าวในตาราง
wener

2
@sushicutta คุณสามารถเพิ่มคำใบ้นี้ในคำตอบของคุณมันทำงานได้ดีอย่างสมบูรณ์และสามารถลบขั้นตอนจาก 4 ถึง 6 ได้สิ่งที่จับได้คือพอร์ตที่ส่งต่อของคุณจะต้องเหมือนกับพอร์ตดั้งเดิมและทั้งพอร์ต jmx และ rmi ก็ต้อง เหมือนเดิม
โทรม

80

การเพิ่มช่วย-Djava.rmi.server.hostname='<host ip>'แก้ปัญหานี้ให้ฉันได้


2
ในกรณีของฉันฉันต้องเพิ่มที่อยู่ IP (-Djava.rmi.server.hostname = <ip>) ชื่อโฮสต์ - ฉันให้ที่อยู่ IP สองรายการกับฉันและที่ถูกต้องเป็นอันดับสองในรายการ
Georgy Bolyuba

4
ไม่สามารถแก้ปัญหาให้ฉันได้ การเชื่อมต่อ windows-2-windows ไม่ใช่ปัญหาสำหรับฉัน แต่เมื่อฉันพยายามเชื่อมต่อจาก JVM Jvisualvm.exe บน Windows เพื่อตรวจสอบบริการ java ที่ทำงานบน SUSE ด้วย Oracle JDK 1.6.024 การเชื่อมต่อล้มเหลว ด้วยเหตุนี้ฉันจึงคิดว่าคำถามของบุคคลนี้ยังคงไม่มีคำตอบ
djangofan

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ สิ่งนี้บวกกับชุด 3 (พิสูจน์ตัวตน / พอร์ต / ssl) ตามปกติและฉันสามารถเชื่อมต่อจากระยะไกลได้แล้ว กล่องกำลังฟังบนอินเทอร์เฟซเสมือนหลายตัวอาจเป็นเพราะเหตุใดจึงไม่ระบุโฮสต์ทำให้สับสนกับ jvm
Nicholi

ในที่สุดก็แก้ไขปัญหาของฉันในการเชื่อมต่อ jconsole บนแล็ปท็อป osx ของฉัน ขอบคุณ
rado

ทำงานให้ฉัน ขอบคุณ!
Jeff

58

พยายามกับ Java 8 และเวอร์ชันที่ใหม่กว่า

โซลูชันนี้ใช้ได้ดีกับไฟร์วอลล์

1. เพิ่มสิ่งนี้ลงในสคริปต์เริ่มต้น java ของคุณบนรีโมตโฮสต์:

-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

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 บนโลคัล (ไคลเอนต์) โฮสต์ไปยังด้านระยะไกล นี่คืออุโมงค์ ssh และช่วยหลีกเลี่ยงไฟร์วอลล์หรือปัญหาเครือข่ายต่างๆ


1
น่ากลัว !! พยายามเป็นเวลา 6 + ชั่วโมงแล้วที่จะ jmx-remote ไปยังอินสแตนซ์ ActiveMQ บน java8 ในที่สุดบางสิ่งที่ได้ผล !! ขอบคุณ! :)
Rop

ขอบคุณเช่นคุณฉันต่อสู้มาประมาณหนึ่งวันเช่นกันและหลังจากทำงานมากมายฉันก็คิดว่า: "ฉันต้องเขียนสิ่งนี้ถึง SO !!"
freedev

2
ห่วยจริงๆที่ Oracle ไม่พูดถึง "com.sun.management.jmxremote.rmi.port", "java.rmi.server.hostname" docs.oracle.com/javase/8/docs/technotes/guides/management/… I เดาว่าเป็นปัญหาของฉัน
Rop

เพราะ AFAIK ปัญหานี้ไม่เกี่ยวกับ JMX แต่เป็นวิธีการทำงานของ RMI ตัวอย่างเช่นหลังจากกรณีนี้ฉันมีปัญหาเดียวกันกับ jmeter ซึ่งใช้ rmi ในการใช้งานไคลเอนต์ / เซิร์ฟเวอร์
freedev

2
มันได้ผล. เพียงแค่เพิ่มประสบการณ์ของฉันกับอุโมงค์: 1) สามารถใช้ "localhost" ใน "-L 1616: localhost: 1616" 2) ไม่สามารถเปลี่ยนพอร์ตต้นทางนั่นคือจะใช้ไม่ได้: "-L 9999: localhost: 1616"
gargii

19

คุณอาจประสบปัญหากับไฟร์วอลล์ 'ปัญหา' คือพอร์ตที่คุณระบุไม่ใช่พอร์ตเดียวที่ใช้ แต่ใช้ 1 หรืออาจมากกว่า 2 พอร์ตสำหรับ RMI และอาจถูกบล็อกโดยไฟร์วอลล์

หนึ่งในพอร์ตพิเศษจะไม่ทราบล่วงหน้าหากคุณใช้การกำหนดค่า RMI เริ่มต้นดังนั้นคุณต้องเปิดพอร์ตจำนวนมากซึ่งอาจไม่ทำให้ผู้ดูแลระบบเซิร์ฟเวอร์พอใจ

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

http://forums.sun.com/thread.jspa?threadID=5267091 - ลิงก์ไม่ทำงานอีกต่อไป

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

เป็นไปได้ที่จะตั้งค่า ssh tunnel และยังทำให้ใช้งานได้ :-)


2
ฉันสามารถแก้ไขปัญหาไฟร์วอลล์โดยใช้นามแฝงที่อธิบายไว้ในsimplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.htmlพร้อมกับการตั้งค่า -Djava.rmi.server.hostname ตามที่ระบุไว้ในคำตอบอื่นที่นี่
Damien

หมายเหตุถึงผู้อ่านในอนาคต: ลิงก์ไปยังใช้งานforums.sun.comไม่ได้
CDspace

1
หมายเหตุสำหรับผู้อ่านในอนาคต: ลิงก์ไปยังใช้งานblogs.oracle.comไม่ได้
Grimlock

17

หลังจากทำการทดสอบ Google-fu ในช่วงสองสามวันที่ผ่านมาในที่สุดฉันก็สามารถใช้งานได้หลังจากรวบรวมคำตอบจาก Stack Overflow และหน้านี้http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html .

การโพสต์ใหม่จากหน้า Dell Boomi:

To Enable Remote JMX on an Atom

If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.

Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.

Add the following lines to the file:

-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

บรรทัดเดียวที่ฉันไม่เห็นปกคำตอบของ Stack Overflow คือ

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

ในกรณีของฉันฉันพยายามเรียกข้อมูลเมตริก Kakfa ดังนั้นฉันจึงเปลี่ยนตัวเลือกด้านบนเพื่อให้ตรงกับ-Dcom.sun.management.jmxremote.portค่า ดังนั้นหากไม่มีการพิสูจน์ตัวตนใด ๆ การกำหนดค่าขั้นต่ำที่เปลือยเปล่าควรมีลักษณะดังนี้:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)

-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)

1
บวกหนึ่งสำหรับ "Google-fu"
kevinarpe

"com.sun.management.jmxremote.rmi.port" เป็นกุญแจสำคัญสำหรับฉันเช่นกัน ดูคำตอบนี้ด้วย: stackoverflow.com/a/22306586/123205
David

ฉันไม่ต้องการ "com.sun.management.jmxremote.local.only" ดังนั้นฉันไม่คิดว่าการกำหนดค่าของคุณเป็น "ขั้นต่ำเปล่า" อย่างแท้จริง
David


7

คุณสามารถข้ามขั้นตอนที่ 4-7 ของ Sushicutta ได้โดยเพิ่มบรรทัดต่อไปนี้ในขั้นตอนที่ 3:

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>

เช่นเพิ่มเพื่อเริ่มต้นพารามิเตอร์:

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

สำหรับการส่งต่อพอร์ตให้เชื่อมต่อโดยใช้:

ssh -L 12345:localhost:12345 <username>@<host>

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

ssh -L 12345:localhost:12345 <username>@<host2>

โปรดทราบว่าชื่อโฮสต์ = localhostเป็นสิ่งจำเป็นเพื่อให้แน่ใจว่า jmxremote กำลังบอกการเชื่อมต่อ rmi เพื่อใช้อุโมงค์ มิฉะนั้นอาจพยายามเชื่อมต่อ directy และกดไฟร์วอลล์


วิธีนี้ช่วยฉัน: (1) ฉันเพิ่มพารามิเตอร์ JMX ที่ไม่ได้รับและรีสตาร์ทแอพ (2) จากนั้นรัน ssh -L <JMX_port>:localhost:<JMX_port> <remote_user>@<remote_host> บนเครื่องท้องถิ่น (3) จากนั้นฉันเชื่อมต่อกับ JMX ระยะไกลโดยใช้: jconsole <remote_host>:<JMX_port>
Rib47

6

protip:

พอร์ต RMI ถูกเปิดขึ้นโดยพลการของ portnr หากคุณมีไฟร์วอลล์และไม่ต้องการเปิดพอร์ต 1024-65535 (หรือใช้ VPN) คุณต้องทำสิ่งต่อไปนี้

คุณต้องแก้ไข (เช่นเดียวกับการมีหมายเลขที่ทราบ) พอร์ต RMI Registry และ JMX / RMI Server คุณทำได้โดยใส่ jar-file (catalina-jmx-remote.jar ไว้ในไฟล์พิเศษ) ใน lib-dir และกำหนดค่า Listener พิเศษภายใต้เซิร์ฟเวอร์:

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

(และแน่นอนว่าแฟล็กปกติสำหรับเปิดใช้งาน JMX

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

ดู: JMX Remote Lifecycle Listener ที่http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

จากนั้นคุณสามารถเชื่อมต่อโดยใช้ URL ที่น่ากลัวนี้:

service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi

ลองใช้ข้างบนกับ jar พิเศษและสามารถดูพอร์ต RMI ที่กำลังรับฟังตามที่ระบุ แต่พอร์ตแบบสุ่มยังคงใช้โดย RMI หลังจากเชื่อมต่อกับพอร์ต JVM ด้วย VisualVM วิธีแก้ปัญหา: ดูพอร์ตที่มี 'lsof -i' และเปิดพอร์ตที่มีการเชื่อมต่อที่ถูกบล็อก
Joseph Lust

5

ตรวจสอบว่าเซิร์ฟเวอร์ของคุณอยู่หลังไฟร์วอลล์หรือไม่ JMX ขึ้นอยู่กับ RMI ซึ่งเปิดพอร์ตสองพอร์ตเมื่อเริ่มต้น หนึ่งคือพอร์ตลงทะเบียนค่าเริ่มต้นคือ 1099 และสามารถระบุได้โดยcom.sun.management.jmxremote.portตัวเลือก อีกอันใช้สำหรับการสื่อสารข้อมูลและเป็นแบบสุ่มซึ่งเป็นสาเหตุของปัญหา ข่าวดีก็คือจาก JDK6 พอร์ตสุ่มนี้สามารถระบุได้โดยcom.sun.management.jmxremote.rmi.portตัวเลือก

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"

4

การรับ JMX ผ่าน Firewall นั้นยากมาก ปัญหาคือ RMI มาตรฐานใช้พอร์ตที่กำหนดแบบสุ่มลำดับที่สอง (ข้างรีจิสทรี RMI)

เรามีสามวิธีที่ใช้ได้ผล แต่ทุกกรณีต้องการวิธีที่แตกต่างกัน:

  1. JMX ผ่านอุโมงค์ SSH พร้อมพร็อกซีถุงเท้าใช้ RMI มาตรฐานพร้อมเวทมนตร์ SSH http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP (ทางเลือกแทน RMI มาตรฐาน) ใช้พอร์ตคงที่เพียงพอร์ตเดียว แต่ต้องการ jar พิเศษบนเซิร์ฟเวอร์และไคลเอนต์ http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/

  3. เริ่มโค้ดฟอร์มเซิร์ฟเวอร์ JMX ซึ่งเป็นไปได้ที่จะใช้ RMI มาตรฐานและใช้พอร์ตที่สองคงที่: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055


คำตอบอื่น ๆ ทั้งหมดควรเป็นคำตอบเพิ่มเติม
ruruskyi

2

เมื่อทดสอบ / ดีบัก / วินิจฉัยปัญหา JMX ระยะไกลอันดับแรกให้พยายามเชื่อมต่อบนโฮสต์เดียวกันที่มี MBeanServer (เช่น localhost) เสมอเพื่อตัดปัญหาเครือข่ายและปัญหาเฉพาะอื่น ๆ ที่ไม่ใช่ JMX


2

มีคำตอบที่ดีอยู่แล้ว แต่มีวิธีที่ง่ายกว่าเล็กน้อยที่ฉันคิดว่าควรค่าแก่การแบ่งปัน

วิธีการของ sushicutta นั้นดี แต่เป็นแบบแมนนวลมากเพราะคุณต้องได้รับ RMI Port ทุกครั้ง โชคดีที่เราสามารถแก้ไขปัญหานี้ได้โดยใช้พร็อกซี SOCKS แทนที่จะเปิดอุโมงค์พอร์ตอย่างชัดเจน ข้อเสียของวิธีนี้คือแอป JMX ที่คุณใช้งานบนเครื่องของคุณต้องสามารถกำหนดค่าให้ใช้ Proxy ได้ กระบวนการส่วนใหญ่คุณสามารถทำได้จากการเพิ่มคุณสมบัติจาวา แต่บางแอพไม่รองรับสิ่งนี้

ขั้นตอน:

  1. เพิ่มอ็อพชัน JMX ให้กับสคริปต์เริ่มต้นสำหรับบริการ Java ระยะไกลของคุณ:

    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=8090
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    
  2. ตั้งค่าการเชื่อมต่อพร็อกซี SOCKS กับเครื่องระยะไกลของคุณ:

    ssh -D 9696 user@remotemachine.com
    
  3. กำหนดค่าแอปตรวจสอบ Java ภายในของคุณเพื่อใช้พร็อกซี SOCKS (localhost: 9696) หมายเหตุ: บางครั้งคุณสามารถทำได้จากบรรทัดคำสั่งเช่น:

    jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
    

2

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน (แม้ว่าฉันคิดว่าพอร์ต 2101 ไม่ได้มีส่วนช่วยในเรื่องนี้)

-Dcom.sun.management.jmxremote.port=2100
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>

ฉันกำลังเชื่อมต่อจากเครื่องระยะไกลไปยังเซิร์ฟเวอร์ที่มี Docker ทำงานอยู่และกระบวนการนี้อยู่ภายในคอนเทนเนอร์ นอกจากนี้ฉันหยุด firewallD แล้ว แต่ฉันไม่คิดว่านั่นเป็นปัญหาเพราะฉันสามารถ telnet ถึง 2100 ได้แม้จะเปิดไฟร์วอลล์ก็ตาม หวังว่าจะช่วยได้


1

ฉันใช้ JConsole / JVisualVm บน windows ที่เชื่อมต่อกับ tomcat ที่ใช้ Linux Redhat ES3

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

/usr/sbin/iptables -I INPUT -s jconsole-host -p tcp --destination-port jmxremote-port -j ACCEPT

โดยที่ jconsole-host เป็นชื่อโฮสต์หรือที่อยู่โฮสต์ที่ JConsole รันอยู่และ jmxremote-port คือหมายเลขพอร์ตที่กำหนดไว้สำหรับ com.sun.management.jmxremote.port สำหรับการจัดการระยะไกล


2
ไม่ได้ผลสำหรับฉันในอินสแตนซ์ SUSE Amazon EC2 ฉันคิดว่าปัญหาอยู่ที่อื่น
djangofan

1

ฉันใช้ boot2docker เพื่อเรียกใช้คอนเทนเนอร์นักเทียบท่าที่มี Tomcat อยู่ข้างในและฉันมีปัญหาเดียวกันวิธีแก้ปัญหาคือ:

  • เพิ่ม -Djava.rmi.server.hostname=192.168.59.103
  • ใช้พอร์ต JMX docker run ... -p 9999:9999 ...เดียวกันในการเป็นเจ้าภาพและภาชนะนักเทียบท่าเช่น: การใช้พอร์ตอื่นไม่ทำงาน

0

คุณต้องตรวจสอบให้แน่ใจด้วยว่าชื่อเครื่องของคุณแก้ไขกับ IP ที่ JMX เชื่อมโยงด้วย ไม่ใช่ localhost หรือ 127.0.0.1 สำหรับฉันมันได้ช่วยในการเข้าสู่โฮสต์ที่กำหนดสิ่งนี้อย่างชัดเจน


0

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


0

นี่คือขั้นตอนที่ใช้ได้ผลสำหรับฉัน (เดเบียนหลังไฟร์วอลล์ทางฝั่งเซิร์ฟเวอร์เข้าถึงผ่าน VPN จาก Mac ในเครื่องของฉัน):

ตรวจสอบ IP ของเซิร์ฟเวอร์

hostname -i

ใช้พารามิเตอร์ 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]

เรียกใช้แอปพลิเคชัน

ค้นหา pid ของกระบวนการ java ที่กำลังทำงานอยู่

ตรวจสอบพอร์ตทั้งหมดที่ใช้โดย JMX / RMI

netstat -lp | grep [pid from step 4]

เปิดพอร์ตทั้งหมดจากขั้นตอนที่ 5 บนไฟร์วอลล์

voila


0

เพื่อให้การสนับสนุนนี่คือสิ่งที่ฉันทำใน CentOS 6.4 สำหรับ Tomcat 6

  1. ปิดบริการ iptables

    service iptables stop
    
  2. เพิ่มบรรทัดต่อไปนี้ใน tomcat6.conf

    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[host_ip]"
    

ด้วยวิธีนี้ฉันสามารถเชื่อมต่อจากพีซีเครื่องอื่นโดยใช้ JConsole


0

ฉันกำลังพยายามให้ JMC รัน Flight Recorder (JFR) เพื่อสร้างโปรไฟล์ NiFi บนเซิร์ฟเวอร์ระยะไกลที่ไม่มีสภาพแวดล้อมแบบกราฟิกที่จะรัน JMC

จากคำตอบอื่น ๆ ที่ให้ไว้ที่นี่และจากการลองผิดลองถูกมากมายนี่คือสิ่งที่ฉันส่งให้กับ JVM ( conf / bootstrap.conf ) เมื่อฉันเปิด NiFi:

java.arg.90=-Dcom.sun.management.jmxremote=true
java.arg.91=-Dcom.sun.management.jmxremote.port=9098
java.arg.92=-Dcom.sun.management.jmxremote.rmi.port=9098
java.arg.93=-Dcom.sun.management.jmxremote.authenticate=false
java.arg.94=-Dcom.sun.management.jmxremote.ssl=false
java.arg.95=-Dcom.sun.management.jmxremote.local.only=false
java.arg.96=-Djava.rmi.server.hostname=10.10.10.92  (the IP address of my server running NiFi)

ฉันใส่สิ่งนี้ใน/ etc / hostsแม้ว่าฉันสงสัยว่าจำเป็น:

10.10.10.92   localhost

จากนั้นเมื่อเรียกใช้ JMC ฉันสร้างการเชื่อมต่อระยะไกลด้วยคุณสมบัติเหล่านี้:

Host: 10.10.10.92
Port: 9098
User: (nothing)
Password: (ibid)

อนึ่งถ้าฉันคลิก URL บริการ JMX ที่กำหนดเองฉันจะเห็น:

service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi

ในที่สุดก็ทำเพื่อฉัน

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