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


Используемые термины: RabbitMQ, Linux, Ubuntu.
В данной инструкции мы разберемся, как работать с брокером сообщений RabbitMQ. Для начала мы выполним установку программного обеспечения на Linux Ubuntu, после настроим его и рассмотрим пример использования.
Установка RabbitMQ
Базовая настройка
Настройка для подключения к серверу по сети
Пример использования на Python
Работа с RabbitMQ в docker
Установка
Сервер 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 delete_user 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
Пример скрипта:
- #!/usr/bin/env python3
- # -*- encoding: utf-8 -*-
- import pika
- credentials = pika.PlainCredentials('test_user', 'test')
- parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials)
- connection = pika.BlockingConnection(parameters)
- channel = connection.channel()
- channel.queue_declare(queue='hello')
- channel.basic_publish(exchange='', routing_key='hello', body='Hello World!')
- connection.close()
- 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
С содержимым:
- #!/usr/bin/env python3
- # -*- encoding: utf-8 -*-
- import pika
- credentials = pika.PlainCredentials('test_user', 'test')
- parameters = pika.ConnectionParameters('localhost', 5672, 'test_host', credentials)
- connection = pika.BlockingConnection(parameters)
- channel = connection.channel()
- channel.queue_declare(queue='hello')
- def callback(ch, method, properties, body):
- print("Received %r" % body)
- channel.basic_consume(queue='hello', auto_ack=True, on_message_callback=callback)
- channel.start_consuming()
- print('To exit press CTRL+C')
- 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