Недавно я столкнулся с проблемой, когда мне не удалось установить удаленное соединение JMX с экземпляром Apache ServiceMix, который работал на удаленном сервере Linux. В этом посте я опишу конфигурацию, необходимую для успешного подключения JMX к ServiceMix, развернутого на Cent OS Server 6.2 с использованием JConsole или VisualVM.
Список двоичных файлов, используемых в этом примере:
Когда Apache ServiceMix развернут в системе Windows, вы сможете установить удаленное соединение JMX с использованием JConsole или VisualVM без каких-либо проблем. Однако в Linux может потребоваться дополнительная настройка, прежде чем можно будет установить удаленное соединение JMX. Чтобы установить удаленное соединение JMX, в JVM должно быть установлено следующее свойство:
-Dcom.sun.management.jmxremote
Быстрая проверка скрипта [install_dir] / bin / servicemix подтвердит, что это свойство устанавливается в JVM Linux, так почему нельзя установить соединение?
Если у вас возникла проблема с удаленным подключением JMX к экземпляру Apache ServiceMix, работающему на сервере Linux, проверьте следующие два элемента:
1) Результат hostname -i
hostname -i
Если эта команда вернется с адресом 127.0.0.1, файл / etc / hosts необходимо будет отредактировать так, чтобы имя хоста соответствовало IP-адресу хоста. IP-адрес хоста можно найти, выполнив следующую команду:
[jsherman@saturn apache-servicemix-4.4.1-fuse-03-06]$ ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:85:EE:F9 inet addr:192.168.26.176 Bcast:192.168.26.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe85:eef9/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11428 errors:0 dropped:0 overruns:0 frame:0 TX packets:8272 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1544128 (1.4 MiB) TX bytes:5504745 (5.2 MiB) Interrupt:19 Base address:0x2000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:680 errors:0 dropped:0 overruns:0 frame:0 TX packets:680 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:54936 (53.6 KiB) TX bytes:54936 (53.6 KiB)
Из этого вывода вы можете видеть IP-адрес 192.168.26.176.
Я заметил, что если результат «hostname -i» возвращает что-то похожее на следующее, удаленное JMX-соединение должно работать, пока домен настроен на запись локального хоста в / etc / hosts:
[jsherman@saturn apache-servicemix-4.4.1-fuse-03-06]$ hostname -i 127.0.0.1 192.168.26.176
Если домен не был настроен для записи localhost, тогда удаленное JMX-соединение не будет установлено. Если по какой-либо причине вы не можете или не хотите иметь домен в записи localhost, вы можете отредактировать свойство JMX serviceURL в файле org.apache.karaf.management.cfg, который находится в [install_dir] / etc, как следует, изменив «localhost» на IP-адрес хоста, «192.168.26.176» в моем случае:
serviceUrl = service:jmx:rmi://192.168.26.176:${rmiServerPort}/jndi/rmi://192.168.26.176:${rmiRegistryPort}/karaf-${karaf.name}
Примечание. Обычно serviceURL не нужно редактировать. Однако добавление IP-адреса устройства позволит вам подключиться по вышеуказанному сценарию.
2) Результат iptables -L -v
Вторая проблема, которая может помешать вам установить удаленное соединение JMX, — это брандмауэр машины. Выполнение вышеуказанной команды приведет к чему-то похожему на следующее:
[root@saturn etc]# iptables -L -v Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 679 56388 ACCEPT all -- lo any anywhere anywhere 18653 2145K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 2 128 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 12 packets, 5734 bytes) pkts bytes target prot opt in out source destination [root@saturn etc]#
Это показывает, что цепочка INPUT отбрасывает все пакеты, которые не соответствуют одному из настроенных правил в цепочке INPUT.
Чтобы разрешить удаленное соединение JMX, мне нужно было добавить следующие правила:
iptables -A INPUT -p tcp --dport 1099 -j ACCEPT iptables -A INPUT -p tcp --dport 44444 -j ACCEPT
Что приводит к следующим правилам для цепочки INPUT:
[root@saturn etc]# iptables -L -v Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 694 57879 ACCEPT all -- lo any anywhere anywhere 19486 2214K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED 2 128 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:rmiregistry 2 112 ACCEPT tcp -- any any anywhere anywhere tcp dpt:44444 Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 19 packets, 1850 bytes) pkts bytes target prot opt in out source destination [root@saturn etc]#
Эти правила можно было бы настроить более безопасно, добавив конкретный источник для соединения, однако для этого примера я буду принимать соединения из любого источника на портах 1099 и 44444.
Последнее, что вам нужно сделать, это сохранить эти изменения в iptables, чтобы чтобы они продолжали перезагрузку системы, выполнив следующую команду:
/sbin/service iptables save
Видя это в действии
Теперь, когда конфигурация позаботилась о вас, теперь вы можете установить удаленное JMX-соединение с Apache ServiceMix, используя следующий URL:
service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root
Где «localhost» будет заменен на IP-адрес или имя хоста удаленного компьютера.
Помните, что конфигурация по умолчанию для ServiceMix 4.4.1 требует имени пользователя / пароля smx / smx для соединения JMX.
Заключение
Поначалу может показаться странным, почему вы не можете установить удаленное JMX-соединение с сервером Linux, но разрешение на самом деле довольно простое. Эта проблема перечислена на странице Oracle относительно
часто задаваемых вопросов JConsole и Удаленного управления . Посмотрите FAQ, если у вас есть дополнительные вопросы, или посмотрите, как соединение может быть отфильтровано по определенному адресу источника.