Connexion de l’instance tomcat JMX distante à l’aide de jConsole

J’essaie de me connecter à une instance distante de tomcat JMX en utilisant jConsole. Mais ne peut pas se connecter avec succès. Une idée?

J’ai inclus l’option suivante dans tomcat catalina.sh à distance:

 JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=9004 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false" 

J’ai eu un problème similaire, sinon le même. Je peux me connecter au serveur JMX si je lance jconsole localement sur la machine.

Il semble que le serveur RMI n’écoutait pas sur la bonne adresse IP. Donc, comme cela a été suggéré dans cette question connexe , j’ai ajouté ce qui suit:

 -Djava.rmi.server.hostname= 

à JAVA_OPTS aussi, et puis cela a fonctionné.

J’ai recueilli des informations réparties sur le net, trouvées avec des conseils d’autres membres.

La plupart des problèmes causés par JMX sont (imo) le fait que JMX ouvre un deuxième port réseau alloué dynamicment. Un pare-feu (comme iptables) va bloquer cela.

Solution pour tomcat sur Linux:

utilisez tomcat 6.0.24 ou un téléchargement plus récent catalina-jmx-remote.jar à partir des extras apache tomcat (utilisez browse sur la page de téléchargement de tomcat) copiez-le dans $ CTALINA_HOME \ lib

Cela vous permet de définir les deux ports utilisés par JMX

modifier la section Serveur de votre server.xml

  ...  

définir des variables d’environnement (par exemple dans setenv.sh)

 CATALINA_OPTS=" -Djava.rmi.server.hostname=IP-TO-LISTEN -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false" 

cela active le contrôle d’access pour JMX

jmxremote.access ressemblera

 monitorRole readonly controlRole readwrite 

fin jmxremote.password sera

 monitorRole tomcat controlRole tomcat 

(seulement des espaces simples)

redémarrez tomcat.

Configurez maintenant le pare-feu sur le serveur (par exemple iptables)

/ etc / sysconfig / iptables

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9840 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9841 -j ACCEPT 

et / etc / sysconfig / ip6tables

 -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9840 -j ACCEPT -A RH-Firewall-1-INPUT -m tcp -p tcp --dport 9841 -j ACCEPT 

redémarrer iptables

Terminé!

Maintenant, utilisez VisualVM ou JConsole sur votre poste de travail pour établir une connexion à rmiRegistryPortPlatform, 9840 dans notre exemple.

S’il n’y a plus de pare-feu entre le poste de travail et le serveur, cela devrait fonctionner.

Essayé avec Java 8

1. Ajoutez ceci à votre script de démarrage java tomcat:

 -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 

par exemple append dans bin / setenv.sh ceci:

 export CATALINA_OPTS="$CATALINA_OPTS \ -Dcom.sun.management.jmxremote.port=1616 \ -Dcom.sun.management.jmxremote.rmi.port=1616 \ -Dcom.sun.management.jmxremote.local.only=true \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false " 

2. Exécutez ceci sur votre ordinateur.

  • Utilisateurs Windows :

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Utilisateurs Linux et Mac :

    ssh user@remote-host -L 1616:remote-host:1616

3. Démarrez jconsole sur votre ordinateur

 jconsole localhost:1616 

4. Amusez-vous!

  • PS: à l’étape 2, en utilisant ssh et -L vous spécifiez que le port 1616 sur l’hôte local (client) doit être transféré vers le côté distant.
  • PS2 .: vous pouvez spécifier le même port pour les conversations JMX et RMI

Quelle chaîne utilisez-vous comme URL de connexion JMX? Je ne veux pas faire remarquer l’évidence, mais JConsole a une interface terrible et nécessite pour moi une url trop complexe avant de pouvoir se connecter à une application jmx distante. Le mien ressemble à ceci:

 service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi 

Activer JMX dans Tomcat8, testé avec succès dans mon POC

1 / Téléchargez catalina-jmx-remote.jar depuis le site Web apache et placez-le dans $CATALINA_HOME/lib .

2 / Prenez la sauvegarde server.xml / setenv.sh . Apportez les modifications à server.xml comme ci-dessous

  

3 / Apportez les modifications à $CATALINA_BASE/bin/setenv.sh comme –

 [...] JVM_OPTS="[...] -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=| <`hostname -i`> -Dcom.sun.management.jmxremote.password.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/apps/data/apache-tomcat-8_8080/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote=true " 

4 / Créez ces deux fichiers en tant que – $touch $CATALINA_BASE/conf/jmxremote.password contenant:

admin letmein

$touch $CATALINA_BASE/conf/jmxremote.access contenant:

admin readwrite

 $ chmod 600 jmxremote.password 

5 / Redémarrez tomcat et testez sur l’outil jconsole 🙂

 $echo|telnet 10.105.14.90 10001 

Que voulez-vous dire exactement quand vous dites “mais ne peut pas vous connecter avec succès”? Y a-t-il un message d’erreur? Essayez d’activer la connexion à jconsole et voyez si cela aide à le déboguer.

Pour activer jconsole logging, modifiez un fichier nommé logging.properties dans le répertoire dans lequel vous exécuterez jconsole, ajoutez:

 handlers= java.util.logging.ConsoleHandler .level=INFO java.util.logging.FileHandler.pattern = %h/java%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter java.util.logging.ConsoleHandler.level = FINEST java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter javax.management.level=FINEST javax.management.remote.level=FINEST 

Ensuite, lancez jconsole avec:

 jconsole -J-Djava.util.logging.config.file=logging.properties 

Si vous travaillez sur Linux, modifiez le fichier catalina.sh en ajoutant:

  CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname= -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" export CATALINA_OPTS 

ou modifiez le fichier / etc / profile en tant que root et réexécutez le fichier (source / etc / profile)

Si vous travaillez sur Windows et que vous démarrez tomcat à partir de la ligne de commande, utilisez la variable d’environnement CATALINA_OPTS

Si vous travaillez sur Windows et que vous démarrez tomcat en tant que service, vous devrez utiliser l’utilitaire de service de surveillance pour configurer les parameters d’initialisation du service (ni setenv.bat, catalina.bat ou env-vars ne fonctionneront). pour cela, vous aurez besoin du nom de service qui apparaît dans la liste services.msc (par exemple jasperreportsTomcat). Après, vous devrez ouvrir une console en tant qu’administrateur et l’exécuter (par exemple): tomcat6w.exe // MS // jasperreportsTomcat

avec cette commande apparaîtra une icône de plateau où vous pouvez ouvrir un panneau. Dans l’onglet “Java”, vous pouvez maintenant modifier les options jmx. Veillez à ne pas append d’espaces blancs à la fin et utilisez le symbole “[enter]” pour séparer chaque option ligne par ligne.

 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.61.101 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 

J’espère que cela aide

Vérifiez si votre serveur est derrière le pare-feu. JMX est basé sur RMI, qui ouvre deux ports au démarrage. L’un est le port de registre, la valeur par défaut est 1099 et peut être spécifiée par l’option com.sun.management.jmxremote.port. L’autre concerne la communication de données et est aléatoire, ce qui pose problème. Une bonne nouvelle est que, depuis JDK6, ce port aléatoire peut être spécifié par l’option com.sun.management.jmxremote.rmi.port.

Ajoutez la ligne dans votre répertoire {tomcat_dir} /bin/setenv.sh:

 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" 

J’ai eu quelque chose pour vous tous, afin de compléter l’enquête de tout cela. Il y a un truc, il arrive que l’outil de profileur connaisse le jvm en utilisant un port, mais le jvm continue la conversation en utilisant un autre port aléatoire. Si le jvm s’exécute dans une machine distante (par exemple: un serveur web-app tomcat) et que la machine distante est protégée contre les connexions sortantes et entrantes, vous devez définir la propriété système java com.sun.management.jmxremote.rmi.port à la même valeur de la propriété nommée com.sun.management.jmxremote.port

Source: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-resortingeve-rmiserver-stub-jmx-error Et regardez aussi ceci: http: //blog.cantremember .com / debugging-with-jconsole-jmx-ssh-tunnels /

J’espère consortingbuer aux gars!

Et bonne chance!

Eh bien, j’ai eu ce problème dans une machine Linux (machine virtuelle) et je l’ai corrigé en utilisant la propriété -Djava.rmi.server.hostname mais il y a une chose que je ne peux pas comprendre. Ma machine a 5 serveurs tomcat, tous ont jmx activé dans des ports consécutifs (8008,8018,8028 …) et un seul d’entre eux avait ce problème de connexion de JMX. Pas de pare-feu, pas de propriété -Djava.rmi.server.hostname dans aucun tomcat ….

Donc la chose est que je comprends le problème mais je ne peux pas comprendre pourquoi 4 de mes matous ont fonctionné et 1 d’entre eux pas.

PD: Mon anglais est très pauvre, je sais. Mes excuses.

PROTIP: Vous devez réparer (comme pour un numéro connu) les ports du registre RMI et du serveur JMX / RMI. Vous faites cela en mettant jar-file dans le répertoire-lib et en configurant un écouteur spécial. (Et bien sûr les drapeaux habituels pour activer JMX

  -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=8999 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname= \ 

Voir: JMX Remote Lifecycle Listener à l’ adresse http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

Modifier le fichier /etc/hosts sur Linux, où j’ai remplacé l’adresse de l’hôte local associée à mon compte par la machine ip, a résolu ce problème pour moi.