web-dev-qa-db-fra.com

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

J'essaie de me connecter à une instance Tomcat JMX distante à l'aide de jConsole. Mais ne peut pas se connecter avec succès. Une idée?

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

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"
55
Niger

J'ai eu un problème similaire, si ce n'est le même problème. Je pourrais me connecter au serveur JMX si je démarrais jconsole localement sur la machine.

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

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

à Java_OPTS également, puis cela a fonctionné.

63
waxwing

J'ai collecté des informations réparties sur le réseau, avec des indications 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é dynamiquement. Un pare-feu (comme iptables) bloquera cela.

Solution pour Tomcat sur linux:

utilisez Tomcat 6.0.24 ou une version plus récentedownload catalina-jmx-remote.jar à partir des suppléments Apache Tomcat (utilisez parcourir 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 dans votre serveur.xml

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

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'accès pour JMX

jmxremote.access ressemblera à

monitorRole readonly
controlRole readwrite

end jmxremote.password sera 

monitorRole Tomcat
controlRole Tomcat

(juste des espaces simples)

redémarrez 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 

Terminé!

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

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

36
Hajo Thelen

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 ajouter 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émarrer jconsole sur votre ordinateur

jconsole localhost:1616

4. Amusez-vous!

  • P.S .: à l'étape 2, en utilisant ssh et -L, vous indiquez que le port 1616 sur l'hôte local (client) doit être transféré au côté distant.
  • P.S.2 .: vous pouvez spécifier le même port pour les conversations JMX et RMI
11
freedev

quelle chaîne utilisez-vous comme URL de connexion JMX? Je ne veux pas souligner 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
8
Matt

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

1/Téléchargez le catalina-jmx-remote.jar à partir du site Web Apache et placez-le dans $CATALINA_HOME/lib

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

<Listener className="org.Apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

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=<eth:0_IP>| <`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 jconsole tool :) 

$echo|telnet 10.105.14.90 10001
3
Bkkv

Que voulez-vous dire exactement lorsque vous dites "Mais ne pouvez pas vous connecter avec succès"? Y a-t-il un message d'erreur? Essayez de vous connecter à jconsole et voyez si cela vous aide à le 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, lancez jconsole avec:

jconsole -J-Djava.util.logging.config.file=logging.properties
2
joe p

si vous travaillez sur 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 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 devez utiliser l'utilitaire de service de surveillance pour configurer les paramètres d'initialisation de service (ni setenv.bat, catalina.bat ni 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 exécuter (par exemple): Tomcat6w.exe // MS // jasperreportsTomcat

avec cette commande apparaîtra une icône de la barre où vous pouvez ouvrir un panneau. Dans l'onglet "Java", vous pouvez maintenant modifier les options de jmx. Veillez à ne pas ajouter d'espaces blancs de fin et utilisez le symbole "[entrer]" 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 ça aide

2
andhdo

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 du registre, la valeur par défaut est 1099 et peut être spécifié par l'option com.Sun.management.jmxremote.port. L'autre est pour la communication de données, et est aléatoire, ce qui pose problème. Une bonne nouvelle est que, à partir de JDK6, ce port aléatoire peut être spécifié par l'option com.Sun.management.jmxremote.rmi.port. 

ajoutez la ligne dans votre {rép_tomcat} /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"
1
arganzheng

J'ai quelque chose pour vous tous, afin de compléter l'enquête de cette affaire. Il existe un truc: il arrive que l’outil de profilage se connecte au jvm en utilisant un port, mais le jvm continue la conversation en utilisant un autre port aléatoire. Si jvm est exécuté sur une machine distante (par exemple: un serveur d'applications Web Tomcat) et que la machine distante dispose d'une protection contre les connexions entrantes et sortantes, vous devez définir la propriété système Java com.Sun.management.jmxremote.rmi.port sur la même valeur que la propriété nommée com.Sun.management.jmxremote.port.

Source: https://serverfault.com/questions/308662/how-do-i-fix-a-failed-to-retrieve-rmiserver-stub-jmx-error Et vérifiez également ceci: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels/

J'espère pouvoir contribuer les gars!

Et bonne chance!

1
Victor

Eh bien, j'ai eu ce problème dans une machine Linux (machine virtuelle) et je l'ai corrigé à l'aide de la propriété -Djava.rmi.server.hostname, mais il y a une chose que je ne comprends pas. Ma machine a 5 serveurs Tomcat, jmx étant tous activés dans des ports consécutifs (8008,8018,8028 ...) et un seul d'entre eux a eu ce problème de connexion à JMX. Aucun pare-feu, aucune propriété -Djava.rmi.server.hostname dans aucun Tomcat ....

Donc, le problème, c'est que je comprends le problème mais je ne comprends pas pourquoi 4 de mes chats ont fonctionné et 1 pas.

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

0
Icarokun

Changer le /etc/hosts sur linux, où je remplaçais l'adresse de l'hôte local associé à mon compte par l'adresse IP de la machine, résolut ce problème pour moi. 

0
PedroG

PROTIP: Vous devez corriger (comme si vous aviez un numéro connu) les ports du registre RMI et du serveur JMX/RMI. Vous faites cela en plaçant 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=<HOSTNAME> \

Voir: JMX Remote Lifecycle Listener à http://Tomcat.Apache.org/Tomcat-6.0-doc/config/listeners.html

0
supdog