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

j'essaie de me connecter à une instance distante 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 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"
55
demandé sur Dan Vinton 2009-08-12 06:58:51

12 réponses

j'ai eu un problème similaire, sinon le même. Je pourrais 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. Ainsi, comme il a été suggéré dans cette question connexe , j'ai ajouté ce qui suit:

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

à JAVA_OPTS ainsi, et puis il a travaillé.

63
répondu waxwing 2017-05-23 12:10:08

j'ai collecté des informations sur le net, trouvées avec des conseils d'autres membres.

la plus grande douleur causée par JMX est (imo) le fait que JMX ouvre un second port réseau dynamiquement alloué. Un pare-feu (comme iptables) le bloquera.

Solution pour tomcat sur linux:

utilisez tomcat 6.0.24 ou plus récent télécharger catalina-jmx à distance.jar de apache Tomcat extras (utiliser parcourir la page de téléchargement de tomcat)) le copier dans le $ CTALINA_HOME\lib

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

modifier la section Serveur de votre serveur.xml

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

définit certaines variables d'environnement (par ex. 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.l'accès ressemblera à

monitorRole readonly
controlRole readwrite

fin jmxremote.le mot de passe sera

monitorRole tomcat
controlRole tomcat

(de simples espaces)

redémarrer tomcat.

maintenant configurer 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

fait!

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

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

36
répondu Hajo Thelen 2014-02-19 09:32:11

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 de Windows :

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

  • Linux et Mac Utilisateurs :

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

3. Démarrer jconsole sur votre ordinateur

jconsole localhost:1616

4. Amusez-vous!

  • P.S.: pendant 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é du côté distant.
  • P.S. 2.: vous pouvez spécifier le même port pour JMX et RMI conversations
11
répondu freedev 2015-11-24 23:37:36

quelle chaîne de caractères Utilisez-vous comme url de connexion JMX? Je ne veux pas souligner l'évidence mais JConsole a une interface terrible et pour moi nécessite une url trop complexe avant de se connecter à une application distante jmx. Le mien ressemble à ceci:

service:jmx:rmi:///jndi/rmi://(hostname):(jmxport)/jmxrmi
8
répondu Matt 2017-07-21 09:26:16

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

1/ Téléchargez le catalina-jmx-remote.jar sur le site apache et place $CATALINA_HOME/lib .

2/ server.xml / setenv.sh de sauvegarde. Faites les modifications à server.xml comme ci-dessous -

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

3/ Faire 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éer ces deux fichiers comme suit: - $touch $CATALINA_BASE/conf/jmxremote.password contenant:

admin letmein

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

admin readwrite

$ chmod 600 jmxremote.password

5 / Redémarrer tomcat et tester l'outil jconsole:)

$echo|telnet 10.105.14.90 10001
3
répondu Bkkv 2016-11-08 14:08:32

Que voulez-vous dire lorsque vous dites "Mais ne pouvez pas vous connecter avec succès."? Est-il un message d'erreur? Essayez d'activer la journalisation dans jconsole et voyez si cela aide à la déboguer.

pour activer la journalisation jconsole, éditez un fichier nommé logging.propriétés dans le répertoire où vous lancerez jconsole, ajouter:

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, on commence par:

jconsole -J-Djava.util.logging.config.file=logging.properties
2
répondu joe p 2009-08-13 22:08:35

si vous travaillez sur linux, Modifiez la catalina.sh ajout de fichier:

                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 comme root et relire 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 le Service monitor utilitaire pour configurer les paramètres d'initialisation du service (ni setenv.chauve-souris, catalina.bat ou env-vars fonctionneront). pour cela, vous aurez besoin du nom du service qui apparaît dans la liste des 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ît une icône de plateau où vous pouvez ouvrir un panneau. Dans L'onglet" Java " maintenant vous pouvez modifier le jmx option. Attention à ne pas ajouter de blancs et utilisez le symbole "[enter]" pour séparer chaque ligne d'option 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
répondu andhdo 2013-10-11 14:52:18

vérifiez si votre serveur est derrière le pare-feu. JMX est basé sur RMI, qui ouvre deux ports au démarrage. Le premier est le port de Registre, la valeur par défaut est 1099, et peut être spécifié par le com.soleil.gestion.jmxremote.l'option port. L'autre est pour la communication de données, et est aléatoire, qui est ce qui cause problème. Une bonne nouvelle est que, à partir de JDK6, ce port aléatoire peut être spécifié par le com.soleil.gestion.jmxremote.rmi.l'option port.

ajouter la ligne en vous {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"
1
répondu arganzheng 2015-06-04 06:40:35

j'ai quelque chose pour vous tous, afin de compléter l'enquête de toute cette affaire. Il y a un truc, il arrive que profiler tool connecte avec la jvm en utilisant un port, mais la jvm continue la conversation en utilisant un autre port aléatoire. Si la jvm tourne à l'intérieur d'une machine distante (par exemple : un serveur d'application Web tomcat), et que la machine distante est protégée contre les connexions sortantes et entrantes, vous devez définir la propriété du système java com.sun.management.jmxremote.rmi.port à 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 aussi: http://blog.cantremember.com/debugging-with-jconsole-jmx-ssh-tunnels /

l'Espoir de contribuer gars!

et bonne chance!

1
répondu Victor 2017-04-13 12:13:38

Eh bien, j'ai eu ce problème dans une boîte Linux (machine virtuelle) et je l'ai corrigé en utilisant-Djava.rmi.serveur.propriété du nom d'hôte mais il y a une chose que je ne peux pas comprendre. Ma machine dispose de 5 serveurs tomcat, tous équipés de JMX dans des ports consécutifs (8008,8018,8028...) et un seul d'entre eux avait ce problème de connexion JMX. Pas de pare-feu, Pas de Djava.rmi.serveur.la propriété hostname dans n'importe quel tomcat....

donc la chose est que je comprends le problème mais je ne peux pas comprendre pourquoi 4 de mes tomcats ont fonctionné et un d'entre eux non.

P. D: mon anglais est très pauvre, je le sais. Toutes Mes Excuses.

0
répondu Icarokun 2011-11-17 09:12:05

PROTIP: vous devez corriger (comme si vous aviez un numéro connu) le Registre RMI et les ports de serveur JMX/RMI. Vous faites cela en mettant jar-file dans le lib-dir et en configurant un écouteur spécial. (Et bien sûr les options habituelles 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 distant Lifecycle Listener à http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

0
répondu supdog 2014-02-26 13:33:38

changer le /etc/hosts sur linux, où j'ai remplacé l'adresse localhost associée à mon compte sur la machine ip, a résolu ce problème pour moi.

0
répondu PedroG 2014-11-20 20:42:15