Когда сервер один, а графики нужны раз в пять минут, облачный мониторинг с агентом и подпиской выглядит избыточно. Munin решает эту задачу по-старинке: главный узел опрашивает агентов, складывает числа в RRD-базы и рисует статические графики. Никакой телеметрии наружу, минимум зависимостей и понятная диагностика. Разберём установку, подключение узлов, плагины, пороги и типичные поломки.
Как устроен Munin
Есть master и node. Master раз в пять минут открывает соединение с агентом на порту 4949, запрашивает список плагинов и их значения, после чего обновляет RRD-файлы и перерисовывает графики. Node — небольшой демон на Perl, который запускает плагины локально и отдаёт результат в текстовом протоколе.
RRD хранит данные с фиксированным шагом и заранее известным размером файла: старые точки усредняются, а не удаляются бесконечно. Это даёт предсказуемое место на диске и быстрые графики за день, неделю, месяц и год. Обратная сторона — пятиминутное разрешение и отсутствие трассировки: для разовых всплесков лучше подходит Prometheus, а Munin хорошо показывает тренды.
Установка master и node
В Debian, Ubuntu и Linux Mint пакеты называются munin и munin-node. Для одного сервера оба ставятся на одну машину; для парка машин master живёт отдельно, а на каждом узле достаточно munin-node. После установки проверьте, что демон слушает порт и запускается автоматически.
sudo apt install munin munin-node
sudo systemctl enable --now munin-node
sudo systemctl status munin-node --no-pager
ss -tlnp | grep 4949
Пакет master приносит rrdtool, cron-задание и каталог для готовых графиков. Веб-сервер в зависимостях не обязателен: Munin генерирует статические HTML и PNG, которые отдаёт любой nginx или Apache.
Доступ к агенту
По умолчанию агент слушает все интерфейсы, но разрешает подключения только с localhost. Для удалённого master добавьте его адрес в allow. Правила — регулярные выражения, поэтому точку в IP нужно экранировать.
host 127.0.0.1
allow ^127\.0\.0\.1$
allow ^10\.0\.0\.
allow ^192\.168\.
Если master на другой машине, замените host на 0.0.0.0 или адрес интерфейса и добавьте его IP в allow. Не открывайте 4949 в интернет: протокол не шифруется и не требует пароля.
sudo systemctl restart munin-node
printf 'list\nquit\n' | nc 127.0.0.1 4949
printf 'fetch df\nquit\n' | nc 127.0.0.1 4949
Включение плагинов
Плагины лежат в /usr/share/munin/plugins, а активные — символические ссылки в /etc/munin/plugins. Утилита munin-node-configure определяет, что доступно, и создаёт ссылки. Сначала посмотрите предложения, затем применяйте.
sudo munin-node-configure --suggest
sudo munin-node-configure --shell | sudo sh
ls -l /etc/munin/plugins
sudo -u munin munin-run df
Запуск от пользователя munin важен: плагин, работающий от root, может скрыть проблему с правами, а агент работает именно от munin.
Master и веб-графики
В /etc/munin/munin.conf описаны узлы и глобальные параметры. Для локального сервера достаточно одной секции с адресом и флагом use_node_name. Имя в квадратных скобках становится именем узла в интерфейсе и в путях RRD.
[example.com]
address 127.0.0.1
use_node_name yes
contacts admin
Запуск munin-cron вручную помогает проверить всю цепочку, не дожидаясь расписания. Готовые файлы появляются в /var/cache/munin/www: индекс, страницы узлов и каталоги с графиками. Этот каталог и отдаёт веб-сервер.
sudo -u munin munin-cron
ls -l /var/cache/munin/www
sudo tail -n 50 /var/log/munin/munin-update.log
Если графики пустые, проверьте, что master видит агент, а имена плагинов совпадают. RRD-файлы привязаны к имени узла: после переименования старые данные не появятся.
Пороги и оповещения
Пороги задаются в /etc/munin/plugin-conf.d/munin-node для конкретного плагина. Значения warning и critical плагин отдаёт в ответе, а master сравнивает их и формирует события.
[df]
env.warning 85
env.critical 95
Оповещения настраиваются в munin.conf. Команда должна уметь отправлять почту: без локального MTA или настроенного релея письма просто осядут в очереди. always_send заставляет уведомлять и о восстановлении, что удобно, но при неверных порогах даёт шум.
contacts admin
contact.admin.command mail -s "Munin ${var:group}::${var:host}" root
contact.admin.always_send warning critical
Проверьте доставку вручную через munin-limits и только потом полагайтесь на неё в аварии. Для нескольких администраторов задайте разные contact-блоки.
Свой плагин
Плагин — исполняемый файл, который при вызове без аргументов печатает значения, а с аргументом config — описание графика. Формат простой: имя_поля.value и имя_поля.label. Такой скрипт удобно использовать для очереди задач или числа активных сессий.
#!/bin/sh
case "$1" in
config)
echo "graph_title Queue length"
echo "graph_vlabel files"
echo "queue.label pending"
exit 0
;;
esac
echo "queue.value $(wc -l < /var/spool/app/queue)"
Положите файл в /etc/munin/plugins, дайте права на исполнение и проверьте через munin-run. Плагин должен отвечать быстро: тяжёлый запрос к базе каждые пять минут создаёт нагрузку.
Диагностика
Сначала проверяется агент, потом master. Отладочный запуск плагина показывает, что именно он возвращает; отладочный запуск update — что master получает и какие RRD обновляет. Рассинхронизация часов ломает RRD, поэтому время на обоих узлах должно идти одинаково.
sudo -u munin munin-run --debug df
sudo -u munin /usr/sbin/munin-update --debug --nofork
sudo -u munin /usr/sbin/munin-limits --debug
chronyc tracking
Частые причины: нет прав у пользователя munin, не установлен Perl-модуль для плагина, агент слушает только localhost, а master ходит по внешнему адресу, закончилось место под RRD. После исправления подождите два цикла — первый создаёт базу, второй рисует нормальный график. Старые данные при смене имени узла не переносятся автоматически.
Чек-лист
- Агент слушает только нужный интерфейс, порт 4949 закрыт файрволом снаружи.
- Пользователь munin имеет доступ ко всем включённым плагинам.
- В munin.conf указан реальный адрес узла и совпадающее имя.
- munin-cron выполняется по расписанию, каталог графиков доступен веб-серверу.
- Пороги заданы для диска, памяти и нагрузки, письма проверены вручную.
- Время синхронизировано, резервная копия RRD и конфигов снимается отдельно.
Итог
Munin остаётся удобным инструментом для небольших серверов и домашних лабораторий: он нетребователен, предсказуем и не отправляет данные в облако. Его слабое место — пятиминутный шаг и ограниченная работа с высокой кардинальностью, поэтому для микросервисов и трассировки его дополняют другими системами. Для контроля диска, памяти, нагрузки и сетевых интерфейсов старой доброй связки master плюс node по-прежнему достаточно.