Öffnet Java 6 einen Standardport für JMX-Remoteverbindungen?
Meine konkrete Frage hat zu tun mit der JMX-wie in JDK 1.6: wenn ich einen Java-Prozess mit JRE 1.6 mit
com.sun.management.jmxremote
in der Kommandozeile, gibt Java wählen Sie eine Standard-port für remote-JMX-verbindungen?
Vorgeschichte: ich bin derzeit versucht, ein Verfahren zu entwickeln, um zu geben, um einen Kunden, der es Ihnen ermöglichen wird, eine Verbindung, unsere Prozesse via JMX-remote von einem anderen Rechner. Das Ziel ist facillitate Ihre remote-debugging einer situation auftreten, auf ein real-time-display-Konsole. Wegen Ihrer service-level-Vereinbarung, sind Sie stärker motiviert, um zu erfassen, wie viel Daten wie möglich, und wenn die situation scheint zu kompliziert zu beheben schnell, neu starten, die display-Konsole und erlaubt es, eine Verbindung zu der server-Seite.
Ich bin mir bewusst das ich laufen konnte jconsole auf JDK 1.6 Prozesse und jvisualvm auf post-JDK 1.6.7 Prozesse gegeben physischen Zugriff auf die Konsole. Da jedoch die betrieblichen Erfordernisse und der Menschen verbundenen Probleme, wir sind stark motiviert zu greifen, die Daten, die wir benötigen, aus der Ferne und Holen Sie auf und läuft wieder.
EDIT: ich bin mir bewusst, das command line port-Eigenschaft
com.sun.management.jmxremote.port=portNum
Die Frage, die ich versuche zu beantworten ist, wenn Sie nicht festlegen, dass das Eigentum an der Kommandozeile, gibt Java-wählen Sie einen anderen port für die Fernwartung? Wenn ja, wie können Sie bestimmen, was es sein könnte?
InformationsquelleAutor der Frage Bob Cross | 2009-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dokumentation deutet darauf hin, dass der JMX-agent verwendet eine lokalen port -- etwas, das nicht erreichbar von außerhalb der Maschine-es sei denn, Sie geben Sie die folgende Eigenschaft:
com.sun.management.jmxremote.port=portNum
Dies ist aus Gründen der Sicherheit, als auch für die Begründung von Mr. Potato Head. So wie es aussieht, Java 6 nicht öffnen Sie eine Standard - Remote-Zugriff - port für den JMX.
EDIT: Hinzugefügt nach der OP Hinzugefügt, die eine Antwort mit mehr Informationen.
Andere option, die Sie haben, um irgendwie erstellen Sie einen lokalen proxy, der hört auf alle lokalen JMX-verbindungen und exportiert diese Informationen. Auf diese Weise, Sie brauchen nicht zu haben, wie Magie Konfiguration der einzelnen JVM-Instanz auf dem server. Stattdessen wird der lokale proxy kann eine Verbindung zu allen JVM via JMX und dann irgendwie bewirken, dass diese Informationen aus der Ferne. Ich bin nicht positiv, wie genau würden Sie diese umsetzen, aber so etwas ist vielleicht weniger Arbeit als das, was Sie sonst zu tun haben zu setzen all Ihre JVMs aus der Ferne via JMX.
InformationsquelleAutor der Antwort Eddie
AFAIK
Hier sind die Möglichkeiten für den Anschluss eines JMX-client-Prozess (a - management-Anwendung wie jconsole, jmxterm, mc4j, jvmstat, jmxmonitor, jps, ...) zu einem JMX-server-Prozess (die agent).
Den Protokoll-Verbindung JMX-client und dem JMX-server wird angenommen, dass die Java-RMI' (aka 'RMI-JRMP'). Dies sollte der Standard sein. Man kann konfigurieren andere Protokolle, insbesondere die "RMI-IIOP' und 'JMXMP'. Spezielle Protokolle sind möglich: die MX4J Projekt zum Beispiel zusätzlich bietet SOAP/HTTP und verschiedene Serialisierung Protokolle über HTTP.
Finden Sun/Oracle docs für details zur Konfiguration.
Haben auch einen Blick auf die Datei
jre/lib/management/management.properties
in Ihrem JDK-distribution.Also die Möglichkeiten:
Case 0: Die JVM gestartet wird, ohne dass es einer besonderen Konfiguration
Vor Java 6: Die JVM verhält sich nicht wie ein JMX-server. Jedes Programm, das ausgeführt wird innerhalb der JVM kann den Zugriff auf die JVM ist MBeanServer programmgesteuert und es verwenden, um interessante Datenaustausch zwischen threads oder machen JVM-überwachung, aber keine Verwaltung, die von außerhalb der JVM-Prozess ist möglich.
Seit Java 6: Auch wenn nicht explizit konfiguriert, kann man auf die JMX-Funktionalität der JVM lokal (aus der gleichen Maschine), wie beschrieben in "Fall 1".
Fall 1: Die JVM gestartet wird mit
-Dcom.sun.management.jmxremote
JVM konfiguriert ist zum arbeiten als eine lokalen (gleiche Maschine nur) die JMX-server.
In diesem Fall (und im Prinzip nur für Sun/Oracle JVM) eine JMX-client die Verbindung mit dem JMX-server durch memory-mapped-Dateien, die sich im
/tmp/hsperfdata_[user]
. Dies ist angedeutet in der Sun-Dokumentation und als "lokale überwachung" (und auch die Attach-API). Es funktioniert nicht auf FAT-Dateisysteme, Berechtigungen können nicht gesetzt werden, da richtig. Sehen dieser blog-Eintrag.Sonne empfiehlt ausgeführt
jconsole
auf eine Maschine, die getrennt von den JMX-server alsjconsole
scheinbar ist ein Ressourcenfresser, so dass diese "lokale überwachung" - Ding ist nicht unbedingt eine gute Idee.Lokale überwachung ist jedoch ziemlich sicher, nur lokal nutzbar und wird leicht gesteuert durch die Dateisystem-Berechtigungen.
Fall 2: Die JMX-server gestartet wird mit
-Dcom.sun.management.jmxremote.port=[rmiregistryport]
JVM konfiguriert ist, um als ein JMX-server lauscht auf mehrere TCP-ports.
Den port auf der Kommandozeile angegeben wird, zugeordnet werden, die von der JVM und eine RMI-registry wird dort zur Verfügung. Die Registrierung wirbt ein Anschluss mit dem Namen 'jmxrmi'. Sie verweist auf eine zweite, zufällig zugewiesene TCP-port (eine 'Ephemere' port), auf dem die JMX-RMI-server überwacht und durch die der eigentliche Datenaustausch stattfindet.
Lokalen wie beschrieben in "Fall 1" ist immer aktiviert in 'Fall 2'.
Den JMX-server lauscht auf allen interfaces standardmäßig, so dass Sie eine Verbindung herstellen können (und Kontrolle) durch die lokale Verbindung zu 127.0.0.1:[rmiregistryport] sowie per Remote-Verbindung auf [alle externen IP-Adresse]:[Hafen] aus der Ferne.
Dies bedeutet, dass Sie haben, zu betrachten, die Auswirkungen auf die Sicherheit. Sie können die JVM-listen auf 127.0.0.1:[rmiregistryport] nur durch die Einstellung
-Dcom.sun.management.jmxremote.local.only=true
.Es ist eher bedauerlich, dass man sich nicht festlegen, wo die temporären port zugewiesen werden, - es ist immer zufällig ausgewählt beim Start. Dies kann auch bedeuten, dass Ihre firewall benötigt werden, um den Schweizer Käse der verdammten! Es gibt jedoch Problemumgehungen. Insbesondere, Apache Tomcat stellt das Ephemere JMX-RMI-server-port an, über seine JMX-Remote-Lifecycle-Listener. Der code zum ausführen dieser kleine Zauber finden Sie unter org.apache.catalina.mbeans.JmxRemoteLifecycleListener.
Wenn Sie diese Methode verwenden, könnte man genauso gut stellen Sie sicher, dass:
Wie das getan wird, ist beschrieben in die Sun/Oracle-Dokumentation
Andere Ansätze
Können Sie tun, interessante Permutationen um zu vermeiden, dass die Verwendung des RMI-Protokolls. Insbesondere könnte man hinzufügen, eine servlet-engine (wie Jetty) auf Ihren Prozess. Dann fügen Sie servlets, übersetzen einige HTTP-basierten exchange intern in direkten Zugriffe auf die JVM ist
MBeanServer
. Sie würden dann in "case 0', aber immer noch management-Funktionen, die möglicherweise durch eine HTML-basierte Schnittstelle. Die JBoss JMX-Konsole ist ein Beispiel dafür.Mehr off-topic, Sie könnte verwenden von SNMP-direkt (etwas, was ich noch nicht versucht) nach dieses Dokument.
Zeigen und zu Sagen, die Zeit
Und jetzt ist es Zeit für etwas code zur Veranschaulichung eines JXM exchange. Wir nehmen inspiration aus ein Sunoracle tutorial.
Dieser läuft auf Unix. Wir verwenden eine JVM, die konfiguriert ist, als ein JMX-server mit:
-Dcom.sun.management.jmxremote.port=9001
Verwenden wir
lsof
um zu überprüfen, welche TCP-ports Sie ist offen gehalten:lsof -p <processid> -n | grep TCP
Sollte man soetwas sieht, die registry-port und der temporären Ports:
Verwenden wir
tcpdump
zu untersuchen packet exchange zwischen JMX-client und dem JMX-server:tcpdump -l -XX port 36828 or port 9001
Legen wir eine Datei
.java.policy
im home-Verzeichnis des Clients zu ermöglichen, tatsächlich eine Remote-Verbindung:Und dann können wir sehen, was passiert:
InformationsquelleAutor der Antwort David Tonhofer
Tatsächlich gibt es eine undokumentierte Eigenschaft, die Sie verwenden können, um die Kraft der JMX-erstellen der Remote-Zugriff-Anschlüsse auf zufällige port-Nummern.
Beiden letzten Eigenschaften sind am wichtigsten.
InformationsquelleAutor der Antwort Ivan Koblik
Den Dokumentation scheint zu zeigen, dass der JMX-agent verwendet einen lokalen temporären port, , es sei denn, geben Sie die folgende Eigenschaft:
Standard-ports vermieden werden, weil Sie hätte viele java-Anwendungen auf einem system, und wenn es ein Standard-Anschluss, nur eine Applikation in der Lage wäre zu verwalten! Die oben genannten Konfigurations-Eigenschaft wird für die ausdrücklichen Zweck von remote management.
Wenn Sie müssen darauf bestehen, einen kurzlebigen port, dann die URL des JMX-agent zugegriffen werden soll, innerhalb der JVM, wird durch das folgende system property (obwohl dies wahrscheinlich eine lokale Adresse):
Hinweis: ich denke, Sie können immer öffnen Sie einen socket auf einem Remote-verfügbar-Adresse und proxy-Anfragen an den lokalen socket, aber mit der option erscheint viel attraktiver!
InformationsquelleAutor der Antwort
So, die kurze Antwort auf meine Frage ist "Nein".
Es ist jedoch interessant, zu untersuchen, warum. Blick auf die
netstat
Ausgabe eine gültige lokale Verbindung. Hier sind die ports, die ich sehe, eröffnet als Ergebnis einerjconsole
Herstellung einer lokalen Verbindung zu sich selbst herzustellen. Wie Sie sehen können, port-1650 ist der lokale port, der verwendet wird, für die JMX-Informationen:Es ist jedoch nicht ausreichend, um zu versuchen, eine Verbindung
jconsole
zulocalhost:1650
. Leider, alle, die net Sie ist eine "Connection failed: no such object in der Tabelle" Meldung.So, die Schlussfolgerung meines ursprünglichen Geschichte ist, dass, wenn wir gehen, um zu ermöglichen remote-überwachung mit JMX wir für unsere Kunden wirklich brauchen, um zu identifizieren, einzigartige individuelle remote-access-ports für die verschiedenen Java-Prozesse, die gestartet werden, in unserem system. Zum Glück, all dies erfordert, ist der kluge Einsatz des VM-argument:
wo wir fast sicher haben eine sequenzielle pre-spezifizierten Bereich von
portNum
so dass der Kunde wählen Sie die richtige remote-Anwendung mit der port-Nummer.InformationsquelleAutor der Antwort Bob Cross
Ich habe vor kurzem, um herauszufinden, wie, um remote-JMX-management von java-code aus, ohne dass die JVM gestartet wurden mit besonderen Eigenschaften festgelegt. Die Lösung ließ ich mich auf mein eigenes RMI-registry -- einfach genug -- und setzen Sie das JMX-Dienst auf, der Registrierung. Ich erstelle mir meine eigenen MBeanServer, dann erstellen Sie eine neue JMXConnectorServer. Die JMXConnectorServer erstellt durch einen Aufruf wie
Wobei server ist der MBeanServer und die url ist eine Instanz von JMXServiceURL.
Die url in der form "service:jmx:rmi:///jndi/rmi://localhost:/jmxrmi", wobei port die (lokale) private Register port-Nummer. "jmxrmi" ist die standard-service-Namen für die JMX service.
Nach der Einstellung, und starten Sie den connector, finde ich, dass ich eine Verbindung herstellen können, um es von jconsole mit hostname:port.
Diese Adressen ganz meine Bedürfnisse, werde ich daran interessiert zu wissen, wenn jemand sieht einen Fehler in diesem Ansatz.
Referenz: JMX Tutorial, Kap. 3
InformationsquelleAutor der Antwort Sane Dog
Wenn Sie geschehen, führen Sie Ihre Anwendung in Glassfish app server, führen Sie einfach den folgenden Befehl asadmin, würden Sie brauchen, um starten Sie alle Server, damit die änderung wirksam wird.
./asadmin enable-secure-admin
Gibt es extra Glassfish-server-Konfigurationen, um weitere Sicherheit aktivieren, sehen Sie mehr an Remote-Verbindung zu Glassfish über JMX.
InformationsquelleAutor der Antwort Yu Chen