15-rabbitmq — RabbitMQ и management-плагин

Ставит брокер сообщений RabbitMQ, включает веб-консоль управления и заводит отдельного администратора со сгенерированным паролем. ☐ опциональный.

Зачем нужен

RabbitMQ — это брокер сообщений (посредник, который принимает сообщения от одних частей приложения и надёжно доставляет другим). Он нужен, когда приложение отправляет фоновые задачи в очередь: рассылку писем, обработку загруженных файлов, уведомления, обмен событиями между сервисами. Приложение-отправитель («producer») кладёт сообщение в очередь и сразу продолжает работу, а приложение-обработчик («consumer») забирает его, когда готово. Так медленные операции не тормозят пользователя, а пиковые нагрузки сглаживаются.

Модуль ставит сам брокер, включает management-плагин (веб-интерфейс на порту 15672 для просмотра очередей, пользователей и статистики) и создаёт защищённого паролем администратора, потому что штатный пользователь guest по умолчанию работает только с локальной машины и не годится для приложений.

Когда включать и когда не нужен

Зависимости и требования

Что именно делает

Пошагово, в порядке выполнения module_install:

  1. Подготовка репозиториев — на RHEL-семействе подключает EPEL (os_ensure_epel); на Debian/Ubuntu шаг ничего не меняет.
  2. Установка пакета rabbitmq-server (с 3 повторами при сбое сети) и регистрация отката.
  3. Включение и запуск службы rabbitmq-server (systemctl enable + запуск).
  4. Включение management-плагинаrabbitmq-plugins enable rabbitmq_management (появляется веб-консоль на порту 15672).
  5. Создание администратора (идемпотентно — если пользователь admin уже есть, шаг пропускается):
    • генерируется пароль (generate_password);
    • rabbitmqctl add_user admin <пароль>;
    • назначается тег administrator (полный доступ к консоли управления);
    • выдаются права на vhost / (виртуальный хост — изолированное пространство очередей и обменников; по умолчанию один, называется /): set_permissions -p / admin '.*' '.*' '.*' (полные права на configure/write/read);
    • логин и пароль сохраняются в файл учётных данных.
  6. Верификация (module_verify) — служба активна и rabbitmqctl status отвечает.
  7. Отмечает модуль выполненным (state_mark).

Файлы, службы и порты

Объект Значение Примечание
Служба systemd rabbitmq-server автозапуск включён
Порт 5672/tcp AMQP сюда подключаются приложения (протокол AMQP)
Порт 15672/tcp Management UI веб-консоль http://localhost:15672
Порт 4369/tcp epmd обнаружение узлов Erlang (только для кластера)
Порт 25672/tcp inter-node связь между узлами кластера
/var/lib/rabbitmq данные (Mnesia: пользователи, vhost'ы, очереди, сообщения) сохраняется при обычном удалении
/etc/rabbitmq конфигурация
/var/log/rabbitmq журналы брокера
/var/lib/mitdev/state/rabbitmq.done отметка выполнения модуля

По умолчанию модуль не открывает порты 5672/15672 в файрволе наружу — доступ только с самой машины. Команда mitdev rabbitmq cluster-init открывает кластерные и клиентские порты только для приватной подсети.

Учётные данные

Логин и пароль администратора сохраняются в /root/.mitdev-credentials (файл доступен только root, права 600):

rabbitmq: user=admin
rabbitmq: password=<сгенерированный пароль>

Посмотреть:

sudo grep '^rabbitmq:' /root/.mitdev-credentials

Пользователь guest (пароль guest) остаётся, но по умолчанию RabbitMQ разрешает ему вход только с localhost — снаружи и из приложений он не работает. Это защита «из коробки»: не отключайте её, а пользуйтесь admin или заводите отдельных пользователей под каждое приложение.

Настройка

У этого модуля нет переменных в config/defaults.conf — установка не параметризуется. Единственная фиксированная величина:

Параметр Значение По умолчанию На что влияет Когда менять
Имя администратора admin (константа RABBIT_ADMIN_USER в модуле) admin под каким логином создаётся администратор практически никогда; при необходимости заведите дополнительных пользователей вручную (см. «Типовые задачи»)

Как переопределить настройки

Модуль не спрашивает переменных и не читает их из окружения. Тонкая настройка делается уже после установки штатными средствами RabbitMQ:

Как пользоваться

Подключить приложение (AMQP)

Приложение подключается к брокеру по адресу вида:

amqp://admin:<пароль>@<хост>:5672/

Пример (Node.js, amqplib):

const amqp = require('amqplib');
const conn = await amqp.connect('amqp://admin:ПАРОЛЬ@localhost:5672/');

Зайти в консоль управления (порт 15672)

Консоль слушает http://localhost:15672 и наружу не выставлена. Безопасный способ открыть её со своего компьютера — SSH-туннель:

ssh -L 15672:127.0.0.1:15672 <пользователь>@<сервер>

Затем в браузере откройте http://localhost:15672, логин admin, пароль — из файла учётных данных. В консоли видны очереди, обменники (exchange — маршрутизатор, который решает, в какие очереди попадёт сообщение), подключения, пользователи и графики нагрузки.

Создать отдельного пользователя и vhost под приложение

Хорошая практика — не давать приложению административный admin, а завести узкого пользователя и отдельный vhost:

# отдельное пространство очередей
sudo rabbitmqctl add_vhost myapp
# пользователь приложения
sudo rabbitmqctl add_user appuser 'надёжный-пароль'
# права только в его vhost (configure / write / read)
sudo rabbitmqctl set_permissions -p myapp appuser '.*' '.*' '.*'

Строка подключения приложения тогда: amqp://appuser:пароль@localhost:5672/myapp.

Проверка, что всё работает

module_verify считает модуль успешным, если служба rabbitmq-server активна и rabbitmqctl status отвечает без ошибок.

Ручные проверки:

# служба запущена
systemctl status rabbitmq-server

# брокер отвечает
sudo rabbitmqctl status

# management-плагин включён (ищите rabbitmq_management [E*])
sudo rabbitmq-plugins list | grep management

# список пользователей — должен быть admin с тегом [administrator]
sudo rabbitmqctl list_users

# общая диагностика mitdev
sudo mitdev doctor

Типовые задачи

Частые ошибки

Симптом Причина Что сделать
Приложение не подключается под guest с другого хоста guest по умолчанию работает только с localhost подключайтесь под admin или заведите своего пользователя (add_user + set_permissions)
ACCESS_REFUSED при подключении неверный пароль или нет прав на vhost сверьте пароль в /root/.mitdev-credentials; выдайте права set_permissions -p <vhost> <user> '.*' '.*' '.*'
Консоль 15672 не открывается в браузере порт слушает только localhost откройте через SSH-туннель (см. «Как пользоваться»), не публикуйте порт наружу
join_cluster падает узлы не видят друг друга: закрыты порты 4369/25672, разные cookie или не резолвится имя проверьте приватную сеть, доступность портов, одинаковый /var/lib/rabbitmq/.erlang.cookie
Служба не стартует после перезагрузки повреждён каталог Mnesia или нет места на диске смотрите journalctl -u rabbitmq-server -n 50 и логи в /var/log/rabbitmq

Безопасность и продакшен

Модуль уже закрывает: отдельный администратор со случайным паролем вместо стандартного guest, guest ограничен localhost, порты по умолчанию не открыты в файрволе наружу.

Остаётся на клиенте:

Откат и удаление

См. также