Мониторинг серверов · 11 min read · Oct 15, 2025

Мониторинг сервера с помощью Munin и Monit на Debian 10

В этой статье я описываю, как вы можете мониторить свой сервер Debian 10 (Buster) с помощью Munin и Monit. Munin генерирует симпатичные графики почти по каждому аспекту вашего сервера (средняя нагрузка, использование памяти, использование CPU, пропускная способность MySQL, сетевой трафик и т.д.) без особой настройки, в то время как Monit проверяет доступность таких сервисов, как Apache, MySQL, Postfix и принимает соответствующие меры, такие как перезапуск, если обнаруживает, что сервис работает не так, как ожидалось. Сочетание двух дает вам полный мониторинг: графики, которые позволяют вам видеть текущие или надвигающиеся проблемы (например, “Нам скоро нужен более мощный сервер, наша средняя нагрузка быстро растет.”), и сторожевой таймер, который обеспечивает доступность контролируемых сервисов.

Хотя вы можете мониторить более одного сервера с помощью Munin, здесь мы обсудим только мониторинг системы, на которой он установлен.

Этот гид был написан для Debian 10 (Buster), но конфигурация также должна применяться к другим дистрибутивам, таким как Ubuntu, с незначительными изменениями.

1 Предварительная заметка

Все команды в этом руководстве выполняются от имени пользователя root. Войдите на свой сервер как root по SSH или откройте терминал. Если вы вошли как другой пользователь, отличающийся от root, используйте команду

su -

чтобы стать пользователем root, прежде чем продолжить.

Имя хоста нашей системы - server1.example.com, и у нас есть веб-сайт www.example.com с корнем документа /var/www/www.example.com/web.

Убедитесь, что система обновлена, прежде чем начинать установку Munin, выполните:

apt update  
apt upgrade

Apache используется для отображения страниц Munin, модуль apache fcgid необходим для функции увеличения графиков Munin. Установите apache и модуль fcgid с помощью apt.

apt install apache2 libcgi-fast-perl libapache2-mod-fcgid

Включите модуль fcgid в apache.

a2enmod fcgid

2 Установка и настройка Munin

Чтобы установить Munin на Debian, делаем следующее:

apt install munin munin-node munin-plugins-extra

Когда сервер работает с MySQL или MariaDB, то включите несколько дополнительных плагинов Munin для мониторинга MySQL:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/mysql_ mysql_  
ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes  
ln -s /usr/share/munin/plugins/mysql_innodb mysql_innodb  
ln -s /usr/share/munin/plugins/mysql_isam_space_ mysql_isam_space_  
ln -s /usr/share/munin/plugins/mysql_queries mysql_queries  
ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries  
ln -s /usr/share/munin/plugins/mysql_threads mysql_threads

Далее, мы должны отредактировать файл конфигурации Munin /etc/munin/munin.conf. Раскомментируйте строки dbdir, htmldir, logdir, rundir и tmpldir (значения по умолчанию подходят). Мы хотим, чтобы Munin использовал имя server1.example.com вместо localhost.localdomain в HTML-выводе, поэтому мы заменяем localhost.localdomain на server1.example.com в разделе простого дерева хостов. Без комментариев измененный файл выглядит так:

nano /etc/munin/munin.conf
# Пример файла конфигурации для Munin, сгенерированный с помощью 'make build'
  
# Следующие три переменные указывают, где находятся RRD
# базы данных, HTML-вывод, логи и файлы блокировок/pid. Все они
# должны быть записываемыми пользователем, запускающим munin-cron. Все они
# по умолчанию имеют значения, которые вы видите здесь.
#  
dbdir /var/lib/munin
htmldir /var/cache/munin/www
logdir /var/log/munin
rundir /var/run/munin  
  
# Где искать HTML-шаблоны
#  
tmpldir /etc/munin/templates  
  
# Где искать статические www файлы
#  
#staticdir /etc/munin/static  
  
# временные cgi файлы находятся здесь. обратите внимание, что они должны быть записываемыми
# пользователем cgi (обычно nobody или httpd).
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (Точно один) каталог для включения всех файлов.
includedir /etc/munin/munin-conf.d
[...]  
# простое дерево хостов  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]  

Мы должны найти файл конфигурации Apache 2.4 для Munin /etc/munin/apache24.conf - он определяет псевдоним, называемый munin, для HTML-выходного каталога Munin /var/cache/munin/www, что означает, что мы можем получить доступ к munin со всех веб-сайтов на этом сервере, используя относительный путь /munin (например, http://www.example.com/munin).

Конфигурация apache Munin по умолчанию не включена, это было изменено с DebianWheezy на Jessie. Новый каталог конфигурации - /etc/apache2/conf-enabled вместо /etc/apache2/conf.d, который использовался в более старых версиях, таких как Wheezy и Squeeze.

Выполните эти команды, чтобы включить и загрузить конфигурацию в apache.

cd /etc/apache2/conf-enabled/  
ln -s /etc/munin/apache24.conf munin.conf  
service apache2 restart

Убедитесь, что вы закомментировали строку Require local и добавили вместо этого Require all granted и Options FollowSymLinks SymLinksIfOwnerMatch (в противном случае вы сможете получить доступ к выходным данным Munin только с localhost):

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Перезапустите Apache:

systemctl restart apache2.service

Затем перезапустите Munin:

systemctl restart munin-node.service

Теперь подождите несколько минут, чтобы Munin мог произвести свой первый вывод, а затем перейдите по адресу http://www.example.com/munin/ в вашем браузере, и вы увидите первые статистические данные:

Монитор процессов Munin

(Это всего лишь небольшой фрагмент множества графиков, которые генерирует munin…)

3 Защита выходного каталога Munin паролем (необязательно, но настоятельно рекомендуется)

Теперь хорошей идеей будет защитить выходной каталог munin паролем, если вы не хотите, чтобы каждый мог видеть каждую мелкую статистику о вашем сервере.

Для этого мы должны создать файл паролей /etc/munin/munin-htpasswd. Мы хотим войти с именем пользователя admin, поэтому делаем это:

htpasswd -c /etc/munin/munin-htpasswd admin

Введите пароль для admin. Затем снова откройте /etc/munin/apache24.conf…

nano /etc/munin/apache24.conf

… закомментируйте “Require all granted” и добавьте строки, которые я отметил красным:

Alias /munin /var/cache/munin/www  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
 Options None  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Затем перезапустите Apache:

systemctl restart apache2.service

4 Включение дополнительных модулей в Munin

Команда Munin “munin-node-configure –suggest” может быть использована для получения рекомендаций по дополнительным модулям Munin, которые могут быть включены на сервере. Выполните:

munin-node-configure --suggest

Вывод должен быть похож на это:

Рекомендации по дополнительным модулям Munin

Столбец “used” показывает, включен ли модуль, столбец “Suggestions” показывает, работает ли на сервере сервис, который может быть мониторирован этим модулем. Создайте символическую ссылку для модуля в /etc/munin/plugins, чтобы включить его.

Здесь я, например, включу модули apache_*:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/apache_accesses  
ln -s /usr/share/munin/plugins/apache_processes  
ln -s /usr/share/munin/plugins/apache_volume

Перезапустите Munin, чтобы загрузить новую конфигурацию.

systemctl restart munin-node.service

5 Установка и настройка Monit

Monit доступен из репозитория backports Debian Buster. Этот репозиторий не включен по умолчанию, поэтому сначала мы должны добавить его. Выполните эту команду:

echo 'deb http://ftp.de.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list

и затем обновите списки пакетов с:

apt update

Чтобы установить Monit, делаем следующее:

apt install monit

Теперь мы должны отредактировать /etc/monit/monitrc. По умолчанию /etc/monit/monitrc имеет много примеров, и вы можете найти больше примеров конфигурации на http://mmonit.com/monit/documentation/. Однако в моем случае я хочу мониторить proftpd, sshd, mysql, apache и postfix, я хочу включить веб-интерфейс Monit на порту 2812, я хочу https веб-интерфейс, я хочу войти в веб-интерфейс с именем пользователя admin и паролем howtoforge, и я хочу, чтобы Monit отправлял уведомления по электронной почте на root@localhost, так что мой файл выглядит так (я добавил примеры для других демонов в конфигурацию, чтобы вы могли настроить файл под свои нужды):

cp /etc/monit/monitrc /etc/monit/monitrc_orig  
cat /dev/null > /etc/monit/monitrc  
nano /etc/monit/monitrc
set daemon 60  
set logfile syslog facility log_daemon  
set mailserver localhost  
set mail-format { from: [email protected] }  
set alert root@localhost  
set httpd port 2812 and  
 SSL ENABLE  
 PEMFILE /var/certs/monit.pem  
 allow admin:howtoforge  
  
check process sshd with pidfile /var/run/sshd.pid  
 start program "/usr/sbin/service ssh start"  
 stop program "/usr/sbin/service ssh stop"  
 if failed port 22 protocol ssh then restart  
 if 5 restarts within 5 cycles then timeout  
  
check process apache with pidfile /var/run/apache2/apache2.pid  
 group www  
 start program = "/usr/sbin/service apache2 start"  
 stop program = "/usr/sbin/service apache2 stop"  
 if failed host localhost port 80 protocol http  
 and request "/monit/token" then restart  
 if cpu is greater than 60% for 2 cycles then alert  
 if cpu > 80% for 5 cycles then restart  
 if totalmem > 500 MB for 5 cycles then restart  
 if children > 250 then restart  
 if loadavg(5min) greater than 10 for 8 cycles then stop  
 if 3 restarts within 5 cycles then timeout  
   
# ---------------------------------------------------------------------------------------------  
# ЗАМЕТКА: Замените example.pid на имя pid вашего сервера, имя зависит от имени хоста  
# ---------------------------------------------------------------------------------------------  
#check process mysql with pidfile /var/lib/mysql/example.pid  
# group database  
# start program = "/usr/sbin/service mysql start"  
# stop program = "/usr/sbin/service mysql stop"  
# if failed host 127.0.0.1 port 3306 then restart  
# if 5 restarts within 5 cycles then timeout  
  
#check process proftpd with pidfile /var/run/proftpd.pid  
# start program = "/usr/sbin/service proftpd start"  
# stop program = "/usr/sbin/service proftpd stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process postfix with pidfile /var/spool/postfix/pid/master.pid  
# group mail  
# start program = "/usr/sbin/service postfix start"  
# stop program = "/usr/sbin/service postfix stop"  
# if failed port 25 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process nginx with pidfile /var/run/nginx.pid  
# start program = "/usr/sbin/service nginx start"  
# stop program = "/usr/sbin/service nginx stop"  
# if failed host 127.0.0.1 port 80 then restart  
#  
#check process memcached with pidfile /var/run/memcached.pid  
# start program = "/usr/sbin/service memcached start"  
# stop program = "/usr/sbin/service memcached stop"  
# if failed host 127.0.0.1 port 11211 then restart  
#  
#check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid  
# start program = "/usr/sbin/service pure-ftpd-mysql start"  
# stop program = "/usr/sbin/service pure-ftpd-mysql stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process named with pidfile /var/run/named/named.pid  
# start program = "/usr/sbin/service bind9 start"  
# stop program = "/usr/sbin/service bind9 stop"  
# if failed host 127.0.0.1 port 53 type tcp protocol dns then restart  
# if failed host 127.0.0.1 port 53 type udp protocol dns then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process ntpd with pidfile /var/run/ntpd.pid  
# start program = "/usr/sbin/service ntp start"  
# stop program = "/usr/sbin/service ntp stop"  
# if failed host 127.0.0.1 port 123 type udp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process mailman with pidfile /var/run/mailman/mailman.pid  
# group mail  
# start program = "/usr/sbin/service mailman start"  
# stop program = "/usr/sbin/service mailman stop"  
#  
#check process amavisd with pidfile /var/run/amavis/amavisd.pid  
# group mail  
# start program = "/usr/sbin/service amavis start"  
# stop program = "/usr/sbin/service amavis stop"  
# if failed port 10024 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap with pidfile /var/run/courier/imapd.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap start"  
# stop program = "/usr/sbin/service courier-imap stop"  
# if failed host localhost port 143 type tcp protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap-ssl start"  
# stop program = "/usr/sbin/service courier-imap-ssl stop"  
# if failed host localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3 with pidfile /var/run/courier/pop3d.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop start"  
# stop program = "/usr/sbin/service courier-pop stop"  
# if failed host localhost port 110 type tcp protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop-ssl start"  
# stop program = "/usr/sbin/service courier-pop-ssl stop"  
# if failed host localhost port 995 type tcpssl sslauto protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process dovecot with pidfile /var/run/dovecot/master.pid  
# group mail  
# start program = "/usr/sbin/service dovecot start"  
# stop program = "/usr/sbin/service dovecot stop"  
# if failed host localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout

Конфигурационный файл довольно самодостаточен; если вы не уверены в каком-либо параметре, посмотрите документацию Monit: http://mmonit.com/monit/documentation/monit.html

В части конфигурации apache Monit вы найдете это:

   if failed host localhost port 80 protocol http
      and request "/monit/token" then restart

что означает, что Monit пытается подключиться к localhost на порту 80 и пытается получить доступ к файлу /monit/token, который является /var/www/html/monit/token, потому что корень документа нашего веб-сайта - /var/www/html. Если Monit не удается, это означает, что Apache не работает, и Monit собирается его перезапустить. Теперь мы должны создать файл /var/www/html/monit/token и записать в него какую-то случайную строку:

mkdir /var/www/html/monit  
echo "hello" > /var/www/html/monit/token

Затем мы создаем pem сертификат (/var/certs/monit.pem), который нам нужен для SSL-зашифрованного веб-интерфейса Monit:

mkdir /var/certs  
cd /var/certs

Нам нужен файл конфигурации OpenSSL для создания нашего сертификата. Он может выглядеть так:

nano /var/certs/monit.cnf
# создать RSA сертификаты - Сервер

[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type

[ req_dn ]
countryName = Country Name (2 letter code)
countryName_default = MO

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Monitoria

localityName                    = Locality Name (eg, city)
localityName_default            = Monittown

organizationName                = Organization Name (eg, company)
organizationName_default        = Monit Inc.

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Dept. of Monitoring Technologies

commonName                      = Common Name (FQDN of your server)
commonName_default              = server.monit.mo

emailAddress                    = Email Address
emailAddress_default            = [email protected]

[ cert_type ]
nsCertType = server

Теперь мы создаем сертификат следующим образом:

openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem
openssl dhparam 2048 >> /var/certs/monit.pem
openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem
chmod 600 /var/certs/monit.pem

Наконец, мы можем запустить Monit:

service monit restart

Теперь укажите браузер на https://www.example.com:2812/ (убедитесь, что порт 2812 не заблокирован вашим файрволом), войдите с именем admin и паролем howtoforge, и вы должны увидеть веб-интерфейс Monit. Он должен выглядеть так:

Менеджер сервисов Monit на Debian

(Главный экран)

Состояние процесса SSH

Состояние процесса Apache

(Страница состояния SSHd)

В зависимости от вашей конфигурации в /etc/monit/monitrc monit будет перезапускать ваши сервисы, если они выйдут из строя, и отправлять уведомления по электронной почте, если идентификаторы процессов сервисов изменятся и т.д.

Чтобы получить статус Monit в оболочке, выполните команду “monit status”:

monit status

Команда покажет статус всех контролируемых сервисов.

Статус Monit в командной строке

6 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.