AlmaLinux - Monitoring - PostgreSQL - Zabbix

Installare Zabbix su AlmaLinux 9 con PostgreSQL 17 e TimescaleDB

Zabbix è una delle soluzioni di monitoraggio open source più diffuse in ambienti enterprise. In questa guida vedremo cos’è, perché conviene adottarlo e come installarlo su AlmaLinux 9 utilizzando PostgreSQL 17 come database e TimescaleDB per ottimizzare le performance su serie temporali di dati.

La sua architettura consente di monitorare in modo centralizzato

  • Server, VM e container (Linux, Windows, VMware, Docker)
  • Apparati di rete (switch, router, firewall tramite SNMP, SSH)
  • Applicazioni e servizi (database, web server, middleware via agent, JMX, HTTP checks)
  • Metriche cloud e ambienti ibridi

Zabbix raccoglie dati attraverso agenti installati sugli host oppure in modalità agentless. Tutti i dati vengono storicizzati nel database e presentati tramite un’interfaccia web, con dashboard personalizzabili, grafici, mappe di rete e un motore di alerting flessibile basato su trigger e azioni automatizzate.

Quale versione scegliere: 7.0 LTS o 7.4

Al momento della stesura di questa guida le versioni attive sono: Zabbix 7.0 LTS e Zabbix 7.4. La scelta dipende dalle priorità del proprio ambiente.

Scegliere Zabbix 7.0 LTS se:

  • si sta installando Zabbix in produzione e si ha bisogno di stabilità a lungo termine garantita
  • l’organizzazione preferisce aggiornamenti meno frequenti e cicli di rilascio prevedibili
  • occorre mantenere la versione allineata con certificazioni o audit di sicurezza

Scegliere Zabbix 7.4 se:

  • si vuole accedere alle ultime funzionalità (nuovi widget, miglioramenti al frontend, nuovi template)
  • si sta lavorando in un ambiente di laboratorio, sviluppo o si sta avviando una nuova installazione senza vincoli di LTS
  • si ha un processo di aggiornamento regolare e non è un problema seguire le minor release

Entrambe le versioni supportano pienamente PostgreSQL 17 e TimescaleDB. I passi di installazione sono identici, con le sole differenze che evidenzieremo nella guida.

Perché PostgreSQL 17 e TimescaleDB

PostgreSQL è il database consigliato per installazioni Zabbix di medie e grandi dimensioni. Rispetto a MySQL/MariaDB offre migliore gestione della concorrenza, supporto nativo per i dati JSON e piena compatibilità con l’estensione TimescaleDB.

TimescaleDB trasforma PostgreSQL in un database ottimizzato per le serie temporali (time-series), tecnologia ideale per i dati generati dal monitoraggio: metriche raccolte a intervalli regolari su migliaia di host. I benefici principali di TimescaleDB sono

  • Hypertables: partizionamento automatico dei dati per intervalli temporali, che riduce drasticamente i tempi di query su dati storici
  • Compressione nativa: riduzione fino al 90% dello spazio su disco per i dati storici
  • Retention policy: gestione automatica della scadenza dei dati
  • Query accelerate: prestazioni nettamente superiori su aggregazioni e range temporali

PostgreSQL 17 è la versione major più recente con supporto attivo ed è quella raccomandata negli stack Zabbix aggiornati ad oggi.

Architettura consigliata in produzione

In questa guida installeremo tutti i componenti su un singolo server, configurazione adatta a laboratori, ambienti di test o infrastrutture di dimensioni contenute. In un ambiente di produzione reale, tuttavia, è fortemente consigliabile separare i ruoli su macchine dedicate e affiancare uno o più Zabbix Proxy. Una topologia di riferimento per la produzione prevede almeno tre nodi distinti:

NodoComponenti installatiMotivazione
DB serverPostgreSQL 17 + TimescaleDBIsola le risorse I/O e CPU del database. Facilita backup, tuning e scaling indipendente
Zabbix serverZabbix Server + frontend Nginx + AgentSeparare il processo server dal DB riduce la contesa sulle risorse e semplifica la manutenzione
Proxy (1+)Zabbix Proxy + Zabbix AgentRaccoglie dati localmente e li invia al server in batch, riducendo carico di rete e connessioni sul DB centrale

Il Zabbix Proxy non è obbligatorio, ma diventa essenziale al crescere dell’infrastruttura. I criteri principali per valutarne l’adozione sono:

  • Numero di host monitorati: Zabbix Server può gestire autonomamente diverse migliaia di host con hardware adeguato, ma oltre una certa soglia, indicativamente 500 / 1000 host attivi con polling frequente, distribuire il carico su più proxy diventa consigliabile per mantenere le performance del poller e del trapper
  • Distribuzione geografica: Se gli host si trovano in sedi remote, datacenter separati o cloud region differenti, un proxy locale raccoglie i dati autonomamente e li sincronizza con il server centrale. Questo elimina la dipendenza dalla latenza WAN per ogni singola metrica raccolta e garantisce continuità del monitoraggio anche in caso di interruzione temporanea del collegamento verso il server centrale
  • Segmentazione di rete: In presenza di firewall, NAT o reti isolate (es. reti OT/SCADA, DMZ, ambienti cloud privati), un proxy posizionato all’interno del segmento raccoglie i dati localmente, richiedendo l’apertura di una sola connessione in uscita verso il Zabbix Server invece di esporre centinaia di agenti verso l’esterno

Il Zabbix Proxy non supporta TimescaleDB come database locale. Per il proxy si utilizza SQLite (piccole installazioni) oppure MySQL/PostgreSQL standard, senza l’estensione TimescaleDB.

Installazione di PostgreSQL 17

Prima di qualsiasi installazione, aggiornare tutti i pacchetti del sistema ed installare alcuni strumenti utili

# Aggiornamento sistema operativo
dnf update -y

# Installazione strumenti utili
dnf install -y vim wget curl net-tools

AlmaLinux 9 include nei propri moduli una versione di PostgreSQL che potrebbe non essere la 17. È necessario quindi utilizzare il repository ufficiale

# Disattivare il modulo PostgreSQL di sistema per evitare conflitti
dnf -qy module disable postgresql

# Installazione del repository ufficiale
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Procediamo ora con l’installazione di PostgreSQL

dnf install -y postgresql17-server postgresql17-contrib

Inizializziamo il cluster e configuriamo il servizio in modo che si avvii automaticamente al riavvio del sistema

/usr/pgsql-17/bin/postgresql-17-setup initdb
systemctl enable postgresql-17 --now

Per concludere, verifichiamo lo stato dell’istanza

systemctl status postgresql-17

Installazione di TimescaleDB

Aggiungere il repository ufficiale

tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/9/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL

ed procedere con l’installazione dell’estensione TimescaleDB per PostgreSQL 17

dnf install -y timescaledb-2-postgresql-17

Il tool timescaledb-tune ottimizza i parametri di PostgreSQL per l’uso con TimescaleDB. Rispondere yes a tutte le domande:

timescaledb-tune --pg-config /usr/pgsql-17/bin/pg_config --max-conns=125

Il parametro –max-conns influisce su max_connections in PostgreSQL ed il valore va calcolato in base al proprio ambiente. Per farlo, dobbiamo considerare che le connessioni al database PostgreSQL vengono aperte da tre componenti principali

ComponenteParametro di riferimentoNote
Zabbix Server – history syncersStartDBSyncers impostato in zabbix_server.confOgni syncer è una connessione permanente al DB
Zabbix Server – altri processi interniStimato in 15 / 20Housekeeper, timer, escalator, alert manager, ecc.
Zabbix FrontendUtenti web concorrentiOgni sessione attiva apre una connessione
Attività di sistemaStimato in 20 / 30pg_dump, monitoraggio PostgreSQL, sessioni amministrative

La formula pratica è:

max_connections = StartDBSyncers + altri_processi_zabbix + frontend_concorrenti + margine_sicurezza

Configurazione e tuning del WAL

La configurazione del WAL di PostgreSQL è un argomento che merita attenzione dedicata in un’installazione Zabbix: il flusso continuo di INSERT generato dal monitoraggio produce un carico sul WAL molto più intenso rispetto a un database applicativo tradizionale.

I parametri configurabili a caldo che controllano il comportamento del WAL in produzione sono min_wal_size e max_wal_size, che agiscono sulla politica di riciclo e checkpoint dei segmenti. Quindi nel file di configurazione di PostgreSQL

vi /var/lib/pgsql/17/data/postgresql.conf

# Impostare o modificare i seguenti parametri
min_wal_size = 1GB
max_wal_size = 4GB

riavviare PostgreSQL per applicare tutte le modifiche

systemctl restart postgresql-17

Configurazione del database Zabbix

Accedere alla shell di PostgreSQL come utente postgres

sudo -u postgres psql

ed eseguire i seguenti comandi SQL per creare l’utenza ed il database

CREATE USER zabbix WITH PASSWORD 'password_sicura';
CREATE DATABASE zabbix OWNER zabbix ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
\q

Modificare il file pg_hba.conf per aggiungere regole esplicite per l’utente zabbix

vim /var/lib/pgsql/17/data/pg_hba.conf

Aggiungere le due righe specifiche per zabbix prima delle voci generiche host all all, in modo che abbiano priorità. Il file risultante deve apparire così:

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# Zabbix database access # AGGIUNGERE LE DUE RIGHE SEGUENTI
host    zabbix          zabbix          127.0.0.1/32            scram-sha-256
host    zabbix          zabbix          ::1/128                 scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

e ricaricare la configurazione

systemctl reload postgresql-17

Nel caso Database e Zabbix sono su server diversi va specificato nel file pg_hba.conf l’indirizzo IP del server Zabbix

# Zabbix database access from Zabbix Server
host    zabbix          zabbix          192.168.0.101/32        scram-sha-256

Installazione di Zabbix

Possiamo ora passare all’installazione di Zabbix e, come abbiamo visto all’inizio dell’articolo, dobbiamo scegliere se utilizzare la versione 7.0 LTS o la versione 7.4. Iniziamo con l’aggiunta del repository ufficiale

# Zabbix 7.0 LTS
rpm -Uvh https://repo.zabbix.com/zabbix/7.0/alma/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
dnf clean all

# Zabbix 7.4
rpm -Uvh https://repo.zabbix.com/zabbix/7.4/alma/9/x86_64/zabbix-release-latest-7.4.el9.noarch.rpm
dnf clean all

Se il repository EPEL è abilitato sul sistema, è necessario escludere i pacchetti Zabbix per evitare conflitti con versioni non ufficiali. Il comando è identico per entrambe le versioni

sed -i 's/\[epel\]/[epel]\nexcludepkgs=zabbix*/' /etc/yum.repos.d/epel.repo

Anche il comando di installazione è identico per entrambe le versioni e sarà il repository attivato in precedenza a determinare quale versione verrà installata

dnf install -y \
  zabbix-server-pgsql \
  zabbix-web-pgsql \
  zabbix-nginx-conf \
  zabbix-sql-scripts \
  zabbix-selinux-policy \
  zabbix-agent2

Dobbiamo ora importare lo schema del database. Il percorso dello script SQL e il comando di importazione sono identici per entrambe le versioni

zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix

Abilitiamo ora l’estensione TimescaleDB nel database zabbix

echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix

ed importare il file di configurazione delle hypertable:

cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix

È normale ricevere alcuni messaggi di avviso relativi alle best practice su versioni di TimescaleDB 2.9.0 e successive. La configurazione viene completata correttamente nonostante tali avvisi.

Configurazione di Zabbix Server

Modificare il file di configurazione principale

vim /etc/zabbix/zabbix_server.conf

# Impostare i seguenti parametri (o verificarli)
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password_sicura

Il pacchetto zabbix-nginx-conf ha installato un file di configurazione per Nginx. Aprirlo e specificare il server_name e la porta

vim /etc/nginx/conf.d/zabbix.conf

# Decommentare e personalizzare le righe
listen          8080;
server_name     zabbix.domain.local;

Configurare il timezone PHP nel file php-fpm di Zabbix

vim /etc/php-fpm.d/zabbix.conf

# Impostare il seguente parametro
php_value[date.timezone] = Europe/Rome

Il pacchetto zabbix-selinux-policy ha installato le policy necessarie. Se si utilizza PostgreSQL via TCP (con DBHost=localhost), abilitare i booleani SELinux corrispondenti

setsebool -P httpd_can_network_connect on
setsebool -P zabbix_can_network on

e configurare il firewall aprendo le porte corrispondenti

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=10051/tcp   # Zabbix server (trapper)
firewall-cmd --permanent --add-port=10050/tcp   # Zabbix agent
firewall-cmd --reload

Procediamo ad abilitare e riavviare tutti i componenti

systemctl enable --now zabbix-server zabbix-agent2 nginx php-fpm
systemctl restart nginx php-fpm

# Verificare che Zabbix server si sia avviato correttamente
systemctl status zabbix-server
journalctl -u zabbix-server -n 50 --no-pager

Completamento dell’installazione via web

Aprire il browser e navigare all’indirizzo del server: http://<IndirizzoServer>:8080. La procedura guidata di installazione nell’interfaccia web prevede i passi documentati di seguito

Avvio del wizard di installazioneZabbix - Avvio del wizard di installazione
Verificare che siani rispettati i prerequisiti PHPZabbix - Verificare i prerequisiti PHP
Confermare i parametri di connessione al databaseZabbix - Confermare i parametri di connessione al database
Impostare i dettagli del server ZabbixZabbix - Impostare i dettagli del server Zabbix
Riepilogo la configurazione prima della confermaZabbix - Riepilogo la configurazione prima della conferma
Esito dell’installazione, completata con successoZabbix - Esito dell'installazione, completata con successo
Al termine, accedere con le credenziali di default

Username: Admin
Password: zabbix
Zabbix - Form di login al sistema

Dopo il primo accesso procedere con il cambio della password di default.

Considerazioni finali

L’installazione di Zabbix su AlmaLinux 9 con PostgreSQL 17 e TimescaleDB offre una base solida per il monitoraggio di infrastrutture di qualsiasi dimensione, indipendentemente dalla versione scelta. La combinazione di PostgreSQL e TimescaleDB garantisce scalabilità nel tempo, man mano che il numero di host monitorati cresce e i dati storici si accumulano, le hypertable partizionano automaticamente i dati e la compressione nativa mantiene sotto controllo l’occupazione su disco.

Ora che l’installazione è completata i prossimi passi per l’utilizzo del sistema saranno

  • Configurare i template per i sistemi da monitorare (siano essi ufficiali o creati per soluzioni custom)
  • Impostare le media type per le notifiche (email, Telegram, …)
  • Attivare la compressione TimescaleDB sulle tabelle storiche
  • Pianificare un backup regolare del database
  • Valutare l’aggiunta di uno o più Zabbix Proxy per ambienti distribuiti o con alta latenza