Server Monitoring · 12 min read · Dec 15, 2025

Monitoraggio del Server con Munin e Monit su Debian 10

In questo articolo, descrivo come puoi monitorare il tuo server Debian 10 (Buster) con Munin e Monit. Munin genera graziosi grafici su quasi ogni aspetto del tuo server (media di carico, utilizzo della memoria, utilizzo della CPU, throughput di MySQL, traffico di rete, ecc.) senza molta configurazione, mentre Monit controlla la disponibilità di servizi come Apache, MySQL, Postfix e prende le azioni appropriate come un riavvio se trova che un servizio non si comporta come previsto. Combinando i due ottieni un monitoraggio completo: grafici che ti permettono di vedere problemi attuali o imminenti (ad esempio, “Abbiamo bisogno di un server più grande presto, la nostra media di carico sta aumentando rapidamente.”), e un watchdog che garantisce la disponibilità dei servizi monitorati.

Sebbene tu possa monitorare più di un server con Munin, discuteremo solo del monitoraggio del sistema su cui è installato qui.

Questa guida è stata scritta per Debian 10 (Buster), ma la configurazione dovrebbe applicarsi anche ad altre distribuzioni come Ubuntu con lievi modifiche.

1 Nota Preliminare

Tutti i comandi in questo tutorial vengono eseguiti come utente root. Accedi al tuo server come root tramite SSH o apri una finestra del terminale. Se accedi come un utente diverso da root, usa il comando

su -

per diventare l’utente root, prima di procedere.

L’hostname del nostro sistema è server1.example.com, e abbiamo un sito web www.example.com su di esso con la radice del documento /var/www/www.example.com/web.

Assicurati che il sistema sia aggiornato prima di iniziare a installare Munin, esegui:

apt update  
apt upgrade

Apache è utilizzato per mostrare le pagine di Munin, il modulo apache fcgid è necessario per la funzione di zoom dei grafici di Munin. Installa apache e il modulo fcgid con apt.

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

Abilita il modulo fcgid in apache.

a2enmod fcgid

2 Installa e Configura Munin

Per installare Munin su Debian, facciamo così:

apt install munin munin-node munin-plugins-extra

Quando il server sta eseguendo MySQL o MariaDB, abilita alcuni plugin aggiuntivi di Munin per monitorare 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

Successivamente, dobbiamo modificare il file di configurazione di Munin /etc/munin/munin.conf. Decommenta le righe dbdir, htmldir, logdir, rundir e tmpldir (i valori predefiniti vanno bene). Vogliamo che Munin utilizzi il nome server1.example.com invece di localhost.localdomain nell’output HTML, quindi sostituiamo localhost.localdomain con server1.example.com nella sezione dell’albero degli host semplice. Senza i commenti, il file modificato appare così:

nano /etc/munin/munin.conf
# Esempio di file di configurazione per Munin, generato da 'make build'  
  
# Le prossime tre variabili specificano dove si trovano i database RRD,  
# l'output HTML, i log e i file lock/pid. Devono essere tutti  
# scrivibili dall'utente che esegue munin-cron. Sono tutti  
# impostati sui valori che vedi qui.  
#  
dbdir /var/lib/munin  
htmldir /var/cache/munin/www  
logdir /var/log/munin  
rundir /var/run/munin  
  
# Dove cercare i modelli HTML  
#  
tmpldir /etc/munin/templates  
  
# Dove cercare i file statici www  
#  
#staticdir /etc/munin/static  
  
# i file cgi temporanei sono qui. nota che deve essere scrivibile da  
# l'utente cgi (di solito nobody o httpd).  
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (Esattamente uno) directory da includere tutti i file.
includedir /etc/munin/munin-conf.d
[...]  
# un semplice albero degli host  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]  

Dovremmo trovare il file di configurazione di Apache 2.4 per Munin /etc/munin/apache24.conf - definisce un alias chiamato munin per la directory di output HTML di Munin /var/cache/munin/www, il che significa che possiamo accedere a munin da tutti i siti web su questo server utilizzando il percorso relativo /munin (ad esempio, http://www.example.com/munin).

La configurazione di apache Munin non è abilitata per impostazione predefinita, questo è stato cambiato da DebianWheezy a Jessie. La nuova directory di configurazione è /etc/apache2/conf-enabled invece di /etc/apache2/conf.d che era utilizzata in versioni precedenti come Wheezy e Squeeze.

Esegui questi comandi per abilitare e caricare la configurazione in apache.

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

Assicurati di commentare la riga Require local e aggiungere Require all granted e Options FollowSymLinks SymLinksIfOwnerMatch invece (altrimenti potrai accedere all’output di Munin solo da 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  
   

Riavvia Apache:

systemctl restart apache2.service

Poi riavvia Munin:

systemctl restart munin-node.service

Ora aspetta qualche minuto affinché Munin possa produrre il suo primo output, e poi vai su http://www.example.com/munin/ nel tuo browser, e vedrai le prime statistiche:

Monitoraggio del processo Munin

(Questo è solo un piccolo estratto dei molti grafici che munin produce…)

3 Proteggi con Password la Directory di Output di Munin (Opzionale ma fortemente raccomandato)

Ora è una buona idea proteggere con password la directory di output di munin a meno che tu non voglia che tutti possano vedere ogni piccola statistica sul tuo server.

Per fare ciò, dobbiamo creare il file di password /etc/munin/munin-htpasswd. Vogliamo accedere con il nome utente admin, quindi facciamo così:

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

Inserisci una password per admin. Poi apri di nuovo /etc/munin/apache24.conf…

nano /etc/munin/apache24.conf

… commenta “Require all granted” e aggiungi le righe che ho contrassegnato in rosso:

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  
   

Poi riavvia Apache:

systemctl restart apache2.service

4 Abilita moduli aggiuntivi in Munin

Il comando Munin “munin-node-configure –suggest” può essere utilizzato per ottenere raccomandazioni per moduli aggiuntivi di Munin che possono essere abilitati sul server. Esegui:

munin-node-configure --suggest

L’output dovrebbe essere simile a questo:

Suggerimenti per moduli aggiuntivi di Munin

La colonna “used” mostra se un modulo è abilitato, la colonna “Suggestions” mostra se il server esegue un servizio che può essere monitorato da questo modulo. Crea un symlink per il modulo in /etc/munin/plugins per abilitarlo.

Qui abiliterò i moduli apache_* per esempio:

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

Riavvia Munin per caricare la nuova configurazione.

systemctl restart munin-node.service

5 Installa e Configura Monit

Monit è disponibile dal repository backports di Debian Buster. Questo repository non è abilitato per impostazione predefinita, quindi dobbiamo aggiungerlo prima. Esegui questo comando:

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

e poi aggiorna le liste dei pacchetti con:

apt update

Per installare Monit, facciamo così:

apt install monit

Ora dobbiamo modificare /etc/monit/monitrc. Il file predefinito /etc/monit/monitrc ha molti esempi, e puoi trovare ulteriori esempi di configurazione su http://mmonit.com/monit/documentation/. Tuttavia, nel mio caso voglio monitorare proftpd, sshd, mysql, apache e postfix, voglio abilitare l’interfaccia web di Monit sulla porta 2812, voglio un’interfaccia web https, voglio accedere all’interfaccia web con il nome utente admin e la password howtoforge, e voglio che Monit invii avvisi via email a root@localhost, quindi il mio file appare così (ho aggiunto esempi per altri demoni alla configurazione in modo che tu possa adattare il file alle tue esigenze):

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: Sostituisci example.pid con il nome pid del tuo server, il nome dipende dall'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

Il file di configurazione è piuttosto autoesplicativo; se non sei sicuro riguardo a un’opzione, dai un’occhiata alla documentazione di Monit: http://mmonit.com/monit/documentation/monit.html

Nella parte apache della configurazione di Monit trovi questo:

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

che significa che Monit cerca di connettersi a localhost sulla porta 80 e cerca di accedere al file /monit/token che è /var/www/html/monit/token perché la radice del documento del nostro sito web è /var/www/html. Se Monit non riesce, significa che Apache non è in esecuzione, e Monit lo riavvierà. Ora dobbiamo creare il file /var/www/html/monit/token e scrivere una stringa casuale al suo interno:

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

Successivamente creiamo il certificato pem (/var/certs/monit.pem) di cui abbiamo bisogno per l’interfaccia web di Monit crittografata SSL:

mkdir /var/certs  
cd /var/certs

Abbiamo bisogno di un file di configurazione OpenSSL per creare il nostro certificato. Può apparire così:

nano /var/certs/monit.cnf
# crea certificati RSA - Server

[ 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

Ora creiamo il certificato in questo modo:

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

Infine, possiamo avviare Monit:

service monit restart

Ora punta il tuo browser su https://www.example.com:2812/ (assicurati che la porta 2812 non sia bloccata dal tuo firewall), accedi con admin e howtoforge, e dovresti vedere l’interfaccia web di Monit. Dovrebbe apparire così:

Gestore di Servizi Monit su Debian

(Schermata principale)

Stato del processo SSH

Stato del processo Apache

(Pagina di stato di SSHd)

A seconda della tua configurazione in /etc/monit/monitrc, monit riavvierà i tuoi servizi se falliscono e invierà email di notifica se gli ID processo dei servizi cambiano, ecc.

Per ottenere lo stato di Monit nella shell, esegui il comando “monit status”:

monit status

Il comando mostrerà lo stato di tutti i servizi monitorati.

Stato di Monit sulla riga di comando

6 Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.