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"
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é.
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.
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
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
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
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
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
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"
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!
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.
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
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.