Koneksi JMX jarak jauh

97

Saya mencoba membuka koneksi JMX ke aplikasi java yang berjalan di mesin jarak jauh.

Aplikasi JVM dikonfigurasi dengan opsi berikut:

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

Saya dapat terhubung localhost:1088menggunakan jconsole atau jvisualvm. Tetapi saya tidak dapat terhubung menggunakan xxx.xxx.xxx.xxx:1088dari mesin jarak jauh.

Tidak ada firewall di antara server, atau di OS. Tetapi untuk menghilangkan kemungkinan ini saya telnet xxx.xxx.xxx.xxx 1088dan saya pikir itu terhubung, karena layar konsol menjadi kosong.

Kedua server tersebut adalah Windows Server 2008 x64. Mencoba dengan 64-bit JVM dan 32-bit, tidak ada yang berhasil.

penggaris
sumber
1
Mungkin terkait dengan stackoverflow.com/questions/151238/…
tuler
Berikut adalah panduan rinci stackoverflow.com/a/11654322/99834
sorin

Jawaban:

118

Seandainya di Linux masalahnya adalah localhost adalah antarmuka loopback , Anda perlu aplikasi untuk mengikat ke antarmuka jaringan Anda .

Anda dapat menggunakan netstat untuk mengonfirmasi bahwa itu tidak terikat ke antarmuka jaringan yang diharapkan.

Anda dapat membuat ini bekerja dengan menjalankan program dengan parameter sistem java.rmi.server.hostname="YOUR_IP", baik sebagai variabel lingkungan atau menggunakan

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
takete.dk
sumber
7
Jangan lupa tentang hostname -i, lihat stackoverflow.com/a/11654322/99834 untuk detailnya.
sorin
Bekerja! Di lingkungan kami, kami menggunakan mesin virtual VMWare. Server menggunakan VM. VM di-deploy berpagar sehingga memiliki alamat IP internal dan eksternal. Kami memulai proses java server dengan -Djava.rmi.server.hostname = <external-ip-address>.
buzz3791
Untuk mengatur ip host atau mengubah ip localhost link ini akan berguna.
Reza Ameri
Saya punya dua pertanyaan di sini - 1) Bagaimana jika seseorang ingin menggunakan JMXMP daripada JMX. Konfigurasi apa untuk itu? dan 2) Apakah mungkin untuk membuat koneksi JMX tanpa memuat protokol RMI?
Kumar Vaibhav
64

Saya telah menghabiskan lebih dari satu hari mencoba membuat JMX bekerja dari luar localhost. Tampaknya SUN / Oracle gagal memberikan dokumentasi yang baik tentang hal ini.

Pastikan bahwa perintah berikut mengembalikan Anda IP atau HOSTNAME asli. Jika itu mengembalikan sesuatu seperti 127.0.0.1, 127.0.1.1 atau localhost itu tidak akan berfungsi dan Anda harus memperbarui /etc/hostsfile.

hostname -i

Berikut adalah perintah yang diperlukan untuk mengaktifkan JMX bahkan dari luar

-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

Dimana seperti yang Anda asumsikan, myserver.example.com harus cocok dengan hostname -ihasil.

Jelas, Anda harus yakin bahwa firewall tidak memblokir Anda, tetapi saya hampir yakin bahwa ini bukan masalah Anda, masalahnya adalah parameter terakhir yang tidak didokumentasikan.

sorin
sumber
Menambahkan -Djava.rmi.server.hostname = myserver.example.com berhasil! Terima kasih!
Jim Bethancourt
Saya memberanikan diri membuka bug dokumen JDK untuk ini: bugs.openjdk.java.net/browse/JDK-8066405
Klara
2
"Pastikan bahwa perintah berikut mengembalikan Anda IP atau HOSTNAME asli. Jika mengembalikan sesuatu seperti 127.0.0.1, 127.0.1.1 atau localhost, perintah ini tidak akan berfungsi dan Anda harus memperbarui file / etc / hosts." Apa?
PedroD
1
Jangan cepat, itu java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. Semoga ini bisa membantu seseorang.
Sonny
24

Dalam pengujian saya dengan Tomcat dan Java 8, JVM membuka port sementara selain yang ditentukan untuk JMX. Kode berikut memperbaiki saya; mencobanya jika Anda mengalami masalah di mana klien JMX Anda (misalnya VisualVM tidak terhubung.

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

Lihat juga Mengapa Java membuka 3 port saat JMX dikonfigurasi?

LeslieM
sumber
12

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

Jika Anda mencoba mengakses server yang berada di belakang NAT - kemungkinan besar Anda harus memulai server dengan opsi tersebut

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

sehingga rintisan RMI yang dikirim ke klien berisi alamat publik server yang memungkinkannya dijangkau oleh klien dari luar.

h0nIg
sumber
8

itu menegaskan bahwa kutipan akhir Anda datang terlalu dini. Ini harus setelah parameter terakhir.

Trik ini berhasil untuk saya.

Saya melihat sesuatu yang menarik: ketika saya memulai aplikasi saya menggunakan baris perintah berikut:

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

Jika saya mencoba menyambung ke port ini dari mesin jarak jauh menggunakan jconsole, sambungan TCP berhasil, beberapa data dipertukarkan antara jconsole jarak jauh dan agen jmx lokal tempat MBean saya digunakan, dan kemudian, jconsole menampilkan pesan kesalahan sambungkan. Saya melakukan pengambilan wireshark, dan itu menunjukkan pertukaran data yang berasal dari agen dan jconsole.

Jadi, ini bukan masalah jaringan, jika saya melakukan netstat -an dengan atau tanpa properti sistem java.rmi.server.hostname, saya memiliki binding berikut:

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

Ini berarti bahwa dalam kedua kasus soket yang dibuat pada port 9999 menerima koneksi dari sembarang host di alamat mana pun.

Saya pikir konten properti sistem ini digunakan di suatu tempat pada koneksi dan dibandingkan dengan alamat IP sebenarnya yang digunakan oleh agen untuk berkomunikasi dengan jconsole. Dan jika alamat tersebut tidak cocok, koneksi gagal.

Saya tidak mengalami masalah ini saat menyambung dari host yang sama menggunakan jconsole, hanya dari host jarak jauh fisik yang sebenarnya. Jadi, saya kira pemeriksaan ini dilakukan hanya ketika koneksi datang dari "luar".

yohann.martineau
sumber
Apa yang Anda maksud dengan "kutipan akhir Anda datang terlalu awal"? Saya memiliki masalah yang sama, saya melihat koneksi TCP sedang dibuat, tetapi akhirnya jconsole mengklaim gagal terhubung.
tsuna
Saya tidak tahu, jika saya ingat dengan benar, ada kutipan yang terbuka di suatu tempat dan kutipan ini tidak ada di akhir parameter. Mungkin itu dalam skrip batch, saya tidak ingat. Tetapi saya harus mengakui bahwa jawaban ini tidak masuk akal terkait pertanyaan ... Mungkin pertanyaan itu telah diedit? Tidak ada pemberitahuan yang diedit di bawah pertanyaan ... Saya tidak tahu, maaf.
yohann.martineau
6

hal yang berhasil bagi saya adalah mengatur / etc / hosts untuk mengarahkan nama host ke ip dan bukan ke antarmuka loopback dan kemudian memulai ulang aplikasi saya.

kucing / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Ini adalah konfigurasi saya:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
Maoz Zadok
sumber
5

Terima kasih banyak, ini berfungsi seperti ini:

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

pengguna3406690
sumber
0

Saya memiliki masalah yang sama dan saya mengubah nama host apa pun yang cocok dengan nama host lokal menjadi 0.0.0.0, tampaknya berfungsi setelah saya melakukannya.

ianpojman
sumber
0

Untuk mengaktifkan JMX jarak jauh, berikan parameter VM di bawah ini bersama dengan JAVA Command.

    -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
Ajay Kumar
sumber
1
Dapatkah Anda memberi tahu saya mengapa ini mengikat 0.0.0.0 dan bukan ke IP tertentu
Babu James
0

Coba ini, saya menguji untuk mengakses JMX di dalam container docker

-Dcom.sun.management.jmxremote = true -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

Kemudian

$ jconsole localhost: 16000

Emmerson
sumber
-11

Coba gunakan port yang lebih tinggi dari 3000.

darko.topolsek
sumber