Мониторинг Postfix в Zabbix 7.4: очередь, deferred, SMTP и systemd
Нормальный мониторинг Postfix в Zabbix должен показывать не только «процесс запущен», но и реальную доставку: размер очереди, deferred/hold, возраст самого старого письма, доступность SMTP и состояние диска. Ниже — рабочий вариант для Zabbix Agent 2 и Postfix 3.1+ с postqueue -j.
1. Проверяем Postfix и Agent 2
postconf mail_version
postqueue -j | head
systemctl status postfix zabbix-agent2 --no-pager
zabbix_agent2 -VЕсли postqueue -j не поддерживается, у вас старый Postfix — для него нужен другой парсер. JSON-вывод доступен начиная с Postfix 3.1.
2. Устанавливаем jq для разбора JSON
# Debian/Ubuntu
apt update && apt install jq
# RHEL/Alma/Rocky
dnf install jq3. Создаём скрипт метрик Postfix
Создайте /usr/local/bin/postfix-zabbix-metrics:
#!/bin/bash
set -euo pipefail
metric="${1:-}"
case "$metric" in
total)
postqueue -j 2>/dev/null | wc -l
;;
deferred)
postqueue -j 2>/dev/null | jq -s '[.[] | select(.queue_name == "deferred")] | length'
;;
hold)
postqueue -j 2>/dev/null | jq -s '[.[] | select(.queue_name == "hold")] | length'
;;
oldest)
postqueue -j 2>/dev/null | jq -s 'if length == 0 then 0 else (now - ([.[].arrival_time] | min) | floor) end'
;;
*)
echo "Usage: $0 {total|deferred|hold|oldest}" >&2
exit 1
;;
esacchmod 755 /usr/local/bin/postfix-zabbix-metrics
/usr/local/bin/postfix-zabbix-metrics total
/usr/local/bin/postfix-zabbix-metrics deferred
/usr/local/bin/postfix-zabbix-metrics oldestoldest возвращает возраст самого старого сообщения в секундах. Пустая очередь возвращает 0.
4. Проверяем скрипт от пользователя zabbix
sudo -u zabbix /usr/local/bin/postfix-zabbix-metrics total
sudo -u zabbix /usr/local/bin/postfix-zabbix-metrics deferredЕсли обычный пользователь не может выполнить postqueue, сначала проверьте права и пакет Postfix. Не запускайте весь Zabbix Agent 2 от root только ради этой метрики.
5. Добавляем UserParameter
Создайте /etc/zabbix/zabbix_agent2.d/postfix.conf:
UserParameter=postfix.queue.total,/usr/local/bin/postfix-zabbix-metrics total
UserParameter=postfix.queue.deferred,/usr/local/bin/postfix-zabbix-metrics deferred
UserParameter=postfix.queue.hold,/usr/local/bin/postfix-zabbix-metrics hold
UserParameter=postfix.queue.oldest,/usr/local/bin/postfix-zabbix-metrics oldest6. Перезагружаем Agent 2 и тестируем ключи
systemctl restart zabbix-agent2
systemctl status zabbix-agent2 --no-pager
zabbix_agent2 -t postfix.queue.total
zabbix_agent2 -t postfix.queue.deferred
zabbix_agent2 -t postfix.queue.hold
zabbix_agent2 -t postfix.queue.oldestКаждый тест должен возвращать числовое значение без ZBX_NOTSUPPORTED.
7. Создаём items в Zabbix
postfix.queue.total— Numeric unsigned, интервал 60 секунд;postfix.queue.deferred— Numeric unsigned, 60 секунд;postfix.queue.hold— Numeric unsigned, 60–300 секунд;postfix.queue.oldest— Numeric unsigned, unitss, 60 секунд.
Для больших relay интервал и пороги увеличьте под реальную нагрузку.
8. Состояние postfix.service без собственного скрипта
Zabbix Agent 2 умеет читать systemd. Создайте item:
systemd.unit.info[postfix.service,ActiveState]Нормальное значение — active. Также можно использовать systemd discovery, если хотите обнаруживать сервисы автоматически.
9. Проверяем SMTP с Zabbix server/proxy
На хосте создайте simple check:
net.tcp.service[smtp,,25]Он возвращает 1, если SMTP отвечает, и 0 при недоступности. Это полезнее локального systemctl, потому что проверка идёт со стороны Zabbix server/proxy и замечает сетевые проблемы.
10. Проверяем submission-порт
Для TCP-доступности 587:
net.tcp.service[tcp,,587]Такая проверка подтверждает, что порт доступен, но не проверяет SMTP AUTH. Для полноценного end-to-end теста лучше отдельный внешний скрипт/сценарий с тестовой учёткой.
11. Проверяем spool и inode
postconf queue_directory
df -h /var/spool/postfix
df -i /var/spool/postfixВ Zabbix используйте стандартные filesystem items для раздела, где находится queue_directory. Не привязывайтесь к /var/spool/postfix, если postconf queue_directory показывает другой путь.
12. Практичные triggers
- Postfix ActiveState не
active— High; net.tcp.service[smtp,,25]=0— High;- deferred выше обычного уровня 10–15 минут — Warning;
- возраст старейшего письма выше SLA, например 3600 секунд — High;
- queue total резко выше baseline — Warning;
- свободное место менее 15% — Warning, менее 5% — High.
13. Ручная диагностика при срабатывании
postqueue -p
postqueue -j | jq -s 'group_by(.queue_name) | map({queue:.[0].queue_name,count:length})'
journalctl -u postfix --since '30 min ago' --no-pager | tail -n 300
df -h
df -iКритерий хорошего мониторинга: Zabbix замечает остановку сервиса, недоступность SMTP, рост deferred и старение писем до того, как пользователи начинают спрашивать, куда пропала почта.