Monitoramento Servidor · 12 min read · Dec 15, 2025

Monitoramento de Servidor com Munin e Monit no Debian 10

Neste artigo, descrevo como você pode monitorar seu servidor Debian 10 (Buster) com Munin e Monit. O Munin gera gráficos interessantes sobre quase todos os aspectos do seu servidor (média de carga, uso de memória, uso de CPU, throughput do MySQL, tráfego de rede, etc.) sem muita configuração, enquanto o Monit verifica a disponibilidade de serviços como Apache, MySQL, Postfix e toma a ação apropriada, como um reinício, se descobrir que um serviço não está se comportando como esperado. A combinação dos dois oferece um monitoramento completo: gráficos que permitem ver problemas atuais ou iminentes (por exemplo, “Precisamos de um servidor maior em breve, nossa média de carga está aumentando rapidamente.”), e um watchdog que garante a disponibilidade dos serviços monitorados.

Embora você possa monitorar mais de um servidor com o Munin, discutiremos apenas o monitoramento do sistema em que ele está instalado aqui.

Este guia foi escrito para Debian 10 (Buster), mas a configuração também deve se aplicar a outras distribuições como Ubuntu com pequenas alterações.

1 Nota Preliminar

Todos os comandos neste tutorial são executados como usuário root. Faça login no seu servidor como root via SSH ou abra uma janela de terminal. Se você fizer login como um usuário diferente de root, use o comando

su -

para se tornar o usuário root, antes de prosseguir.

O nome do host do nosso sistema é server1.example.com, e temos um site www.example.com nele com o diretório raiz do documento /var/www/www.example.com/web.

Certifique-se de que o sistema esteja atualizado antes de começar a instalar o Munin, execute:

apt update  
apt upgrade

O Apache é usado para mostrar as páginas do Munin, o módulo fcgid do apache é necessário para o recurso de zoom do gráfico do Munin. Instale o apache e o módulo fcgid com apt.

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

Ative o módulo fcgid no apache.

a2enmod fcgid

2 Instalar e Configurar o Munin

Para instalar o Munin no Debian, fazemos o seguinte:

apt install munin munin-node munin-plugins-extra

Quando o servidor estiver executando MySQL ou MariaDB, ative alguns plugins extras do Munin para monitorar o 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

Em seguida, devemos editar o arquivo de configuração do Munin /etc/munin/munin.conf. Descomente as linhas dbdir, htmldir, logdir, rundir e tmpldir (os valores padrão estão bons). Queremos que o Munin use o nome server1.example.com em vez de localhost.localdomain na saída HTML, portanto, substituímos localhost.localdomain por server1.example.com na seção da árvore de hosts simples. Sem os comentários, o arquivo alterado fica assim:

nano /etc/munin/munin.conf
# Exemplo de arquivo de configuração para Munin, gerado por 'make build'  
  
# As próximas três variáveis especificam onde está a localização dos RRD  
# bancos de dados, a saída HTML, logs e os arquivos de lock/pid. Todos eles  
# devem ser graváveis pelo usuário que executa o munin-cron. Todos eles  
# são definidos para os valores que você vê aqui.  
#  
dbdir /var/lib/munin  
htmldir /var/cache/munin/www  
logdir /var/log/munin  
rundir /var/run/munin  
  
# Onde procurar os templates HTML  
#  
tmpldir /etc/munin/templates  
  
# Onde procurar os arquivos www estáticos  
#  
#staticdir /etc/munin/static  
  
# arquivos cgi temporários estão aqui. note que deve ser gravável pelo  
# usuário cgi (geralmente nobody ou httpd).  
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (Exatamente um) diretório para incluir todos os arquivos.
includedir /etc/munin/munin-conf.d
[...]  
# uma árvore de hosts simples  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]  

Devemos encontrar o arquivo de configuração do Apache 2.4 para o Munin /etc/munin/apache24.conf - ele define um alias chamado munin para o diretório de saída HTML do Munin /var/cache/munin/www, o que significa que podemos acessar o munin de todos os sites neste servidor usando o caminho relativo /munin (por exemplo, http://www.example.com/munin).

A configuração do apache Munin não está habilitada por padrão, isso foi alterado do Debian Wheezy para Jessie. O novo diretório de configuração é /etc/apache2/conf-enabled em vez de /etc/apache2/conf.d, que era usado em versões mais antigas como Wheezy e Squeeze.

Execute estes comandos para habilitar e carregar a configuração no apache.

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

Certifique-se de comentar a linha Require local e adicionar Require all granted e Options FollowSymLinks SymLinksIfOwnerMatch em vez disso (caso contrário, você só poderá acessar a saída do Munin a partir do 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  
   

Reinicie o Apache:

systemctl restart apache2.service

Em seguida, reinicie o Munin:

systemctl restart munin-node.service

Agora aguarde alguns minutos para que o Munin possa produzir sua primeira saída e, em seguida, vá para http://www.example.com/munin/ em seu navegador, e você verá as primeiras estatísticas:

Monitor de processos Munin

(Este é apenas um pequeno trecho dos muitos gráficos que o munin produz…)

3 Proteger por Senha o Diretório de Saída do Munin (Opcional, mas altamente recomendado)

Agora é uma boa ideia proteger por senha o diretório de saída do munin, a menos que você queira que todos possam ver cada pequena estatística sobre seu servidor.

Para fazer isso, devemos criar o arquivo de senha /etc/munin/munin-htpasswd. Queremos fazer login com o nome de usuário admin, então fazemos isso:

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

Digite uma senha para admin. Em seguida, abra /etc/munin/apache24.conf novamente…

nano /etc/munin/apache24.conf

… comente “Require all granted” e adicione as linhas que marquei em vermelho:

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  
   

Em seguida, reinicie o Apache:

systemctl restart apache2.service

4 Habilitar módulos adicionais no Munin

O comando Munin “munin-node-configure –suggest” pode ser usado para obter recomendações para módulos adicionais do Munin que podem ser habilitados no servidor. Execute:

munin-node-configure --suggest

A saída deve ser semelhante a esta:

Sugestões de módulos adicionais do Munin

A coluna “usado” mostra se um módulo está habilitado, a coluna “Sugestões” mostra se o servidor executa um serviço que pode ser monitorado por este módulo. Crie um symlink para o módulo em /etc/munin/plugins para habilitá-lo.

Aqui, vou habilitar os módulos apache_* como exemplo:

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

Reinicie o Munin para carregar a nova configuração.

systemctl restart munin-node.service

5 Instalar e Configurar o Monit

O Monit está disponível no repositório de backports do Debian Buster. Este repositório não está habilitado por padrão, então precisamos adicioná-lo primeiro. Execute este comando:

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

e, em seguida, atualize as listas de pacotes com:

apt update

Para instalar o Monit, fazemos o seguinte:

apt install monit

Agora devemos editar /etc/monit/monitrc. O /etc/monit/monitrc padrão tem muitos exemplos, e você pode encontrar mais exemplos de configuração em http://mmonit.com/monit/documentation/. No entanto, no meu caso, quero monitorar proftpd, sshd, mysql, apache e postfix, quero habilitar a interface web do Monit na porta 2812, quero uma interface web https, quero fazer login na interface web com o nome de usuário admin e a senha howtoforge, e quero que o Monit envie alertas por e-mail para root@localhost, então meu arquivo fica assim (adicionei exemplos para outros daemons à configuração para que você possa ajustar o arquivo às suas necessidades):

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  
   
# ---------------------------------------------------------------------------------------------  
# NOTA: Substitua example.pid pelo nome do pid do seu servidor, o nome depende do hostname  
# ---------------------------------------------------------------------------------------------  
#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

O arquivo de configuração é bastante autoexplicativo; se você não tiver certeza sobre uma opção, dê uma olhada na documentação do Monit: http://mmonit.com/monit/documentation/monit.html

Na parte do apache da configuração do Monit, você encontra isso:

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

que significa que o Monit tenta se conectar ao localhost na porta 80 e tenta acessar o arquivo /monit/token que é /var/www/html/monit/token porque o diretório raiz do nosso site é /var/www/html. Se o Monit não tiver sucesso, significa que o Apache não está em execução, e o Monit irá reiniciá-lo. Agora devemos criar o arquivo /var/www/html/monit/token e escrever alguma string aleatória nele:

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

Em seguida, criamos o certificado pem (/var/certs/monit.pem) que precisamos para a interface web do Monit criptografada por SSL:

mkdir /var/certs  
cd /var/certs

Precisamos de um arquivo de configuração OpenSSL para criar nosso certificado. Ele pode ser assim:

nano /var/certs/monit.cnf
# criar certificados RSA - Servidor

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

[ req_dn ]
countryName = Nome do País (código de 2 letras)
countryName_default = MO

stateOrProvinceName             = Nome do Estado ou Província (nome completo)
stateOrProvinceName_default     = Monitoria

localityName                    = Nome da Localidade (ex: cidade)
localityName_default            = Monittown

organizationName                = Nome da Organização (ex: empresa)
organizationName_default        = Monit Inc.

organizationalUnitName          = Nome da Unidade Organizacional (ex: seção)
organizationalUnitName_default  = Dept. de Tecnologias de Monitoramento

commonName                      = Nome Comum (FQDN do seu servidor)
commonName_default              = server.monit.mo

emailAddress                    = Endereço de E-mail
emailAddress_default            = [email protected]

[ cert_type ]
nsCertType = server

Agora criamos o certificado assim:

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

Finalmente, podemos iniciar o Monit:

service monit restart

Agora aponte seu navegador para https://www.example.com:2812/ (certifique-se de que a porta 2812 não esteja bloqueada pelo seu firewall), faça login com admin e howtoforge, e você deve ver a interface web do Monit. Deve parecer assim:

Gerenciador de Serviços Monit no Debian

(Tela Principal)

Estado do processo SSH

Estado do processo Apache

(Página de Status do SSHd)

Dependendo da sua configuração em /etc/monit/monitrc, o monit irá reiniciar seus serviços se eles falharem e enviar e-mails de notificação se os IDs de processo dos serviços mudarem, etc.

Para obter o status do Monit no shell, execute o comando “monit status”:

monit status

O comando mostrará o status de todos os serviços monitorados.

Status do Monit na linha de comando

6 Links

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.