[java] 원격 JMX 연결

원격 컴퓨터에서 실행되는 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 비트로 시도했지만 둘 다 작동하지 않습니다.



답변

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

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

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

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


답변

나는 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반환되는 것과 일치해야 합니다.

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


답변

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

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

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


답변

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

NAT 뒤에있는 서버에 액세스하려는 경우-옵션을 사용하여 서버를 시작해야 할 것입니다.

-Djava.rmi.server.hostname=<public/NAT address>

따라서 클라이언트로 전송 된 RMI 스텁에는 서버의 공용 주소가 포함되어 외부에서 클라이언트가 도달 할 수 있습니다.


답변

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

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

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

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


답변

나를 위해 일한 것은 / 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


답변

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

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