Connexion JMX à distance
j'essaie d'ouvrir une connexion JMX à une application java tournant sur une machine distante.
L'application JVM est configurée avec les options suivantes:
- com.soleil.gestion.jmxremote
- com.soleil.gestion.jmxremote.port=1088
- com.soleil.gestion.jmxremote.authentifier=false
- com.soleil.gestion.jmxremote.ssl = false
je peux me connecter en utilisant localhost:1088
en utilisant jconsole ou jvisualvm.
Mais je ne peux pas me connecter en utilisant xxx.xxx.xxx.xxx:1088
depuis une machine distante.
il n'y a pas de pare-feu entre les serveurs, ou sur le système D'exploitation. Mais pour éliminer cette possibilité Je telnet xxx.xxx.xxx.xxx 1088
et je pense qu'il se connecte, comme l'écran de la console tourne blanc.
les deux serveurs sont Windows Server 2008 x64. Essayé avec 64 bits JVM et 32 bits, ni l'un ni l'autre ne fonctionne.
11 réponses
S'il avait été sur Linux le problème serait que localhost est l'interface de loopback , vous avez besoin d'application pour se lier à votre interface réseau .
vous pouvez utiliser netstat pour confirmer qu'il n'est pas lié à l'interface réseau attendue.
vous pouvez faire ce travail en invoquant le programme avec le paramètre de système java.rmi.server.hostname="YOUR_IP"
, soit comme une variable d'environnement ou en utilisant
java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
j'ai passé plus d'une journée à essayer de faire JMX pour travailler à l'extérieur de localhost. Il semble que SUN / Oracle n'ait pas fourni une bonne documentation à ce sujet.
assurez-vous que la commande suivante vous renvoie une vraie adresse IP ou un vrai nom D'hôte. S'il retourne quelque chose comme 127.0.0.1, 127.0.1.1 ou localhost, il ne fonctionnera pas et vous devrez mettre à jour le fichier /etc/hosts
.
hostname -i
Voici la commande nécessaire pour activer JMX même de l'extérieur
-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
où comme vous le supposiez, myserver.example.com doit correspondre à ce que hostname -i
retourne.
Évidemment, vous devez vous assurer que le pare-feu ne bloque pas vous, mais je suis presque sûr que ce n'est pas votre problème, le problème étant le dernier paramètre qui n'est pas documentée.
dans Mes tests avec Tomcat et Java 8, la JVM ouvrait un port éphémère en plus de celui spécifié pour JMX. Le code suivant m'a corrigé; essayez si vous avez des problèmes avec votre client JMX (par exemple VisualVM ne se connecte pas.
-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989
Voir aussi pourquoi Java ouvre 3 ports lorsque JMX est configuré?
http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
si vous essayez d'accéder à un serveur qui se trouve derrière un NAT - vous devrez probablement démarrer votre serveur avec l'option
-Djava.rmi.server.hostname=<public/NAT address>
de sorte que les talons RMI envoyés au client contiennent l'adresse publique du serveur permettant aux clients de l'extérieur d'y accéder.
il semble que votre citation finale arrive trop tôt. Il devrait être après le dernier paramètre.
Cette astuce a fonctionné pour moi.
j'ai remarqué quelque chose d'intéressant: quand je démarre mon application en utilisant la ligne de commande suivante:
java -Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
si j'essaie de me connecter à ce port à partir d'une machine distante en utilisant jconsole, la connexion TCP réussit, certaines données sont échangées entre JConsole distante et l'agent local jmx où mon MBean est déployé, puis jconsole affiche un message d'erreur de connexion. J'ai effectué une capture wireshark, et ça montre un échange de données provenant à la fois de l'agent et du jconsole.
donc, ce n'est pas un problème de réseau, si je réalise un netstat-an avec ou sans java.rmi.serveur.propriété du système hostname, j'ai les reliures suivantes:
TCP 0.0.0.0:9999 0.0.0.0:0 LISTENING
TCP [::]:9999 [::]:0 LISTENING
cela signifie que dans les deux cas la socket créée sur le port 9999 accepte les connexions de n'importe quel hôte sur n'importe quelle adresse.
je pense que le contenu de cette propriété système est utilisé quelque part à la connexion et comparé avec l'adresse IP réelle utilisée par agent pour communiquer avec jconsole. Et si ces adresses ne correspondent pas, la connexion échoue.
Je n'ai pas eu ce problème en me connectant à partir du même hôte en utilisant jconsole, seulement à partir de vrais hôtes physiques distants. Donc, je suppose que cette vérification n'est faite que lorsque la connexion vient de "l'extérieur".
Merci beaucoup, ça marche comme ça:
java - Djava.rmi.serveur.nom d'hôte = xxx.xxx.xxx.xxx - Dcom.soleil.gestion.jmxremote-Dcom.soleil.gestion.jmxremote.ssl=false-Dcom.soleil.gestion.jmxremote.authentifier=false-Dcom.soleil.gestion.jmxremote.port=25000-jar myjar .jar
ce qui a fonctionné pour moi était de configurer /etc/hosts pour pointer le nom d'hôte vers l'ip et non vers l'interface de loopback et de redémarrer mon application.
cat/etc / hosts
127.0.0.1 localhost.localdomain localhost
192.168.0.1 myservername
C'est ma configuration:
-Dcom.sun.management.jmxremote.port=1617
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
j'ai le même problème et j'ai changer n'importe quelle machine qui correspond au nom d'hôte local pour 0.0.0.0, il semble fonctionner après je le fais.
pour activer la télécommande JMX, passez sous les paramètres VM avec la commande 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
je sais que ce fil est assez vieux, mais il y a une option supplémentaire qui aidera grandement. Voir ici: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom /
-Dcom.sun.management.jmxremote.rmi.port=1099