원격 JMX 연결


97

원격 컴퓨터에서 실행되는 Java 응용 프로그램에 대한 JMX 연결을 열려고합니다.

애플리케이션 JVM은 다음 옵션으로 구성됩니다.

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

localhost:1088jconsole 또는 jvisualvm을 사용 하여 연결할 수 있습니다. 하지만 xxx.xxx.xxx.xxx:1088원격 컴퓨터에서 연결할 수 없습니다 .

서버 사이 또는 OS에는 방화벽이 없습니다. 그러나 이러한 가능성을 없애기 telnet xxx.xxx.xxx.xxx 1088위해 콘솔 화면이 공백으로 바뀌면서 연결되는 것 같습니다.

두 서버 모두 Windows Server 2008 x64입니다. 64 비트 JVM 및 32 비트로 시도했지만 둘 다 작동하지 않습니다.



자세한 가이드는 stackoverflow.com/a/11654322/99834
sorin

답변:


118

Linux에서 문제가 발생하면 localhost가 루프백 인터페이스 라는 것 입니다. 네트워크 인터페이스 에 바인딩하려면 응용 프로그램이 필요합니다 .

netstat를 사용하여 예상 네트워크 인터페이스에 바인딩되지 않았는지 확인할 수 있습니다.

시스템 매개 변수로 프로그램을 java.rmi.server.hostname="YOUR_IP"환경 변수로 호출 하거나

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

7
를 잊지 마십시오 . 자세한 내용 hostname -istackoverflow.com/a/11654322/99834 를 참조하십시오.
sorin jul.

작동했습니다! 우리 환경에서는 VMWare 가상 머신을 사용합니다. 서버가 VM에있었습니다. VM은 분리되어 배포되어 내부 및 외부 IP 주소가 있습니다. -Djava.rmi.server.hostname = <external-ip-address>로 서버 Java 프로세스를 시작했습니다.
buzz3791

호스트 IP를 설정하거나 로컬 호스트 IP를 변경하려면이 링크 가 유용합니다.
Reza Ameri 2014

여기에 두 가지 질문이 있습니다. 1) JMX가 아닌 JMXMP를 사용하려면 어떻게해야합니까? 그에 대한 구성은 무엇입니까? 2) RMI 프로토콜을로드하지 않고 JMX 연결을 할 수 있습니까?
Kumar Vaibhav 2015

64

나는 JMX가 외부 로컬 호스트에서 작동하도록 하루 이상을 보냈습니다. SUN / Oracle이 이에 대한 좋은 문서를 제공하지 못한 것 같습니다.

다음 명령이 실제 IP 또는 HOSTNAME을 반환하는지 확인하십시오. 127.0.0.1, 127.0.1.1 또는 localhost와 같은 것을 반환하면 작동하지 않으며 /etc/hosts파일 을 업데이트해야 합니다.

hostname -i

다음은 외부에서도 JMX를 활성화하는 데 필요한 명령입니다.

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

가정 한대로 myserver.example.com은 hostname -i반환되는 것과 일치해야 합니다.

분명히 방화벽이 사용자를 차단하지 않는지 확인해야합니다.하지만 이것이 문제가 아니라고 확신합니다. 문제는 문서화되지 않은 마지막 매개 변수입니다.


-Djava.rmi.server.hostname = myserver.example.com을 추가하면 트릭이 생겼습니다! 감사!
Jim Bethancourt 2014

나는 이것을 위해 JDK 문서 버그를 여는 자유를 취했다 : bugs.openjdk.java.net/browse/JDK-8066405
Klara

2
"다음 명령이 실제 IP 또는 HOSTNAME을 반환하는지 확인하십시오. 127.0.0.1, 127.0.1.1 또는 localhost와 같은 것을 반환하면 작동하지 않으며 / etc / hosts 파일을 업데이트해야합니다." 뭐?
PedroD

1
그냥 빨리되지는 java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. 이것이 누군가를 돕기를 바랍니다.
Sonny

24

Tomcat 및 Java 8을 사용한 테스트에서 JVM은 JMX에 지정된 포트 외에 임시 포트를 열었습니다. 다음 코드는 나를 고쳤습니다. JMX 클라이언트 (예 : VisualVM 이 연결되지 않음 )에 문제가있는 경우 시도해보십시오 .

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

JMX가 구성되었을 때 Java가 3 개의 포트를 여는 이유 도 참조하십시오 .



8

당신의 결말 인용문이 너무 일찍 온다는 것은 이음새가 있습니다. 마지막 매개 변수 뒤에 있어야합니다.

이 트릭은 저에게 효과적이었습니다.

흥미로운 것을 발견했습니다. 다음 명령 줄을 사용하여 애플리케이션을 시작할 때 :

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

jconsole을 사용하여 원격 컴퓨터에서이 포트에 연결하려고하면 TCP 연결이 성공하고 일부 데이터가 원격 jconsole과 내 MBean이 배포 된 로컬 jmx 에이전트간에 교환 된 다음 jconsole이 연결 오류 메시지를 표시합니다. wireshark 캡처를 수행했으며 에이전트와 jconsole 모두에서 데이터 교환이 발생하는 것을 보여줍니다.

따라서 이것은 네트워크 문제가 아닙니다. java.rmi.server.hostname 시스템 속성을 사용하거나 사용하지 않고 netstat -an을 수행하면 다음과 같은 바인딩이 있습니다.

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

이는 두 경우 모두 포트 9999에서 생성 된 소켓이 모든 주소의 모든 호스트에서 연결을 허용 함을 의미합니다.

이 시스템 속성의 내용은 연결 어딘가에서 사용되며 에이전트가 jconsole과 통신하는 데 사용하는 실제 IP 주소와 비교됩니다. 그리고 해당 주소가 일치하지 않으면 연결이 실패합니다.

jconsole을 사용하여 동일한 호스트에서 연결하는 동안 실제 물리적 원격 호스트에서만이 문제가 발생하지 않았습니다. 따라서이 검사는 연결이 "외부"에서 올 때만 수행된다고 가정합니다.


"종료 인용문이 너무 이르다"는 것은 무슨 뜻입니까? 나는 같은 문제가 있고 TCP 연결이 만들어지는 것을 보았지만 결국 jconsole은 연결에 실패했다고 주장합니다.
tsuna

정확히 기억하고 있다면 어딘가에 견적이 열려 있었고이 견적이 매개 변수의 끝에 없었는지 모르겠습니다. 아마도 그것은 배치 스크립트에 있었을 것입니다. 기억이 나지 않습니다. 그러나 나는이 대답이 질문과 관련하여 의미가 없음을 인정해야합니다 ... 질문이 편집되었을 수 있습니까? 질문 아래에 수정 된 알림이 없습니다 ... 모르겠어요, 죄송합니다.
yohann.martineau 2013-04-05

6

나를 위해 일한 것은 / etc / hosts를 설정하여 호스트 이름이 루프백 인터페이스가 아닌 IP를 가리 키도록 설정하고 내 응용 프로그램을 다시 시작하는 것입니다.

고양이 / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

이것은 내 구성입니다.

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

5

감사합니다. 다음과 같이 작동합니다.

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false- Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar



0

나는 같은 문제가 있고 로컬 호스트 이름과 일치하는 호스트 이름을 0.0.0.0으로 변경했는데 그렇게 한 후에 작동하는 것 같습니다.


0

JMX 원격을 사용하려면 JAVA 명령과 함께 아래의 VM 매개 변수를 전달하십시오.

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in

1
이 0.0.0.0으로가 아닌 특정의 IP에 바인딩 왜 당신은 말해 줄 수
바부 제임스

0

이것을 시도하고 도커 컨테이너 내부의 JMX에 액세스하도록 테스트했습니다.

-Dcom.sun.management.jmxremote = true -Djava.rmi.server.hostname = localhost -Dcom.sun.management.jmxremote.port = 16000 -Dcom.sun.management.jmxremote.rmi.port = 16000 -Dcom.sun .management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.ssl = false

그때

$ jconsole localhost : 16000


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.