55 votes

Connexion d'une instance JMX tomcat distante à l'aide de jConsole

J'essaie de me connecter à une instance JMX tomcat distante à l'aide de jConsole. Mais je n'arrive pas à me connecter avec succès. Avez-vous une idée ?

J'ai inclus l'option suivante dans tomcat distant catalina.sh :

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"

63voto

waxwing Points 10190

J'ai eu un problème similaire, sinon le même. Je pouvais me connecter au serveur JMX si je lançais jconsole localement sur la machine.

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

-Djava.rmi.server.hostname=<host ip>

à JAVA_OPTS aussi, et ça a marché.

36voto

Hajo Thelen Points 709

J'ai rassemblé des informations éparpillées sur le net, trouvées grâce aux conseils d'autres membres.

Le plus grand mal causé par JMX est (imo) le fait que JMX ouvre un deuxième port réseau alloué dynamiquement. Un pare-feu (comme iptables) le bloquera.

Solution pour tomcat sur linux :

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

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

modifier la section Server dans votre server.xml

<Server port="8005" ..>
  ...
  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="9840" rmiServerPortPlatform="9841"/>

définir certaines 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"

ceci active le contrôle d'accès pour JMX

jmxremote.access aura l'apparence suivante

monitorRole readonly
controlRole readwrite

fin jmxremote.password sera

monitorRole tomcat
controlRole tomcat

(juste de simples espaces)

redémarrer tomcat.

Maintenant, configurez 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

C'est fait !

Utilisez maintenant 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 la station de travail et le serveur, cela devrait fonctionner.

8voto

Matt Points 81

Quelle chaîne utilisez-vous comme url de connexion JMX ? Je n'ai pas l'intention de souligner l'évidence mais JConsole a une interface terrible et, selon moi, exige une url trop complexe avant de se connecter à une application JMX distante. La mienne ressemble à ceci :

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

2voto

joe p Points 224

Qu'est-ce que vous voulez dire exactement quand vous dites "But can't connect successfully." ? Y a-t-il un message d'erreur ? Essayez d'activer la journalisation dans jconsole et voyez si cela aide à déboguer.

Pour activer la journalisation de jconsole, éditez un fichier nommé logging.properties dans le répertoire dans lequel vous allez exécuter 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, démarrez jconsole avec :

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

2voto

andhdo Points 53

Si vous travaillez sous linux, modifiez le fichier catalina.sh en ajoutant :

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

ou modifier le fichier /etc/profile en tant que Root et relancer le fichier (source /etc/profile)

si vous travaillez sous Windows et que vous démarrez tomcat à partir de la ligne de commande, utilisez la variable d'environnement CATALINA_OPTS

si vous travaillez sous Windows et que vous démarrez tomcat en tant que service, vous devrez utiliser l'utilitaire monitor service pour configurer les paramètres d'initialisation du service (ni setenv.bat, ni catalina.bat, ni env-vars ne fonctionneront). pour cela, vous aurez besoin du nom du service qui apparaît dans services.msc (par exemple jasperreportsTomcat). Après, vous devrez ouvrir une console en tant qu'administrateur et 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 de jmx. Faites attention à ne pas ajouter d'espaces à 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 vous aidera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X