Home ITHome ServerZabbix installieren auf Ubuntu: Server, PostgreSQL, nginx und HTTPS in einer Stunde

Zabbix installieren auf Ubuntu: Server, PostgreSQL, nginx und HTTPS in einer Stunde

by Dimitri Roschkowski
0 Kommentare

Im ersten Teil der Serie habe ich erklärt, warum ich bei Zabbix gelandet bin. Jetzt wird installiert. Ziel dieses Artikels ist ein Zabbix-Server, der am Ende so läuft wie meiner: PostgreSQL als Datenbank, nginx als Webserver, HTTPS mit Let’s Encrypt, eine Firewall davor und die Telegram-Anbindung vorbereitet.

Ich installiere auf einem kleinen Hetzner-VPS mit 2 Kernen, 4 GB RAM und 40 GB Platte. Das reicht locker für 50 bis 100 Hosts. Das Betriebssystem ist Ubuntu 24.04 LTS, die Befehle funktionieren identisch auf Ubuntu 26.04 und mit minimalen Anpassungen auf Debian 12 und 13.

Zabbix im Homelab, die Serie:

  1. Zabbix vs. Uptime Kuma vs. Checkmk
  2. Zabbix installieren auf Ubuntu (dieser Artikel)
  3. Zabbix Agent 2 installieren (erscheint in Kürze)
  4. Telegram-Benachrichtigungen (erscheint in Kürze)
  5. Dashboard bauen (erscheint in Kürze)
  6. UniFi per SNMP (erscheint in Kürze)
  7. Zabbix Proxy (erscheint in Kürze)
  8. Proxmox überwachen (erscheint in Kürze)
  9. Websites und SSL (erscheint in Kürze)

Welche Version?

Zabbix hat zwei Schienen: LTS-Versionen mit fünf Jahren Support (7.0, demnächst 8.0) und Zwischenversionen mit kurzem Support (7.2, 7.4). Ich nutze 7.4, weil sie die neuesten Dashboard-Widgets und Templates mitbringt. Wer einmal installieren und dann in Ruhe lassen will, nimmt 7.0 LTS. Die Befehle unten sind für 7.4, die Versionsnummer in der Repository-URL ist die einzige Stelle, die man ändern muss.

Ein Hinweis zu 8.0: Zum Zeitpunkt, an dem ich das schreibe, gibt es 8.0 nur als Release Candidate. Ich habe es kurz ausprobiert und wieder entfernt. Für Monitoring will ich keine Vorabversion.

Voraussetzungen

  • Ein frisches Ubuntu 24.04 oder 26.04, root oder sudo
  • Ein DNS-Name, der auf den Server zeigt (für das Zertifikat), bei mir zabbix.example.de
  • Port 80 und 443 müssen von außen erreichbar sein, zumindest für die Zertifikatsausstellung

Schritt 1: Repository einbinden

Zabbix liefert eigene Pakete, die Ubuntu-eigenen sind veraltet.

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

Für Ubuntu 26.04 heißt die Datei zabbix-release_latest_7.4+ubuntu26.04_all.deb, für Debian 12 zabbix-release_latest_7.4+debian12_all.deb. Die Dateinamen stehen unter https://repo.zabbix.com/zabbix/7.4/release/.

Schritt 2: PostgreSQL installieren

Zabbix kann MySQL oder PostgreSQL. Ich nehme PostgreSQL, weil es mit den großen History-Tabellen besser umgeht und weil die Zabbix-Entwickler selbst darauf setzen. Ubuntu 24.04 bringt PostgreSQL 16 mit, das ist offiziell unterstützt. Ich habe 18 im Einsatz, das läuft ebenfalls, wird aber von Zabbix 7.4 nicht offiziell freigegeben.

sudo apt install postgresql

Datenbank und Benutzer anlegen. Das Passwort merken, es kommt gleich in zwei Konfigurationsdateien.

sudo -u postgres psql -c "CREATE USER zabbix WITH PASSWORD 'hier-ein-langes-passwort';"
sudo -u postgres createdb -O zabbix zabbix

Schritt 3: Zabbix-Pakete installieren

sudo apt install zabbix-server-pgsql zabbix-frontend-php php-pgsql zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2

Das installiert den Server, das Web-Frontend, die nginx-Konfiguration, PHP-FPM und den Agent 2 für den Server selbst. Den Agent braucht man, damit Zabbix sich selbst überwacht.

Jetzt das Datenbankschema einspielen. Das dauert eine Minute.

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

Falls das mit einem Berechtigungsfehler scheitert, weil der Systembenutzer zabbix keinen Peer-Login auf die Datenbank hat, geht es über TCP:

zcat /usr/share/zabbix/sql-scripts/postgresql/server.sql.gz | PGPASSWORD='hier-ein-langes-passwort' psql -h 127.0.0.1 -U zabbix zabbix

Schritt 4: Server konfigurieren

In /etc/zabbix/zabbix_server.conf zwei Zeilen setzen:

DBHost=127.0.0.1
DBPassword=hier-ein-langes-passwort

Die Zeile DBPassword ist auskommentiert, das # muss weg. Alles andere kann auf Standard bleiben. Wer später viele SNMP-Geräte hat, erhöht StartPollers und StartDiscoverers, aber nicht jetzt.

Schritt 5: nginx und PHP

Die Paketinstallation legt /etc/zabbix/nginx.conf an, aber alles ist auskommentiert. Zwei Zeilen aktivieren:

listen 80;
server_name zabbix.example.de;

Die nginx-Default-Site weg, sonst konkurrieren zwei Server um Port 80:

sudo rm /etc/nginx/sites-enabled/default

Zeitzone für PHP, sonst zeigt das Frontend alle Zeiten in UTC. Ans Ende von /etc/zabbix/php-fpm.conf:

php_value[date.timezone] = Europe/Berlin

Dienste starten und beim Boot aktivieren. Die PHP-Version im Dienstnamen anpassen (php8.3-fpm auf Ubuntu 24.04, php8.5-fpm auf 26.04):

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

Jetzt http://zabbix.example.de aufrufen. Es erscheint der Setup-Wizard des Frontends: Sprache, Voraussetzungen-Check, Datenbankverbindung (Host 127.0.0.1, Port 5432, Datenbank zabbix, Benutzer zabbix, das Passwort), Servername, Zeitzone, Theme. Am Ende schreibt der Wizard /etc/zabbix/web/zabbix.conf.php.

Der Zabbix Default Login ist Admin mit Passwort zabbix. Das große A ist wichtig. Dieses Passwort ändern wir in Schritt 7, bevor der Server von außen erreichbar wird.

Zabbix Problem-Ansicht nach der Installation
Nach dem Login landet man auf dem Standard-Dashboard. Der Server überwacht sich bereits selbst. Hostnamen, Domains und IP-Adressen sind unkenntlich gemacht.

Schritt 6: HTTPS mit Let’s Encrypt

Ein Monitoring-Login ohne TLS ins Internet zu stellen, geht nicht. Certbot holt das Zertifikat, nginx bekommt einen HTTPS-Block.

sudo apt install certbot
sudo certbot certonly --webroot -w /var/www/html -d zabbix.example.de

Dafür muss nginx eine Location für die ACME-Challenge haben. Ich lege eine eigene Datei /etc/nginx/conf.d/zabbix-http.conf an, die HTTP nur noch für Certbot bedient und alles andere auf HTTPS umleitet:

server {
    listen 80 default_server;
    server_name zabbix.example.de;
    location /.well-known/acme-challenge/ { root /var/www/html; }
    location / { return 301 https://zabbix.example.de$request_uri; }
}

In /etc/zabbix/nginx.conf wird aus listen 80;:

listen 443 ssl;
http2 on;
ssl_certificate /etc/letsencrypt/live/zabbix.example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/zabbix.example.de/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=31536000" always;

Wichtig: Erst das Zertifikat holen, dann die HTTPS-Konfiguration aktivieren. Umgekehrt startet nginx nicht, weil die Zertifikatsdateien fehlen. Genau diesen Fehler habe ich beim ersten Versuch gemacht.

sudo nginx -t && sudo systemctl reload nginx

Certbot richtet einen Timer für die Verlängerung ein. Damit nginx das neue Zertifikat auch lädt, ein Hook:

echo -e '#!/bin/sh\nsystemctl reload nginx' | sudo tee /etc/letsencrypt/renewal-hooks/deploy/nginx.sh
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/nginx.sh

Schritt 7: Admin-Passwort und Firewall

Im Frontend unter Users → Users → Admin ein eigenes Passwort setzen. Zabbix sperrt nach fünf Fehlversuchen für 30 Sekunden, mehr Schutz gibt es nicht. Wer den Server öffentlich betreibt, sollte zusätzlich die Zwei-Faktor-Authentifizierung aktivieren (Users → Authentication → MFA settings, TOTP).

Die Firewall. Ich nutze nftables, weil es auf Ubuntu ohnehin da ist. /etc/nftables.conf:

flush ruleset
table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    iif lo accept
    ct state established,related accept
    tcp dport { 22, 80, 443, 10051 } accept
    ip protocol icmp accept
    icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, nd-neighbor-solicit, nd-neighbor-advert } accept
  }
  chain forward { type filter hook forward priority 0; policy drop; }
  chain output  { type filter hook output  priority 0; policy accept; }
}

Port 10051 ist der Server-Port, auf dem sich aktive Agents und Proxys melden. Der muss offen sein, wenn Agents außerhalb des eigenen Netzes stehen. Port 10050 (Agent) bleibt zu, der Server fragt seinen eigenen Agent über localhost.

sudo systemctl enable --now nftables
sudo nft -f /etc/nftables.conf

Bei mir ist SSH zusätzlich auf Tailscale beschränkt, deshalb fehlt Port 22 in meiner echten Konfiguration. Wer kein VPN hat, lässt 22 drin.

Schritt 8: Funktionskontrolle

Drei Dinge prüfen:

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

Im Log sollte „server #0 started“ stehen und keine Zeile mit „cannot“. Im Frontend unter Monitoring → Hosts muss „Zabbix server“ mit grünem ZBX-Symbol stehen. Ist es rot oder grau, erreicht der Server seinen eigenen Agent nicht, meist weil der Agent nicht gestartet ist.

Die API funktioniert, wenn folgender Aufruf die Version liefert:

curl -s -H 'Content-Type: application/json-rpc' \
  -d '{"jsonrpc":"2.0","method":"apiinfo.version","params":[],"id":1}' \
  https://zabbix.example.de/api_jsonrpc.php

Die API wird in den nächsten Teilen wichtig. Ich habe praktisch alles, was ich in Zabbix gebaut habe, über die API gemacht, weil Klicken bei 60 Hosts keinen Spaß macht.

Stolpersteine, die mir passiert sind

nginx startet nach dem Reboot nicht. Wenn nginx auf eine IP bindet, die beim Boot noch nicht existiert (bei mir die Tailscale-IP), scheitert der Start. Lösung: net.ipv4.ip_nonlocal_bind = 1 in /etc/sysctl.d/90-nginx.conf und ein systemd-Drop-in mit After=tailscaled.service.

Die Datenbankversion wird nicht unterstützt. Zabbix 7.4 meckert bei PostgreSQL 18 im Log, läuft aber. Wer auf Nummer sicher gehen will, bleibt bei PostgreSQL 16.

Das Frontend zeigt „Zabbix server is not running“. Fast immer ein Datenbankproblem. DBPassword in der Serverkonfiguration prüfen und ob PostgreSQL auf 127.0.0.1 lauscht.

Zu viele Meldungen am ersten Tag. Das Linux-Template meldet jede Paketänderung, jeden Neustart eines Dienstes und jede Platte über 80 Prozent. Das ist gewollt, aber man muss es zähmen. Dazu später in der Serie.

Was jetzt fehlt

Der Server läuft, überwacht sich selbst und ist von außen erreichbar. Nützlich wird er erst mit Hosts. Im nächsten Teil installieren wir den Zabbix Agent 2 auf Ubuntu, Debian, Proxmox und in Docker, inklusive verschlüsselter Verbindung über das Internet.

You may also like

Hinterlasse einen Kommentar