SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor

Zabbix 7.0 LTS su Ubuntu 24.04: guida completa

Installa Zabbix 7.0 LTS su Ubuntu 24.04: repository, schema MariaDB/MySQL, frontend nginx e agent2, con soluzioni agli errori più comuni della configurazione.

Cosa stai configurando

Un singolo VPS Ubuntu 24.04 che esegue l'intero stack Zabbix 7.0 LTS: il daemon zabbix-server che esegue il polling e genera gli alert, un database MariaDB/MySQL che memorizza tutte le metriche, un frontend PHP pubblicato tramite nginx e zabbix-agent2 che raccoglie le metriche dal server stesso. Dopo l'avvio, puoi indicare un secondo server, associare un template e ricevere un'email nel momento in cui un disco si riempie o un servizio si arresta.

Zabbix è più complesso di uno strumento per status page: è un sistema di serie temporali reale, con template, trigger, escalation e conservazione dello storico. Quasi tutti i problemi derivano da tre passaggi che spesso vengono saltati: importare lo schema del database, impostare la password del database effettivamente letta dal server e decommentare due righe nella configurazione di nginx. Se questi passaggi sono corretti, il resto consiste in una procedura guidata. Se ti servono soltanto controlli up/down e una status page condivisibile, un monitor di stato Uptime Kuma leggero svolge questa funzione in un solo container; Zabbix giustifica il maggiore consumo di risorse quando servono soglie per singola metrica ed escalation su molti host.

Usa la linea 7.0 LTS: server, frontend, agent2 e schema sono versionati insieme e ricevono correzioni di sicurezza per anni. Prima di copiare il nome del repository riportato sotto, controlla rapidamente la pagina ufficiale dei download di Zabbix. Il pacchetto di release latest configura soltanto il repository 7.0; non seleziona una release specifica: apt installa quindi i pacchetti 7.0.x disponibili nel repository, portandoti alla versione più recente. La pagina può elencare anche pacchetti di release 7.0-N numerati, ma quel numero identifica la versione della configurazione del repository, non la build di Zabbix. Tutti gli altri comandi qui riportati restano invariati nell'intera linea 7.0.

Dimensionamento, porte e prerequisiti

Si ipotizzi una VPS KVM fresca con Ubuntu 24.04 e accesso root o sudo. Sii onesto riguardo alle risorse: 2 GB di RAM e due vCPU rappresentano il limite minimo realistico per far girare server, database, nginx e PHP su un'unica macchina che monitora un numero limitato di host. Una macchina da 1 GB si avvia, ma soffoca il database man mano che la cronologia aumenta; pianifica 4 GB oltre qualche decina di host e, superato il centinaio, sposta il database su un server dedicato. Il disco cresce in base al numero di elementi raccolti e alla durata della conservazione della cronologia; stanzia qualche gigabyte per iniziare, e l'housekeeper eliminerà i dati vecchi in base alle finestre di retention impostate.

Porte: 80 e 443 per il frontend, pubbliche o limitate al tuo indirizzo IP. Il server rimane in ascolto sulla porta TCP 10051 per gli agent attivi che inviano dati, e ogni agent rimane in ascolto sulla porta TCP 10050 per il server che lo interroga. Apri solo ciò che esponi se è presente un firewall. È utile avere un record DNS A per il frontend, perché vorrai un certificato reale su di esso; una macchina Zabbix monitora ogni altro servizio che esegui, quindi appartiene a lo stack di self-hosting più ampio che vale la pena gestire nel 2026 piuttosto che essere aggiunto come un ripensamento.

Passaggio 1, aggiungere il repository ufficiale di Zabbix 7.0

Il pacchetto zabbix-release svolge una sola operazione: aggiunge al sistema l’elenco delle sorgenti APT e la chiave di firma. Installalo, quindi aggiorna l’indice.

wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update

Se wget restituisce 404 Not Found, il nome del file è cambiato. Apri la pagina dei download di Zabbix, seleziona Ubuntu 24.04 e copia l’URL zabbix-release esatto visualizzato. Un apt update eseguito correttamente mostra una riga repo.zabbix.com e nessun avviso relativo alla chiave; The following signatures couldn't be verified because the public key is not available indica che il pacchetto di release non ha mai installato la relativa chiave. Esegui di nuovo dpkg -i, quindi aggiorna nuovamente l’indice.

Passaggio 2: installare il server, il frontend e l'agent

Installare in un'unica operazione il server compilato per MySQL, il frontend PHP, la configurazione nginx, i file dello schema SQL e agent2.

sudo apt install -y zabbix-server-mysql zabbix-frontend-php \
  zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2

zabbix-server-mysql è il server compilato per MySQL/MariaDB; per PostgreSQL installare invece zabbix-server-pgsql e modificare di conseguenza i passaggi relativi al database riportati di seguito. zabbix-sql-scripts contiene lo schema da importare nel passaggio successivo. Nella versione 7.0 è un pacchetto separato e, se viene omesso, il percorso per l'importazione risulterà in seguito inesistente. Nessuno di questi pacchetti installa un motore di database. Installare quindi subito MariaDB se non è già presente sul server.

sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb

Passaggio 3, creare il database con il set di caratteri corretto

Zabbix applica controlli rigorosi alla collation: supporta soltanto utf8mb4 con utf8mb4_bin oppure la precedente utf8 (nota anche come utf8mb3) con utf8_bin, e la documentazione raccomanda vivamente utf8mb4 con utf8mb4_bin, che è la combinazione usata in questa guida. Apri una shell root con sudo mysql ed esegui:

CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER zabbix@localhost IDENTIFIED BY 'choose-a-strong-password';
GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost;
SET GLOBAL log_bin_trust_function_creators = 1;
FLUSH PRIVILEGES;

La riga SET GLOBAL è una misura di sicurezza per l'importazione. Lo schema Zabbix crea trigger deterministici durante l'importazione e un account non-SUPER come zabbix non può crearli quando il binary logging è attivo. MySQL 8 abilita il binary logging per impostazione predefinita, e lo stesso vale per alcune build MariaDB gestite; MariaDB standard non lo abilita. Se ometti il flag su un server con binary logging attivo, l'importazione si interrompe con ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled. Impostandolo come root risolvi il problema; disabilitalo nuovamente al termine dell'importazione. Annota la password esattamente: la configurazione del server deve contenere la stessa stringa, byte per byte.

Passaggio 4: importa lo schema (il passaggio che spesso viene saltato)

Questa è la causa più comune per cui un frontend appena installato non si carica: il database creato è vuoto. Carica al suo interno lo schema incluso in zabbix-sql-scripts.

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | \
  mysql --default-character-set=utf8mb4 -uzabbix -p zabbix

Viene richiesta la password zabbix. L’operazione dura da trenta a sessanta secondi su un VPS di piccole dimensioni e, se ha esito positivo, non stampa nulla. In questo caso l’assenza di output è corretta. zcat: /usr/share/zabbix-sql-scripts/mysql/server.sql.gz: No such file or directory indica che il pacchetto zabbix-sql-scripts non è installato (torna al passaggio 2). ERROR 1045 (28000): Access denied for user 'zabbix'@'localhost' indica che la password o il grant del passaggio 3 non è corretto. Al termine, disattiva nuovamente il flag di sicurezza:

sudo mysql -e "SET GLOBAL log_bin_trust_function_creators = 0;"

Verifica il caricamento con sudo mysql -e "SELECT COUNT(*) FROM zabbix.users;": un numero, non un errore doesn't exist, indica che lo schema è stato importato.

Passaggio 5: impostare la password del database in zabbix_server.conf

Il server legge le credenziali del database da /etc/zabbix/zabbix_server.conf. È necessario impostare solo la password: DBName e DBUser hanno già come valore predefinito zabbix. Decommentare la riga # DBPassword= e impostare il valore:

DBName=zabbix
DBUser=zabbix
DBPassword=choose-a-strong-password

La password deve corrispondere byte per byte a quella del Passaggio 3. Un DBPassword vuoto o errato è la causa principale del banner "Zabbix server is not running" visualizzato più avanti: il daemon si avvia, non riesce ad accedere al database e termina. A schermo non viene visualizzato alcun messaggio; l'errore è riportato solo nel log.

Passaggio 6: indirizzare nginx al frontend

Il pacchetto zabbix-nginx-conf installa un blocco server in /etc/zabbix/nginx.conf e lo collega a nginx da /etc/nginx/conf.d/zabbix.conf, ma distribuisce le righe listen e server_name commentate. Di conseguenza, nginx non pubblica nulla per Zabbix finché non le si modifica:

server {
    listen          80;
    server_name     zabbix.example.com;
    ...
}

Usare il proprio dominio oppure l'indirizzo IP pubblico del server, se non si dispone ancora di DNS. Prestare attenzione a due aspetti. Il sito di benvenuto predefinito di Ubuntu per nginx è in ascolto sulla porta 80 ed è contrassegnato come server predefinito. Per questo riceve tutte le richieste il cui nome non corrisponde a un altro blocco. Rimuoverlo, altrimenti viene caricata la pagina errata: sudo rm -f /etc/nginx/sites-enabled/default. Se /etc/nginx/conf.d/zabbix.conf manca per qualche motivo, un problema noto di alcuni pacchetti, creare manualmente il collegamento con sudo ln -s /etc/zabbix/nginx.conf /etc/nginx/conf.d/zabbix.conf. Quindi eseguire il test e ricaricare nginx:

sudo nginx -t
sudo systemctl reload nginx

nginx -t dovrebbe visualizzare test is successful. Se visualizza invece nginx: [emerg] a duplicate default server for 0.0.0.0:80, sia il sito predefinito sia il blocco Zabbix dichiarano default_server. Rimuovere il sito predefinito ed eseguire nuovamente il test. Più spesso, il test ha esito positivo e mostra soltanto un avviso conflicting server name, ma il browser continua a visualizzare la pagina di benvenuto predefinita. In questo caso il sito predefinito sta gestendo una richiesta con un nome non corrispondente. Rimuoverlo risolve il problema.

Passaggio 7, avviare e abilitare i servizi

Avviare il server, l'agent, PHP-FPM e nginx e abilitarli in modo che restino attivi dopo un riavvio.

sudo systemctl restart zabbix-server zabbix-agent2 nginx php8.3-fpm
sudo systemctl enable  zabbix-server zabbix-agent2 nginx php8.3-fpm

Ubuntu 24.04 include PHP 8.3, quindi il servizio FPM è php8.3-fpm; il pacchetto zabbix-nginx-conf esegue il frontend tramite lo stesso processo master. Verificare che il server sia stato avviato e sia rimasto attivo:

sudo systemctl status zabbix-server --no-pager
sudo tail -n 20 /var/log/zabbix/zabbix_server.log

Un log normale termina con l'avvio del server e con i processi housekeeper, poller e trapper in esecuzione. Se compare [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost', il valore DBPassword del Passaggio 5 non corrisponde. Correggerlo e riavviare. Una riga [Z3005] query failed: [1146] Table 'zabbix.dbversion' doesn't exist indica che è stata saltata l'importazione dello schema nel Passaggio 4, quindi il server non ha dati da leggere.

Passaggio 8: completare la procedura guidata di configurazione web

Aprire http://your-domain-or-ip. Viene visualizzata la procedura guidata di configurazione di Zabbix. Seguire questi passaggi:

  1. Benvenuto, selezionare una lingua.
  2. Verifica dei prerequisiti, ogni riga dovrebbe risultare OK senza interventi aggiuntivi; il pool /etc/zabbix/php-fpm.conf incluso nel pacchetto imposta già i limiti PHP richiesti da Zabbix.
  3. Configurazione della connessione al database, selezionare MySQL come tipo di database, usare l'host localhost, la porta 0 (che indica la porta o il socket predefinito), il nome del database zabbix, l'utente zabbix e la password del Passaggio 3. Credenziali errate o uno schema mancante vengono segnalati in questa fase.
  4. Impostazioni, lasciare l'host del server Zabbix localhost e la porta 10051, quindi assegnare un nome all'installazione.
  5. Riepilogo della preinstallazione, quindi selezionare Installa; la procedura guidata scrive /etc/zabbix/web/zabbix.conf.php.
  6. Fine, accedere come Admin (con la A maiuscola) usando la password zabbix, quindi modificare subito la password nella sezione Utenti.

Se la procedura guidata segnala Cannot create the configuration file, l'utente del server web non può scrivere in /etc/zabbix/web/. Scaricare il zabbix.conf.php proposto, copiarlo manualmente nella directory con sudo e selezionare Fine.

Passaggio 9: aggiungere l'host locale e collegare un template

Zabbix non esegue automaticamente il monitoraggio di se stesso. Vai a Data collection → Hosts → Create host, imposta il nome dell'host su zabbix-server, aggiungilo al gruppo Linux servers e aggiungi un'interfaccia Agent con IP 127.0.0.1 e porta 10050. In Templates, collega Linux by Zabbix agent (la variante con polling passivo; Linux by Zabbix agent active utilizza invece il push dell'agent). Salva.

Entro un minuto, nella riga dell'host compare un'etichetta ZBX verde e le metriche arrivano in Monitoring → Latest data. Un'etichetta ZBX rossa indica che il server non riesce a raggiungere l'agent. Questo caso viene trattato più avanti e non indica un errore in questo passaggio.

Passaggio 10, un trigger utile e un alert via email

Il template Linux by Zabbix agent include già trigger per CPU elevata, memoria insufficiente e dischi pieni, quindi gli alert vengono generati non appena lo associ. Per vedere come si crea un trigger, aggiungine uno personalizzato: apri l'host, vai a Triggers → Create trigger, assegnagli il nome Root filesystem over 90% full on {HOST.NAME}, imposta la severità su High e usa questa espressione:

last(/zabbix-server/vfs.fs.dependent.size[/,pused])>90

vfs.fs.dependent.size[/,pused] è l'item che indica la percentuale di spazio utilizzato e che la discovery dei filesystem del template crea per il filesystem root (il template Linux della versione 7.0 raccoglie vfs.fs.get una volta e ricava gli item dipendenti per ogni mount). Il trigger quindi si attiva senza ulteriori raccolte di dati. Salva la configurazione.

Un trigger modifica soltanto il colore di una riga nella dashboard finché un'action non invia una notifica. In Alerts → Media types → Email, configura il server SMTP, la porta, l'indirizzo del mittente, la sicurezza della connessione (in genere STARTTLS) e le eventuali credenziali del relay, quindi usa Test. Un errore in questa fase indica che il percorso SMTP non è configurato correttamente, prima che un alert reale dipenda da esso. Assegna un indirizzo all'utente Admin in Users → Users → Admin → Media → Add e seleziona le severità per cui inviare notifiche. Configura quindi l'azione in Alerts → Actions → Trigger actions → Create action: aggiungi una condizione come Trigger severity >= Warning e, nella sezione Operations, invia la notifica ad Admin tramite Email. Salva e abilita l'azione. Preferisci una chat? Zabbix 7.0 include media type webhook per Slack, Discord e Telegram, ma ognuno richiede una configurazione specifica del servizio invece dei parametri SMTP: Telegram, ad esempio, richiede la creazione di un bot tramite BotFather, l'inserimento del relativo token nel parametro api_token del media type e l'indicazione del chat ID del destinatario nel campo Send to dell'utente. Segui il README dell'integrazione, abilita il media type, assegnalo a un utente e usalo in un'azione come Email.

Monitoraggio di un secondo server con l'agent

Per monitorare un altro server, aggiungi anche lì il repository di Zabbix. Ubuntu 24.04 non include pacchetti Zabbix propri. Quindi installa solo l'agent:

wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update
sudo apt install -y zabbix-agent2

Modifica /etc/zabbix/zabbix_agent2.conf. Imposta Server sull'indirizzo IP del server Zabbix per il polling passivo. Per i controlli attivi, imposta ServerActive e un Hostname univoco che corrisponda all'host creato nel frontend:

Server=10.0.0.10
ServerActive=10.0.0.10
Hostname=web-01

Esegui sudo systemctl restart zabbix-agent2 e apri la porta TCP 10050 dal server Zabbix verso questo host. Il riavvio è necessario: il pacchetto ha avviato l'agent subito dopo l'installazione, usando il valore Server=127.0.0.1 fornito. L'agent legge il proprio file di configurazione solo all'avvio. enable --now lo troverebbe già in esecuzione e non apporterebbe modifiche. Di conseguenza, l'agent continuerebbe a rifiutare il server Zabbix. L'avvio automatico è già configurato, perché il pacchetto ha abilitato anche l'unità. Torna al frontend, crea un host la cui interfaccia Agent punti all'indirizzo IP di quella macchina, collega il template Linux e l'host inizierà a inviare dati entro un minuto.

Modalità di errore, con le stringhe visualizzate

Il frontend mostra Error connecting to database o un errore del database. Nel passaggio del wizard dedicato al database, Access denied for user 'zabbix'@'localhost' (using password: YES) indica che la password non corrisponde a quella del Passaggio 3 oppure che GRANT non è mai stato eseguito. Se il database accetta la connessione ma il frontend segnala The frontend does not match Zabbix database o Table 'zabbix.users' doesn't exist, l'importazione dello schema nel Passaggio 4 è stata saltata o non è riuscita; eseguila di nuovo in un database appena creato.

Banner arancione: Zabbix server is not running: the information displayed may not be current. Il frontend è attivo, ma non riesce a raggiungere un server operativo. Le cause possibili sono tre, in ordine di probabilità. Il servizio è arrestato: controlla systemctl status zabbix-server e avvialo. Il servizio è in esecuzione, ma non riesce a raggiungere il database: il log mostra [Z3001] connection to database 'zabbix' failed: [1045] Access denied, che indica un DBPassword errato o vuoto. Oppure il frontend punta al server sbagliato, memorizzato come host localhost e porta 10051 in /etc/zabbix/web/zabbix.conf.php. Su Ubuntu SELinux non è installato per impostazione predefinita, quindi la causa relativa al socket SELinux citata nelle guide per RHEL non si applica; in questo caso il problema dipende quasi sempre dalla password del database o da un servizio arrestato.

L'host mostra l'etichetta rossa ZBX; errore dell'elemento Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused. L'agent non è in esecuzione o non è in ascolto. Controlla systemctl status zabbix-agent2 e verifica ListenPort=10050. Un timeout anziché "connection refused" indica che un firewall sta scartando il traffico sulla porta 10050. Il messaggio Received empty response from Zabbix Agent. Assuming that agent dropped connection because of access permissions. associato indica che l'agent è raggiungibile, ma la relativa riga Server= non include l'indirizzo IP del server Zabbix; aggiungilo e riavvia l'agent.

Pagina di benvenuto nginx predefinita oppure 502 Bad Gateway. La pagina di benvenuto indica che il sito predefinito è ancora abilitato oppure che il blocco Zabbix non è collegato. Rimuovi /etc/nginx/sites-enabled/default e verifica che esista /etc/nginx/conf.d/zabbix.conf, come indicato nel Passaggio 6. 502 indica che nginx ha raggiunto PHP, ma PHP-FPM è arrestato o in ascolto su un socket diverso; avvia php8.3-fpm e verifica che il socket fastcgi_pass nel blocco Zabbix corrisponda al pool in esecuzione.

Backup, aggiornamenti e TLS

Il database contiene tutta la cronologia, quindi esegui backup pianificati con mysqldump e conserva il dump al di fuori del server:

mysqldump --single-transaction zabbix | gzip > zabbix-$(date +%F).sql.gz

Anche i file di configurazione di /etc/zabbix sono piccoli e vale la pena salvarli, ma possono essere ricreati; i dati invece no. Il ripristino segue il percorso inverso: crea il database, importa il dump e configura l'applicazione affinché lo utilizzi.

Gli aggiornamenti all'interno della linea 7.0 sono normali esecuzioni di apt update && apt upgrade; il server applica le eventuali migrazioni dello schema al successivo avvio, quindi aggiorna i pacchetti e riavvia zabbix-server. Il passaggio a una futura linea major richiede una migrazione pianificata: leggi le note di aggiornamento, esegui prima il dump del database e considera che la modifica dello schema potrebbe essere unidirezionale. Proprio per questo conviene fissare una linea LTS e mantenerla.

Non lasciare il frontend esposto tramite HTTP non cifrato. Quando il DNS punta al server, configura un certificato seguendo Certbot e Let's Encrypt su nginx per Ubuntu 24.04; la procedura modifica il server block affinché resti in ascolto sulla porta 443 e reindirizzi le richieste dalla porta 80. Mentre proteggi un server che accede agli altri server che gestisci per monitorarli, configura correttamente anche il relativo accesso SSH seguendo fail2ban per bloccare i tentativi di brute force su SSH. Un accesso di monitoraggio non deve trasmettere credenziali in chiaro e il suo punto di ingresso non deve essere esposto ai tentativi di indovinare la password.

FAQ

Mi serve l'agente Zabbix o posso monitorare i sistemi senza?

Entrambe le modalità funzionano. L'agente (agent2) fornisce metriche dettagliate per host, tra cui CPU, memoria, dischi, processi, servizi e file di log, ed è la scelta normale per i server sotto il tuo controllo. Il monitoraggio senza agente è adatto ai dispositivi su cui non puoi installare software: SNMP per switch e stampanti, ping ICMP per verificare la raggiungibilità, controlli HTTP per gli endpoint e IPMI per lo stato dell'hardware. Nella maggior parte delle installazioni reali si usano entrambe le modalità.

Perché il frontend indica che il server Zabbix non è in esecuzione?

Il frontend funziona, ma non riesce a raggiungere un processo zabbix-server attivo. In genere il server si avvia, non riesce ad autenticarsi perché DBPassword in zabbix_server.conf è errata o vuota, quindi termina subito. Esegui systemctl status zabbix-server e leggi /var/log/zabbix/zabbix_server.log; una riga [Z3001] connection to database ... failed lo conferma. Correggi la password e riavvia il servizio. Il messaggio scompare entro un minuto.

Devo usare MySQL o posso usare PostgreSQL?

Entrambe le opzioni sono completamente supportate: zabbix-server-mysql con MariaDB o MySQL, come descritto in questa guida, oppure zabbix-server-pgsql con PostgreSQL. Per le installazioni di piccole dimensioni la scelta incide poco. Per quelle grandi, PostgreSQL con l'estensione TimescaleDB suddivide le tabelle dello storico e rende molto meno onerose le attività di manutenzione. Per questo le installazioni più estese tendono a preferirlo. Scegli una soluzione e mantienila: una migrazione successiva richiede un'esportazione e una nuova importazione complete, non una semplice modifica della configurazione.

Quanta RAM serve a un server Zabbix all-in-one?

Per un singolo server che monitora pochi host, 2 GB sono una base realistica e 4 GB offrono un margine adeguato oltre alcune decine di host. La memoria viene usata soprattutto dalla cache del database e dai poller del server. Una VPS con 1 GB si avvia, ma il database resta senza risorse man mano che cresce lo storico. Oltre 100 host, sposta il database su un server dedicato e ottimizza il suo buffer pool, invece di aggiungere altra RAM alla stessa macchina.

Zabbix è eccessivo per un paio di server?

Può esserlo. Se ti serve soltanto sapere «è attivo?» e avere una pagina da condividere, uno strumento più leggero come Uptime Kuma per il monitoraggio della disponibilità e dello stato è più rapido da configurare e più semplice da consultare a colpo d'occhio. Scegli Zabbix quando ti servono soglie per singola metrica, grafici storici, host basati su template e regole di escalation: funzioni che un semplice strumento di ping non può fornire su un'intera infrastruttura.