Kết nối JMX từ xa


96

Tôi đang cố mở kết nối JMX với ứng dụng java đang chạy trên một máy từ xa.

Ứng dụng JVM được cấu hình với các tùy chọn sau:

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

Tôi có thể kết nối bằng localhost:1088cách sử dụng jconsole hoặc jvisualvm. Nhưng tôi không thể kết nối bằng xxx.xxx.xxx.xxx:1088máy từ xa.

Không có tường lửa giữa các máy chủ hoặc trên hệ điều hành. Nhưng để loại bỏ khả năng này, tôi telnet xxx.xxx.xxx.xxx 1088và tôi nghĩ rằng nó kết nối với nhau, khi màn hình điều khiển chuyển sang trống.

Cả hai máy chủ đều là Windows Server 2008 x64. Đã thử với JVM 64 bit và 32 bit, đều không hoạt động.


1
Có thể liên quan đến stackoverflow.com/questions/151238/…
tuler

Dưới đây là chi tiết hướng dẫn stackoverflow.com/a/11654322/99834
Sorin

Câu trả lời:


117

Nếu trên Linux, vấn đề sẽ là localhost là giao diện loopback , bạn cần ứng dụng để liên kết với giao diện mạng của mình .

Bạn có thể sử dụng netstat để xác nhận rằng nó không bị ràng buộc với giao diện mạng mong đợi.

Bạn có thể thực hiện việc này bằng cách gọi chương trình với tham số hệ thống java.rmi.server.hostname="YOUR_IP", dưới dạng biến môi trường hoặc sử dụng

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

7
Đừng quên hostname -i, hãy xem stackoverflow.com/a/11654322/99834 để biết chi tiết.
sorin

Đã làm việc! Trong môi trường của chúng tôi, chúng tôi sử dụng máy ảo VMWare. Máy chủ nằm trên máy ảo. Máy ảo đã được triển khai hàng rào nên nó có địa chỉ IP bên trong và bên ngoài. Chúng tôi đã bắt đầu quy trình java máy chủ với -Djava.rmi.server.hostname = <external-ip-address>.
buzz3791

Để đặt ip máy chủ hoặc thay đổi ip localhost, liên kết này sẽ hữu ích.
Reza Ameri

Tôi có hai câu hỏi ở đây - 1) Điều gì sẽ xảy ra nếu một người muốn sử dụng JMXMP thay vì JMX. Cấu hình cho điều đó là gì? và 2) Có thể tạo kết nối JMX mà không cần tải giao thức RMI không?
Kumar Vaibhav

64

Tôi đã dành hơn một ngày để cố gắng làm cho JMX hoạt động từ bên ngoài localhost. Có vẻ như SUN / Oracle đã không cung cấp một tài liệu tốt về điều này.

Đảm bảo rằng lệnh sau trả về cho bạn một IP thực hoặc HOSTNAME. Nếu nó trả về một cái gì đó như 127.0.0.1, 127.0.1.1 hoặc localhost, nó sẽ không hoạt động và bạn sẽ phải cập nhật /etc/hoststệp.

hostname -i

Đây là lệnh cần thiết để kích hoạt JMX ngay cả từ bên ngoài

-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

Trong trường hợp như bạn đã giả định, myserver.example.com phải khớp với những gì hostname -itrả về.

Rõ ràng, bạn cần chắc chắn rằng tường lửa không chặn bạn, nhưng tôi gần như chắc chắn rằng đây không phải là vấn đề của bạn, vấn đề là tham số cuối cùng không được ghi lại.


Thêm -Djava.rmi.server.hostname = myserver.example.com đã thực hiện thủ thuật! Cảm ơn!
Jim Bethancourt

Tôi đã tự do mở lỗi tài liệu JDK cho điều này: bug.openjdk.java.net/browse/JDK-8066405
Klara

2
"Hãy chắc chắn rằng lệnh sau trả về cho bạn một IP thực hoặc HOSTNAME. Nếu nó trả về một cái gì đó như 127.0.0.1, 127.0.1.1 hoặc localhost, nó sẽ không hoạt động và bạn sẽ phải cập nhật tệp / etc / hosts." Gì?
PedroD

1
Chỉ cần nhanh chóng không, các java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>. Hy vọng điều này sẽ giúp ai đó.
Sonny

24

Trong thử nghiệm của tôi với Tomcat và Java 8, JVM đang mở một cổng tạm thời ngoài cổng được chỉ định cho JMX. Đoạn mã sau đã sửa lỗi cho tôi; Hãy thử nếu bạn đang gặp sự cố trong đó ứng dụng khách JMX của bạn (ví dụ : VisualVM không kết nối.

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

Cũng xem Tại sao Java mở 3 cổng khi JMX được cấu hình?


12

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

Nếu bạn đang cố gắng truy cập một máy chủ đặt sau NAT - hầu hết bạn sẽ phải khởi động máy chủ của mình với tùy chọn

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

để các cuống RMI được gửi đến máy khách chứa địa chỉ công cộng của máy chủ cho phép máy khách có thể tiếp cận nó từ bên ngoài.


8

nó kết luận rằng câu trích dẫn kết thúc của bạn đến quá sớm. Nó phải ở sau tham số cuối cùng.

Thủ thuật này đã làm việc cho tôi.

Tôi nhận thấy một điều thú vị: khi tôi khởi động ứng dụng của mình bằng dòng lệnh sau:

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

Nếu tôi cố gắng kết nối với cổng này từ một máy từ xa bằng jconsole, thì kết nối TCP thành công, một số dữ liệu được trao đổi giữa jconsole từ xa và tác nhân jmx cục bộ nơi MBean của tôi được triển khai và sau đó, jconsole hiển thị thông báo lỗi kết nối. Tôi đã thực hiện chụp wirehark và nó cho thấy sự trao đổi dữ liệu đến từ cả agent và jconsole.

Do đó, đây không phải là sự cố mạng, nếu tôi thực hiện một netstat -an có hoặc không có thuộc tính hệ thống java.rmi.server.hostname, tôi có các ràng buộc sau:

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

Có nghĩa là trong cả hai trường hợp, socket được tạo trên cổng 9999 chấp nhận kết nối từ bất kỳ máy chủ lưu trữ nào trên bất kỳ địa chỉ nào.

Tôi nghĩ rằng nội dung của thuộc tính hệ thống này được sử dụng ở đâu đó khi kết nối và được so sánh với địa chỉ IP thực được tác nhân sử dụng để giao tiếp với jconsole. Và nếu những địa chỉ đó không khớp, kết nối không thành công.

Tôi không gặp sự cố này khi kết nối từ cùng một máy chủ bằng jconsole, chỉ từ các máy chủ thực từ xa. Vì vậy, tôi cho rằng việc kiểm tra này chỉ được thực hiện khi kết nối đến từ "bên ngoài".


Ý bạn là gì khi "trích dẫn kết thúc của bạn đến quá sớm"? Tôi gặp vấn đề tương tự, tôi thấy kết nối TCP được thực hiện, nhưng cuối cùng jconsole tuyên bố nó không kết nối được.
tsuna

Tôi không biết, nếu tôi nhớ không nhầm, có một câu trích dẫn mở ở đâu đó và câu trích dẫn này không nằm ở cuối thông số. Có lẽ nó nằm trong một tập lệnh hàng loạt, tôi không thể nhớ được. Nhưng tôi phải thừa nhận câu trả lời này không có ý nghĩa gì liên quan đến câu hỏi ... Có lẽ câu hỏi đã được chỉnh sửa? Không có thông báo đã chỉnh sửa nào dưới câu hỏi ... Tôi không biết, tôi xin lỗi.
yohann.martineau

6

điều phù hợp với tôi là đặt / etc / hosts để trỏ tên máy chủ tới ip chứ không phải giao diện loopback và khởi động lại ứng dụng của tôi.

cat / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Đây là cấu hình của tôi:

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

5

Cảm ơn rất nhiều, nó hoạt động như thế này:

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

Tôi gặp vấn đề tương tự và tôi thay đổi bất kỳ tên máy chủ nào khớp với tên máy chủ cục bộ thành 0.0.0.0, nó dường như hoạt động sau khi tôi làm điều đó.


0

Để kích hoạt điều khiển từ xa JMX, hãy chuyển các tham số VM bên dưới cùng với Lệnh JAVA.

    -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
Bạn có thể cho tôi biết tại sao nó gắn vào 0.0.0.0 và không để một IP nhất định
Babu James

0

Hãy thử điều này, tôi đã kiểm tra để truy cập JMX bên trong bộ chứa docker

-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

Sau đó

$ jconsole localhost: 16000


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.