Connessione JMX remota


96

Sto cercando di aprire una connessione JMX a un'applicazione Java in esecuzione su una macchina remota.

La JVM dell'applicazione è configurata con le seguenti opzioni:

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

Sono in grado di connettermi localhost:1088utilizzando jconsole o jvisualvm. Ma non sono in grado di connettermi utilizzando xxx.xxx.xxx.xxx:1088da una macchina remota.

Non è presente alcun firewall tra i server o nel sistema operativo. Ma per eliminare questa possibilità io telnet xxx.xxx.xxx.xxx 1088e io pensiamo che ci si connetta, poiché lo schermo della console diventa vuoto.

Entrambi i server sono Windows Server 2008 x64. Ho provato con JVM a 64 bit e 32 bit, nessuno dei due funziona.


1
Probabilmente correlate al stackoverflow.com/questions/151238/...
tuler

Ecco la guida dettagliata stackoverflow.com/a/11654322/99834
sorin

Risposte:


117

Se fosse stato su Linux il problema sarebbe che localhost è l'interfaccia di loopback , è necessario che l'applicazione si leghi alla tua interfaccia di rete .

È possibile utilizzare netstat per confermare che non è associato all'interfaccia di rete prevista.

Puoi farlo funzionare richiamando il programma con il parametro di sistema java.rmi.server.hostname="YOUR_IP", sia come variabile d'ambiente che usando

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

7
Non dimenticare hostname -i, vedi stackoverflow.com/a/11654322/99834 per i dettagli.
sorin

Lavorato! Nel nostro ambiente utilizziamo macchine virtuali VMWare. Il server era su una VM. La VM è stata distribuita recintata in modo che abbia indirizzi IP interni e uno esterno. Abbiamo avviato il processo java del server con -Djava.rmi.server.hostname = <external-ip-address>.
buzz3791

Per impostare l'ip host o modificare l'ip localhost questo collegamento sarebbe utile.
Reza Ameri

Ho due domande qui: 1) E se si desidera utilizzare JMXMP invece di JMX. Quali sarebbero le configurazioni per questo? e 2) È possibile effettuare la connessione JMX senza caricare il protocollo RMI?
Kumar Vaibhav

64

Ho passato più di una giornata cercando di far funzionare JMX da localhost esterno. Sembra che SUN / Oracle non sia riuscita a fornire una buona documentazione su questo.

Assicurati che il seguente comando ti restituisca un IP reale o HOSTNAME. Se restituisce qualcosa come 127.0.0.1, 127.0.1.1 o localhost non funzionerà e dovrai aggiornare/etc/hosts file.

hostname -i

Ecco il comando necessario per abilitare JMX anche dall'esterno

-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

Dove, come hai supposto, myserver.example.com deve corrispondere a ciò che hostname -irestituisce.

Ovviamente, devi essere sicuro che il firewall non ti blocchi, ma sono quasi sicuro che questo non sia un tuo problema, il problema è l'ultimo parametro non documentato.


L'aggiunta di -Djava.rmi.server.hostname = myserver.example.com ha funzionato! Grazie!
Jim Bethancourt

Mi sono preso la libertà di aprire un bug della documentazione JDK per questo: bugs.openjdk.java.net/browse/JDK-8066405
Klara

2
"Assicurati che il seguente comando ti restituisca un IP reale o HOSTNAME. Se restituisce qualcosa come 127.0.0.1, 127.0.1.1 o localhost non funzionerà e dovrai aggiornare il file / etc / hosts." Che cosa?
PedroD

1
Solo un veloce no, il java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. Spero che questo aiuti qualcuno.
Sonny

24

Durante i miei test con Tomcat e Java 8, la JVM stava aprendo una porta temporanea oltre a quella specificata per JMX. Il codice seguente mi ha risolto; provalo se hai problemi in cui il tuo client JMX (ad esempio VisualVM non si connette.

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

Vedi anche Perché Java apre 3 porte quando JMX è configurato?



8

sembra che la tua citazione finale arrivi troppo presto. Dovrebbe essere dopo l'ultimo parametro.

Questo trucco ha funzionato per me.

Ho notato una cosa interessante: quando avvio la mia applicazione utilizzando la seguente riga di comando:

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

Se provo a connettermi a questa porta da una macchina remota utilizzando jconsole, la connessione TCP riesce, alcuni dati vengono scambiati tra jconsole remoto e l'agente jmx locale in cui è distribuito il mio MBean, quindi jconsole visualizza un messaggio di errore di connessione. Ho eseguito un'acquisizione con wirehark e mostra lo scambio di dati provenienti sia dall'agente che da jconsole.

Quindi, questo non è un problema di rete, se eseguo netstat -an con o senza la proprietà di sistema java.rmi.server.hostname, ho i seguenti collegamenti:

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

Significa che in entrambi i casi il socket creato sulla porta 9999 accetta connessioni da qualsiasi host su qualsiasi indirizzo.

Penso che il contenuto di questa proprietà di sistema venga utilizzato da qualche parte alla connessione e confrontato con l'indirizzo IP effettivo utilizzato dall'agente per comunicare con jconsole. E se questi indirizzi non corrispondono, la connessione non riesce.

Non ho avuto questo problema durante la connessione dallo stesso host utilizzando jconsole, solo da host remoti fisici reali. Quindi, suppongo che questo controllo venga effettuato solo quando la connessione proviene "dall'esterno".


Cosa intendi con "la tua citazione finale arriva troppo presto"? Ho lo stesso problema, vedo che viene stabilita la connessione TCP, ma alla fine jconsole afferma di non essere riuscito a connettersi.
tsuna

Non so, se ricordo bene, c'era una citazione aperta da qualche parte e questa citazione non era alla fine dei parametri. Forse era in uno script batch, non ricordo. Ma devo ammettere che questa risposta non ha senso riguardo alla domanda ... Forse la domanda è stata modificata? Nessuna notifica modificata sotto la domanda ... Non lo so, mi dispiace.
yohann.martineau

6

la cosa che funziona per me è stata impostare / etc / hosts in modo che punti il ​​nome host all'ip e non all'interfaccia di loopback e quindi riavviare la mia applicazione.

gatto / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Questa è la mia configurazione:

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

5

Grazie mille, funziona così:

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

Ho lo stesso problema e cambio qualsiasi nome host che corrisponde al nome host locale in 0.0.0.0, sembra funzionare dopo averlo fatto.


0

Per abilitare JMX remoto, passare sotto i parametri VM insieme al comando 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
Puoi dirmi perché è vincolante per 0.0.0.0 e non per un IP specifico
Babu James

0

Prova questo, ho testato per accedere a JMX all'interno del 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

Poi

$ jconsole localhost: 16000


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.