Установка и настройка RabbitMQ на Ubuntu

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: RabbitMQ, Linux, Ubuntu.

В данной инструкции мы разберемся, как работать с брокером сообщений RabbitMQ. Для начала мы выполним установку программного обеспечения на Linux Ubuntu, после настроим его и рассмотрим пример использования.

Установка

Сервер RabbitMQ есть в стандартном репозитории Ubuntu, поэтому можно сразу выполнить установку с помощью apt. Однако, версия в репозитории может быть не самой актуальной. Поэтому мы рассмотрим процесс с настройкой официального репозитория для установки RabbitMQ.

Для начала установим curl:

apt install curl

После выполныем две команды:

curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.deb.sh | sudo bash

curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.deb.sh | sudo bash

В нашу систему будут добавлены репозитории для установки RabbitMQ и erlang. 

Теперь можно устанавливать брокер:

apt install rabbitmq-server

Однако, в моем случае возникла проблема с репозиторием erlang. Если вы столкнетесь с той же проблемой, можно вручную установить необходимые пакеты или отказаться от использования официального репозитория.

После установки брокера на Ubuntu, он автоматически будет запущен и настроен для автозапуска. Проверить можно командой:

systemctl status rabbitmq-server

Переходим к настройке.

Первичная настройка

Нам нужно создать виртуальный хост для изоляции рабочего пространства, а также пользователя, которому дадим полный доступ на созданный виртуальный хост.

Создание последнего выполняется командой:

rabbitmqctl add_vhost test_host

* в данном примере мы создадим тестовый хост test_host.

Список всех хостов можно увидеть командой:

rabbitmqctl list_vhosts

Создаем пользователя:

rabbitmqctl add_user test_user

Система запросит ввод пароля. Придумываем и вводим его.

Поменять пароль мы можем командой:

rabbitmqctl change_password test_user

* в данном примере мы поменяем пароль для пользователя test_user.

Теперь дадим права созданному пользователю к созданному виртуальному хосту:

rabbitmqctl set_permissions -p test_host test_user ".*" ".*" ".*"

Сделаем нашего пользователя администратором:

rabbitmqctl set_user_tags test_user administrator

Разрешаем консольную команду rabbitmqadmin:

rabbitmq-plugins enable rabbitmq_management

Выполним тестовый запрос

rabbitmqadmin -u test_user -p test list vhosts

Мы должны увидеть что-то на подобие:

+-------------+----------+
|    name     | messages |
+-------------+----------+
| /           |          |
| test_host   |          |
+-------------+----------+

Использование по сети

По умолчанию, сервис запускается для работы как на локальном сервере, так и обработки запросов по сети. Но нам нужно убедиться в работоспособности прохождения сетевых запросов.

Если на нашем сервере используется брандмауэр, разрешаем порт 5672:

iptables -I INPUT -p tcp --dport 5672 -j ACCEPT

Для сохранения правила используем утилиту iptables-persistent:

apt-get install iptables-persistent

netfilter-persistent save

Пример подключения с использованием Python

Для простоты, мы запустим скрипт для отправки сообщения в очередь и приемки на одном и том же компьютере, куда установили сервер rabbitmq. Сам пример, в большей степени, взят с официального сайта.

Установим питон и необходимые компоненты:

apt install python3 python3-pip

Обновляем менеджер пакетов pip:

pip3 install --upgrade pip

Устанавливаем библиотеку pika для работы с RabbitMQ:

pip3 install pika

Создадим каталог, в котором мы создадим скрипты:

mkdir /scripts

Создадим скрипт для отправки информации в очередь:

vi /scripts/rabbit_test_send.py

Пример скрипта: 

  1. #!/usr/bin/env python3
  2. # -*- encoding: utf-8 -*-
  3.  
  4. import pika
  5.  
  6. credentials = pika.PlainCredentials('test_user', 'test')
  7. parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials)
  8. connection = pika.BlockingConnection(parameters)
  9.  
  10. channel = connection.channel()
  11. channel.queue_declare(queue='hello')
  12. channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
  13.  
  14. connection.close()
  15.  
  16. print("Your message has been sent to the queue.")

* где:

  • строки 6-8: задаем параметры для подключения к нашему серверу сообщений. Обратите внимание, что мы используем логин и пароль для созданного ранее пользователя test_user. Также мы подключаемся к созданному хосту test_host.
  • строки 10-12: подключаемся к серверу, создаем очередь с названием hello и отправляем в очередь сообщение Hello World!

Разрешаем запуск скрипта:

chmod +x /scripts/rabbit_test_send.py

И запустим его:

/scripts/rabbit_test_send.py

Теперь мы можем посмотреть состояние очереди из командной строки Linux.

rabbitmqadmin -u test_user -p test list queues

Мы увидим, примерно, такую картину:

+-------+----------+
| name  | messages |
+-------+----------+
| hello | 1        |
+-------+----------+

* обратите внимание, что сообщение в очередь могут попадать с задержкой (2-3 секунды). Если мы увидим 0 сообщений, немного подождем.

Теперь создадим скрипт для получения сообщения:

vi /scripts/rabbit_test_recieve.py

С содержимым:

  1. #!/usr/bin/env python3
  2. # -*- encoding: utf-8 -*-
  3.  
  4. import pika
  5.  
  6. credentials = pika.PlainCredentials('test_user', 'test')
  7. parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials)
  8. connection = pika.BlockingConnection(parameters)
  9.  
  10. channel = connection.channel()
  11. channel.queue_declare(queue='hello')
  12.  
  13. def callback(ch, method, properties, body):
  14.     print("Received %r" % body)
  15.  
  16. channel.basic_consume(queue='hello', auto_ack=True, on_message_callback=callback)
  17.  
  18. channel.start_consuming()
  19.  
  20. print('To exit press CTRL+C')
  21. connection.close()

* где:

  • строки 6-8: задаем параметры для подключения к нашему серверу сообщений. Обратите внимание, что мы используем логин и пароль для созданного ранее пользователя test_user. Также мы подключаемся к созданному хосту test_host.
  • строки 10-11: подключаемся к серверу, подключаемся к очереди с названием hello.
  • строки 13-14: функция для отображения содержимого очереди.
  • строка 16: параметры чтения очереди. Обратите внимание, что мы передаем данные очереди в нашу функцию callback, которую определили в строке 13,
  • строка 18: запускаем процесс чтения данных в очереди.

Разрешаем запуск скрипта:

chmod +x /scripts/rabbit_test_recieve.py

И запустим его:

/scripts/rabbit_test_recieve.py

На экране должно появиться наше сообщение. Чтобы прервать выполнение скрипта, нажимаем CTRL+C (на экране появится некрасивый вывод, но это не страшно в рамках нашего теста).

Снова смотрим очередь:

rabbitmqadmin -u test_user -p test list queues

Она должна стать пустой.

RabbitMQ в Docker

Брокер может быть запущен как контейнер docker. Рассмотрим процесс запуска с использованием docker-compose.

Для начала нужно установить как docker, так и docker-compose — подробнее читайте в инструкции Установка Docker на Linux.

Предположим, что рабочий каталог для RabbitMQ будет /opt/rabbitmq. Созданим и перейдем в него:

mkdir /opt/rabbitmq

cd /opt/rabbitmq

Создадим файл docker-compose:

vi docker-compose.yml

services:

  rabbitmq:
    image: rabbitmq:latest
    container_name: rabbitmq
    hostname: rabbitmq
    restart: unless-stopped
    environment:
      TZ: Europe/Moscow
      RABBITMQ_DEFAULT_USER: root
      RABBITMQ_DEFAULT_PASS: 12345678
      RABBITMQ_DEFAULT_VHOST: vdata
    volumes:
      - ./rabbitmq:/var/lib/rabbitmq
    ports:
      - 5672:5672

* В данном примере мы:

  • запустим rabbitmq на порту 5672.
  • создадим пользователя root с паролем 12345678.
  • будем работать в виртуальном хосте vdata.

Для запуска контейнера вводим команду:

docker-compose up -d

# DevOps # Ubuntu # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет