원격 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:1088
jconsole 또는 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
It means that in both cases the socket created on port 9999 accepts connections from any host on any address.
I think the content of this system property is used somewhere at connection and compared with the actual IP address used by agent to communicate with jconsole. And if those address do not match, connection fails.
I did not have this problem while connecting from the same host using jconsole, only from real physical remote hosts. So, I suppose that this check is done only when connection is coming from the "outside".
Thanks a lot, it works like this:
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
the thing that work for me was to set /etc/hosts to point the hostname to the ip and not to the loopback interface and than restart my application.
cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.0.1 myservername
This is my configuration:
-Dcom.sun.management.jmxremote.port=1617
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
I know this thread is pretty old, but there's an additional option that will help greatly. See here: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
-Dcom.sun.management.jmxremote.rmi.port=1099
I have the same issue and I change any hostname that matches the local host name to 0.0.0.0, it seems to work after I do that.
To enable JMX remote, pass below VM parameters along with JAVA Command.
-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
Try using ports higher than 3000.
참고URL : https://stackoverflow.com/questions/834581/remote-jmx-connection
'programing tip' 카테고리의 다른 글
디버깅 할 때 인수로 프로그램을 시작하려면 어떻게합니까? (0) | 2020.09.05 |
---|---|
std :: cout 조작 후 상태 복원 (0) | 2020.09.05 |
C #에서 XmlReader로 Xml 읽기 (0) | 2020.09.05 |
OrderBy 파이프 문제 (0) | 2020.09.05 |
IEqualityComparer를 사용하는 방법 (0) | 2020.09.05 |