15-rabbitmq — RabbitMQ и management-плагин
Ставит брокер сообщений RabbitMQ, включает веб-консоль управления и заводит отдельного администратора со сгенерированным паролем. ☐ опциональный.
Зачем нужен
RabbitMQ — это брокер сообщений (посредник, который принимает сообщения от одних частей приложения и надёжно доставляет другим). Он нужен, когда приложение отправляет фоновые задачи в очередь: рассылку писем, обработку загруженных файлов, уведомления, обмен событиями между сервисами. Приложение-отправитель («producer») кладёт сообщение в очередь и сразу продолжает работу, а приложение-обработчик («consumer») забирает его, когда готово. Так медленные операции не тормозят пользователя, а пиковые нагрузки сглаживаются.
Модуль ставит сам брокер, включает management-плагин (веб-интерфейс на порту 15672 для просмотра очередей, пользователей и статистики) и создаёт защищённого паролем администратора, потому что штатный пользователь guest по умолчанию работает только с локальной машины и не годится для приложений.
Когда включать и когда не нужен
- Включайте, если у приложения есть фоновые задачи, событийная архитектура (микросервисы, обмен сообщениями), или используется библиотека вроде Celery, Sidekiq (для RabbitMQ), Bull, amqplib, Spring AMQP и т. п.
- Не нужен, если приложению достаточно очередей на Redis, либо фоновых задач нет вовсе. Два брокера сразу держать не стоит.
- Для отказоустойчивости одного узла мало — соберите кластер из нескольких серверов командой
mitdev rabbitmq cluster-init(см. раздел «Как пользоваться»).
Зависимости и требования
- Отдельных модулей mitdev не требует.
- Нужен доступ в интернет к репозиториям дистрибутива: на Debian/Ubuntu пакет
rabbitmq-serverберётся из репозитория дистрибутива, на RHEL-семействе (Rocky/Alma/Fedora) — из EPEL (репозиторий дополнительных пакетов), который модуль подключает сам. - RabbitMQ тянет за собой Erlang — он ставится автоматически как зависимость пакета.
- Для сборки кластера дополнительно нужна приватная сеть между узлами (
mitdev net create) — по ней резолвятся имена узловrabbit@<hostname>.
Что именно делает
Пошагово, в порядке выполнения module_install:
- Подготовка репозиториев — на RHEL-семействе подключает EPEL (
os_ensure_epel); на Debian/Ubuntu шаг ничего не меняет. - Установка пакета
rabbitmq-server(с 3 повторами при сбое сети) и регистрация отката. - Включение и запуск службы
rabbitmq-server(systemctl enable+ запуск). - Включение management-плагина —
rabbitmq-plugins enable rabbitmq_management(появляется веб-консоль на порту 15672). - Создание администратора (идемпотентно — если пользователь
adminуже есть, шаг пропускается):- генерируется пароль (
generate_password); rabbitmqctl add_user admin <пароль>;- назначается тег
administrator(полный доступ к консоли управления); - выдаются права на vhost
/(виртуальный хост — изолированное пространство очередей и обменников; по умолчанию один, называется/):set_permissions -p / admin '.*' '.*' '.*'(полные права на configure/write/read); - логин и пароль сохраняются в файл учётных данных.
- генерируется пароль (
- Верификация (
module_verify) — служба активна иrabbitmqctl statusотвечает. - Отмечает модуль выполненным (
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:
- пользователи и права —
rabbitmqctl(см. «Типовые задачи»); - параметры брокера — файл
/etc/rabbitmq/rabbitmq.conf(создайте при необходимости) с последующимsystemctl restart rabbitmq-server; - кластеризация — команда
mitdev rabbitmq cluster-init.
Как пользоваться
Подключить приложение (AMQP)
Приложение подключается к брокеру по адресу вида:
amqp://admin:<пароль>@<хост>:5672/
<пароль>— из/root/.mitdev-credentials;<хост>—localhost, если приложение на этом же сервере (рекомендуется); приватный IP, если приложение на соседнем сервере в приватной сети;/в конце — vhost по умолчанию.
Пример (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
Типовые задачи
- Узнать пароль администратора:
sudo grep '^rabbitmq: password' /root/.mitdev-credentials - Сменить пароль администратора:
(не забудьте обновить строку в приложениях; при желании поправьте иsudo rabbitmqctl change_password admin 'новый-пароль'/root/.mitdev-credentials). - Посмотреть очереди и число сообщений в них:
sudo rabbitmqctl list_queues name messages consumers - Создать пользователя только для чтения (мониторинг):
sudo rabbitmqctl add_user monitor 'пароль' sudo rabbitmqctl set_user_tags monitor monitoring - Собрать кластер из нескольких серверов (на первом узле):
на каждом следующем узле:sudo mitdev rabbitmq cluster-init sudo mitdev rabbitmq token # покажет токен
В кластере новые очереди на vhostsudo mitdev rabbitmq join <токен-с-первого-узла>/создаются типа quorum (реплицируемые — переживают отказ одного узла). - Проверить состояние кластера:
sudo mitdev rabbitmq status # или rabbitmqctl cluster_status
Частые ошибки
| Симптом | Причина | Что сделать |
|---|---|---|
Приложение не подключается под 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, порты по умолчанию не открыты в файрволе наружу.
Остаётся на клиенте:
- Не выставляйте порт 15672 (консоль) и 5672 (AMQP) в интернет. Доступ к консоли — только через SSH-туннель; приложения подключайте по localhost или приватной сети.
- Заведите отдельного пользователя под каждое приложение с правами только в его vhost — не используйте
adminв продакшене. - Для реальной отказоустойчивости соберите кластер (
mitdev rabbitmq cluster-init) и объявляйте quorum-очереди. - Если брокер всё же нужно открыть по сети — включите TLS для AMQP (порт 5671) в
/etc/rabbitmq/rabbitmq.conf.
Откат и удаление
- Авто-откат при падении установки (
module_rollback): останавливает и удаляетrabbitmq-server. Если модуль переустанавливается поверх уже работавшего брокера, защита отката (ROLLBACK_PROTECT) не даст снести работавшую службу. mitdev remove rabbitmq: удаляет пользователяadmin, останавливает и удаляет пакет. Данные (/var/lib/rabbitmq: пользователи, vhost'ы, очереди, сообщения) сохраняются.mitdev remove rabbitmq --purge: то же самое плюс удаление/var/lib/rabbitmq,/etc/rabbitmq,/var/log/rabbitmq— стираются все данные брокера.
См. также
- ../COMMANDS.md — команды
mitdev rabbitmq,mitdev doctor,mitdev remove. - ../HA.md — отказоустойчивость и кластеры (в т. ч. RabbitMQ).
- 16-minio.md — соседний модуль хранилища S3.
- ../MODULES.md — краткий обзор всех модулей.