Статьи

ServiceMix: удаленное соединение JMX


Недавно я столкнулся с проблемой, когда мне не удалось установить удаленное соединение 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, если у вас есть дополнительные вопросы, или посмотрите, как соединение может быть отфильтровано по определенному адресу источника.