Uzaktan JMX bağlantısı


97

Uzak bir makinede çalışan java uygulamasına bir JMX bağlantısı açmaya çalışıyorum.

JVM uygulaması aşağıdaki seçeneklerle yapılandırılır:

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

localhost:1088Jconsole veya jvisualvm kullanarak bağlanabiliyorum . Ancak xxx.xxx.xxx.xxx:1088uzak bir makineden kullanarak bağlanamıyorum .

Sunucular arasında veya işletim sisteminde güvenlik duvarı yoktur. Ancak bu olasılığı ortadan kaldırmak telnet xxx.xxx.xxx.xxx 1088için konsol ekranı kararırken, ben ve bence bağlantı kuruluyor.

Her iki sunucu da Windows Server 2008 x64'dür. 64-bit JVM ve 32-bit ile denendi, ikisi de çalışmıyor.



Yanıtlar:


119

Linux'ta olsaydı sorun localhost'un geri döngü arayüzü olması olabilirdi, ağ arayüzünüze bağlanmak için uygulamaya ihtiyacınız var .

Netstat'ı, beklenen ağ arayüzüne bağlı olmadığını doğrulamak için kullanabilirsiniz.

Bunu, programı sistem parametresiyle java.rmi.server.hostname="YOUR_IP"bir ortam değişkeni olarak veya kullanarak çalıştırarak yapabilirsiniz.

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

7
Unutmayın hostname -i, ayrıntılar için stackoverflow.com/a/11654322/99834 adresine bakın.
sorin

Çalıştı! Ortamımızda VMWare sanal makineleri kullanıyoruz. Sunucu bir VM üzerindeydi. VM, dahili ve harici IP adreslerine sahip olması için çitle çevrildi. Sunucu java sürecini -Djava.rmi.server.hostname = <external-ip-address> ile başlattık.
buzz3791

Ana bilgisayar ipini ayarlamak veya localhost ipini değiştirmek için bu bağlantı faydalı olacaktır.
Reza Ameri

Burada iki sorum var - 1) JMX yerine JMXMP kullanmak isterse ne olur? Bunun için yapılandırma ne olurdu? ve 2) RMI protokolünü yüklemeden JMX bağlantısını yapmak mümkün müdür?
Kumar Vaibhav

65

JMX'in localhost'un dışından çalışmasını sağlamak için bir günden fazla zaman harcadım. Görünüşe göre SUN / Oracle bu konuda iyi bir dokümantasyon sağlayamadı.

Aşağıdaki komutun size gerçek bir IP veya HOSTNAME döndürdüğünden emin olun. 127.0.0.1, 127.0.1.1 veya localhost gibi bir şey döndürürse çalışmaz ve /etc/hostsdosyayı güncellemeniz gerekir .

hostname -i

JMX'i dışarıdan bile etkinleştirmek için gereken komut burada

-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

Varsayacağınız yerde, myserver.example.com'un dönenlerle eşleşmesi gerekir hostname -i.

Açıkçası, güvenlik duvarının sizi engellemediğinden emin olmalısınız, ancak bunun sizin sorununuz olmadığından neredeyse eminim, sorun belgelenmeyen son parametredir.


-Djava.rmi.server.hostname = myserver.example.com'u eklemek hile yaptı! Teşekkürler!
Jim Bethancourt

Bunun için bir JDK docs bug açma özgürlüğünü aldım: bugs.openjdk.java.net/browse/JDK-8066405
Klara

3
"Aşağıdaki komutun size gerçek bir IP veya HOSTNAME döndürdüğünden emin olun. 127.0.0.1, 127.0.1.1 veya localhost gibi bir şey döndürürse çalışmaz ve / etc / hosts dosyasını güncellemeniz gerekir." Ne?
PedroD

1
Sadece hızlı değil java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>,. Umarım bu birine yardımcı olur.
Sonny

@PedroD: SİZ, genel IP'niz ve "-Djava.rmi.server.hostname" için kullandığınız ana bilgisayar adı ile / etx / hosts için bir giriş yapmanız gerekiyor
Sebastian



8

son sözünüzün çok erken geldiğini gösteriyor. Son parametreden sonra olmalıdır.

Bu numara benim için çalıştı.

İlginç bir şey fark ettim: aşağıdaki komut satırını kullanarak uygulamamı başlattığımda:

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

Bu bağlantı noktasına jconsole kullanarak uzak bir makineden bağlanmaya çalışırsam, TCP bağlantısı başarılı olur, uzak jconsole ile MBean'imin yerleştirildiği yerel jmx aracısı arasında bazı veriler değiş tokuş edilir ve ardından jconsole bir bağlantı hatası mesajı görüntüler. Bir wireshark yakalama gerçekleştirdim ve hem ajan hem de jconsole'dan gelen veri alışverişini gösteriyor.

Bu nedenle, bu bir ağ sorunu değildir, java.rmi.server.hostname sistem özelliği ile veya olmadan bir netstat gerçekleştirirsem, aşağıdaki bağlamalarım olur:

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

Bu, her iki durumda da 9999 numaralı bağlantı noktasında oluşturulan soketin herhangi bir adresteki herhangi bir ana bilgisayardan gelen bağlantıları kabul ettiği anlamına gelir.

Bu sistem özelliğinin içeriğinin bağlantıda bir yerde kullanıldığını ve aracı tarafından jconsole ile iletişim kurmak için kullanılan gerçek IP adresiyle karşılaştırıldığını düşünüyorum. Ve bu adresler eşleşmezse, bağlantı başarısız olur.

Aynı ana bilgisayardan jconsole kullanarak, yalnızca gerçek fiziksel uzak ana bilgisayarlardan bağlanırken bu sorunu yaşamadım. Öyleyse, bu kontrolün yalnızca bağlantı "dışarıdan" geldiğinde yapıldığını varsayıyorum.


"Son sözünüz çok erken geliyor" derken neyi kastediyorsunuz? Bende de aynı sorun var, TCP bağlantısının yapıldığını görüyorum, ancak sonunda jconsole bağlanamadığını iddia ediyor.
tsuna

Bilmiyorum, eğer doğru hatırlıyorsam, bir yerde açık bir alıntı vardı ve bu alıntı parametrelerin sonunda değildi. Belki toplu bir senaryodaydı, hatırlayamıyorum. Ama itiraf etmeliyim ki bu cevap soru ile ilgili bir anlam ifade etmiyor ... Soru düzenlenmiş olabilir mi? Sorunun altında düzenlenmiş bildirim yok ... Bilmiyorum, üzgünüm.
yohann.martineau

6

Benim için işe yarayan şey, / etc / hosts dosyasını geri döngü arayüzüne değil, ana bilgisayar adını ip'e yönlendirecek şekilde ayarlamak ve uygulamamı yeniden başlatmaktı.

cat / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Bu benim yapılandırmam:

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

5

Çok teşekkürler, şu şekilde çalışıyor:

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

Aynı sorunu yaşıyorum ve yerel ana bilgisayar adıyla eşleşen herhangi bir ana bilgisayar adını 0.0.0.0 olarak değiştiriyorum, bunu yaptıktan sonra çalışıyor gibi görünüyor.


0

JMX uzaktan kumandasını etkinleştirmek için, JAVA Komutu ile birlikte aşağıdaki VM parametrelerini iletin.

    -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
Bana neden belirli bir IP için değil de 0.0.0.0'a bağlı olduğunu söyleyebilir misiniz
Babu James

0

Bunu deneyin, JMX'e docker container içinde erişmeyi test ettim

-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

Sonra

$ jconsole localhost: 16000


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.