[jmx] 원격 JMX JConsole을 사용하는 사람이 있습니까?

나는 과거에 이것을 작동하지 않은 것 같습니다. 현재는 작동하지 않는다는 것을 알고 있습니다.

그러나 우리는 Java 프로세스를 시작합니다.

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

포트에 텔넷을 연결할 수 있고 “무언가 있습니다”(즉, 프로세스를 시작하지 않으면 응답이 없지만 수행하면 응답이 있음). JConsole이 IP를 채우는 작업을 수행하지 못합니다. 및 포트.

너무 단순해야하지만 오류, 소음, 아무것도 없어야합니다. 작동하지 않습니다.

누구든지 이것에 대한 뜨거운 팁을 알고 있습니까?



답변

이에 대한 해결책이 있습니다.

귀하의 경우 자바 프로세스는 방화벽 뒤에 리눅스에서 실행 하면 시작하려는 JConsole의 / 자바 VisualVM과 / 자바 미션 컨트롤 에 연결하려면 로컬 컴퓨터에 Windows의를 자바 프로세스의 JMX 포트 .

SSH 로그인을 통해 Linux 시스템에 액세스해야합니다. 모든 통신은 SSH 연결을 통해 터널링됩니다.

팁 : 이 솔루션은 방화벽이 있는지 여부에 관계없이 작동합니다.

단점 : Java 프로세스 를 다시 시작할 때 마다 4-9 단계의 모든 단계를 다시 수행해야합니다.

1. 여기에서 Windows 시스템 용 퍼티 스위트가 필요합니다.

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

적어도 putty.exe

2. Linux 시스템에서 하나의 사용 가능한 포트를 정의하십시오.

<jmx-remote-port>

예:

jmx-remote-port = 15666

3. 리눅스 머신의 자바 프로세스에 인수 추가

이것은 정확히 이와 같이 수행되어야합니다. 아래와 같이 수행되면 방화벽 뒤의 Linux 머신에서 작동합니다 ( -Djava.rmi.server.hostname=localhost논쟁의 원인으로 작동합니다 ).

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

예:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main

4. Java 프로세스의 Process-Id 가져 오기

ps -ef | grep <java-processname>

result ---> <process-id>

예:

ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321

5. RMIServer 스텁 다운로드를위한 임의의 포트 찾기

Java 프로세스는 Linux 시스템에서 새 TCP 포트를 엽니 다. 여기서 RMI 서버 스텁을 다운로드 할 수 있습니다. 이 포트는 또한 Java Virtual Machine에 연결하기 위해 SSH 터널을 통해 사용할 수 있어야합니다.

으로 netstat -lp이 포트는 찾을 수는 lsof -iJava 프로세스 형태로 개설되었습니다 어떤 포트 힌트를 제공합니다.

참고 :이 포트는 Java 프로세스가 시작될 때 항상 변경됩니다.

netstat -lp | grep <process-id>

tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java


result ---> <rmi-server-port>

예:

netstat -lp | grep 24321

tcp        0      0 *:15666     *:*     LISTEN      24321/java
tcp        0      0 *:37123     *:*     LISTEN      24321/java


result ---> 37123

6. putty를 사용하여 Windows 시스템에서 두 개의 SSH 터널을 활성화합니다.

Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto

Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto

예:

Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto

Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto

Putty를 통해 SSL 터널을 열기위한 설정

7.이 SSH-Tunnel이 활성화 된 Putty로 Linux 시스템에 로그인합니다.

퍼티 세션을 열어 둡니다.

로그인하면 Putty는 SSH 포트 22를 통해 모든 TCP 연결을 Linux 시스템에 터널링합니다.

JMX 포트 :

Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666

RMIServer-Stub-Port :

Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123

8. 다음 URL을 사용하여 JConsole / Java VisualVM / Java Mission Control을 시작하여 Java 프로세스에 연결합니다.

이것은 JConsole / Java VisualVM / Java Mission Control이 로컬 Windows 시스템의 포트에 연결한다고 생각하기 때문에 작동합니다. 그러나 Putty는 모든 페이로드를 Linux 시스템의 포트 15666으로 보냅니다.

리눅스 머신에서는 먼저 자바 프로세스가 응답을 제공하고 RMIServer 포트를 다시 보냅니다. 이 예에서는 37123입니다.

그런 다음 JConsole / Java VisualVM / Java Mission Control은 localhost : 37123에 연결되어 있다고 생각하고 putty는 전체 페이로드를 Linux 시스템으로 전송합니다.

자바 프로세스가 응답하고 연결이 열립니다.

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi

예:

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi

jmx 서비스 URL을 통해 연결

9. 즐기기 # 8-]


답변

추가하면 -Djava.rmi.server.hostname='<host ip>'이 문제가 해결되었습니다.


답변

Java 8 이상 버전으로 시도

이 솔루션은 방화벽에서도 잘 작동합니다.

1. 원격 호스트의 자바 시작 스크립트에 다음을 추가합니다.

-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

2. 이것을 컴퓨터에서 실행하십시오.

  • Windows 사용자 :

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux 및 Mac 사용자 :

    ssh user@remote-host -L 1616:remote-host:1616

3. jconsole컴퓨터에서 시작

jconsole localhost:1616

4. 재미있게 보내세요!

추신 : 2 단계 동안 사용 ssh하고 -L로컬 (클라이언트) 호스트의 포트 1616을 원격 측으로 전달해야 함을 지정합니다. 이것은 ssh 터널이며 방화벽이나 다양한 네트워크 문제를 방지하는 데 도움이됩니다.


답변

방화벽에 문제가있을 수 있습니다. ‘문제’는 지정한 포트가 사용되는 유일한 포트가 아니라 RMI에 대해 1 개 또는 2 개 이상의 포트를 사용하며 방화벽에 의해 차단 될 수 있다는 것입니다.

기본 RMI 구성을 사용하는 경우 추가 포트 중 하나를 미리 알 수 없으므로 큰 범위의 포트를 열어야합니다. 이는 서버 관리자를 즐겁게하지 않을 수 있습니다.

많은 포트를 열 필요가없는 솔루션이 있지만 소스 스 니펫과 팁을 결합하여 작동하도록했습니다.

http://forums.sun.com/thread.jspa?threadID=5267091- 링크가 더 이상 작동하지 않습니다.

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

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

ssh 터널을 설정하고 작동시킬 수도 있습니다. 🙂


답변

지난 며칠 동안 내 Google-fu를 테스트 한 후 마침내 Stack Overflow와이 페이지 http://help.boomi.com/atomsphere/GUID-F787998C- 에서 답변을 컴파일 한 후이 작업을 수행 할 수있었습니다 . 53C8-4662-AA06-8B1D32F9D55B.html .

Dell Boomi 페이지에서 재 게시 :

To Enable Remote JMX on an Atom

If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.

Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.

Add the following lines to the file:

-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Stack Overflow 답변 표지를 보지 못한 한 줄은

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

제 경우에는 Kakfa 메트릭을 검색하려고했기 때문에 위의 옵션을 -Dcom.sun.management.jmxremote.port값 과 일치하도록 변경했습니다 . 따라서 어떤 종류의 인증도없이 최소한의 구성은 다음과 같아야합니다.

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)

-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)


답변

Linux에서 실행 중입니까? 관리 에이전트가 localhost에 바인딩되어있을 수 있습니다.

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1


답변

Sushicutta의 4-7 단계는 3 단계에 다음 줄을 추가하여 건너 뛸 수 있습니다.

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>

예 : 시작 매개 변수에 추가 :

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

포트 포워딩의 경우 다음을 사용하여 연결합니다.

ssh -L 12345:localhost:12345 <username>@<host>

호스트가 디딤돌 인 경우 위의 단계 이후에 디딤돌에서 다음을 실행하여 포트를 앞으로 연결하면됩니다.

ssh -L 12345:localhost:12345 <username>@<host2>

jmxremote가 rmi 연결이 터널을 사용하도록 지시하는지 확인 하려면 hostname = localhost 가 필요합니다. 그렇지 않으면 직접 연결을 시도하고 방화벽에 도달 할 수 있습니다.