Zabbix ist eine Enterprise-Monitoring-Lösung für Netzwerke, Server und Anwendungen. Es bietet umfangreiche Funktionen für Datensammlung, Alerting und Visualisierung.

Architektur

Komponenten

Zabbix Server     - Zentrale Verarbeitung
Zabbix Frontend   - Web-Interface (PHP)
Zabbix Agent      - Datensammlung auf Hosts
Zabbix Proxy      - Verteiltes Monitoring
Datenbank         - Datenspeicherung

Datenfluss

Agents/SNMP/API → [Zabbix Proxy] → Zabbix Server → Datenbank
                                         ↓
                               Web Frontend / Alerting

Installation (Debian/Ubuntu)

Repository einrichten

# Zabbix Repository
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu24.04_all.deb
dpkg -i zabbix-release_7.0-1+ubuntu24.04_all.deb
apt update

Server und Frontend

# Server, Frontend, Agent installieren
apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent

# MySQL installieren (falls nicht vorhanden)
apt install mariadb-server

Datenbank einrichten

# MySQL aufsetzen
mysql_secure_installation

# Datenbank und Benutzer erstellen
mysql -u root -p << EOF
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
SET GLOBAL log_bin_trust_function_creators = 1;
FLUSH PRIVILEGES;
EOF

# Schema importieren
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix

# Log_bin_trust wieder deaktivieren
mysql -u root -p -e "SET GLOBAL log_bin_trust_function_creators = 0;"

Server konfigurieren

# /etc/zabbix/zabbix_server.conf

DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password

Services starten

systemctl enable --now zabbix-server zabbix-agent apache2
systemctl restart zabbix-server zabbix-agent apache2

Web-Setup

1. http://server/zabbix öffnen
2. Sprache wählen
3. Datenbank-Verbindung eingeben
4. Server-Details konfigurieren
5. Installation abschließen

Standard-Login:
- Benutzer: Admin
- Passwort: zabbix

Zabbix Agent

Agent installieren

# Auf überwachtem Host
apt install zabbix-agent2

# oder klassischer Agent
apt install zabbix-agent

Agent konfigurieren

# /etc/zabbix/zabbix_agent2.conf

Server=192.168.1.10           # Zabbix Server IP
ServerActive=192.168.1.10     # Für aktive Checks
Hostname=webserver            # Hostname (muss in Zabbix übereinstimmen)

Agent starten

systemctl enable --now zabbix-agent2

Firewall

# Port 10050 für passive Checks
ufw allow from 192.168.1.10 to any port 10050

Hosts hinzufügen

Via Web-Interface

Data collection → Hosts → Create host

Host name:    webserver
Groups:       Linux servers
Interfaces:
  - Agent: 192.168.1.20:10050

Templates:    Linux by Zabbix agent

Wichtige Templates

| Template | Verwendung | |----------|------------| | Linux by Zabbix agent | Linux-Server | | Windows by Zabbix agent | Windows-Server | | Nginx by Zabbix agent | Nginx Webserver | | MySQL by Zabbix agent | MySQL-Datenbank | | PostgreSQL by Zabbix agent | PostgreSQL | | Docker by Zabbix agent | Docker-Container |

Host-Gruppen

Configuration → Host groups → Create host group

Name: Webservers
Name: Database servers
Name: Production
Name: Development

Items (Metriken)

Item-Typen

| Typ | Beschreibung | |-----|--------------| | Zabbix agent | Agent-basierte Checks | | SNMP agent | SNMP-Abfragen | | Simple check | Netzwerk-Checks | | External check | Externe Skripte | | HTTP agent | HTTP-Anfragen | | Calculated | Berechnete Werte | | Dependent | Abhängige Items |

Eigenes Item erstellen

Host → Items → Create item

Name:         Custom metric
Type:         Zabbix agent
Key:          system.run[/usr/local/bin/check_custom.sh]
Type of info: Numeric (unsigned)
Update interval: 1m

UserParameter (Agent)

# /etc/zabbix/zabbix_agent2.d/custom.conf

UserParameter=custom.metric,/usr/local/bin/check_custom.sh
UserParameter=custom.value[*],/usr/local/bin/check_value.sh $1 $2
# Test
zabbix_agent2 -t custom.metric

Triggers

Trigger erstellen

Host → Triggers → Create trigger

Name:       High CPU usage on {HOST.NAME}
Severity:   Warning
Expression: avg(/webserver/system.cpu.util,5m)>80

Expression-Syntax

# Durchschnitt über 5 Minuten > 80
avg(/host/key,5m)>80

# Letzter Wert = 0
last(/host/key)=0

# Änderung in letzten 30 Minuten
change(/host/key)>100

# Keine Daten seit 10 Minuten
nodata(/host/key,10m)=1

# Mehrere Bedingungen
avg(/host/cpu,5m)>80 and avg(/host/mem,5m)>90

Severity-Level

| Level | Farbe | Verwendung | |-------|-------|------------| | Not classified | Grau | Standard | | Information | Blau | Info | | Warning | Gelb | Warnung | | Average | Orange | Mittel | | High | Rot | Hoch | | Disaster | Rot dunkel | Kritisch |

Benachrichtigungen

Media Types

Administration → Media types

- Email
- SMS
- Slack
- Telegram
- PagerDuty
- Custom scripts

Email einrichten

Administration → Media types → Email

SMTP server:    smtp.example.com
SMTP server port: 587
SMTP helo:      zabbix.example.com
SMTP email:     zabbix@example.com
Security:       STARTTLS
Authentication: Username and password
Username:       zabbix@example.com
Password:       ***

Benutzer-Media

Administration → Users → Admin → Media

Type:     Email
Send to:  admin@example.com
When active: 1-7,00:00-24:00
Severity: Warning, Average, High, Disaster

Actions

Alerts → Actions → Trigger actions → Create action

Name:     Notify admins

Conditions:
  - Trigger severity >= Warning

Operations:
  - Send message to: Admin users
  - Subject: Problem: {EVENT.NAME}
  - Message: {EVENT.NAME}
            Host: {HOST.NAME}
            Severity: {TRIGGER.SEVERITY}

Dashboards

Dashboard erstellen

Monitoring → Dashboards → Create dashboard

Name: Server Overview

Widgets

| Widget | Funktion | |--------|----------| | Problems | Aktuelle Probleme | | System information | Zabbix-Status | | Host availability | Verfügbarkeit | | Graph | Metriken-Graphen | | Clock | Uhrzeit | | Map | Netzwerk-Karte | | Top hosts | Top N Hosts |

Graph-Widget

Add widget → Graph

Type:       Graph
Host:       webserver
Item:       CPU utilization
Time period: Last 1 hour

Templates

Template erstellen

Data collection → Templates → Create template

Template name:  Custom Linux
Groups:         Templates/Operating systems

Template-Komponenten

Template → Items:      Metriken definieren
Template → Triggers:   Schwellwerte
Template → Graphs:     Visualisierung
Template → Dashboards: Übersicht
Template → Discovery:  Auto-Discovery

Template verlinken

Host → Templates → Link new templates
→ Template auswählen
→ Update

Discovery

Network Discovery

Data collection → Discovery → Create discovery rule

Name:         Local network scan
IP range:     192.168.1.1-254
Update interval: 1h

Checks:
  - Zabbix agent "system.uname"
  - SNMP OID ".1.3.6.1.2.1.1.1.0"

Discovery Actions

Alerts → Actions → Discovery actions

Conditions:
  - Discovery status = Up
  - Service type = Zabbix agent

Operations:
  - Add host
  - Add to host group: Discovered hosts
  - Link to template: Linux by Zabbix agent

Low-Level Discovery (LLD)

# Agent-seitig (z.B. Filesystems)
vfs.fs.discovery

# Eigenes Discovery
UserParameter=custom.discovery,/usr/local/bin/discover.sh

# Output-Format (JSON)
{
  "data": [
    {"{#FSNAME}": "/", "{#FSTYPE}": "ext4"},
    {"{#FSNAME}": "/home", "{#FSTYPE}": "ext4"}
  ]
}

API

API-Token erstellen

Administration → General → API tokens → Create API token

Name:     automation
User:     Admin
Expires at: (optional)

API-Beispiele

# Login (klassisch)
curl -X POST -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"id":1}' \
  http://zabbix/api_jsonrpc.php

# Mit Token
curl -X POST -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN" \
  -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","host"]},"id":1}' \
  http://zabbix/api_jsonrpc.php

Python-Beispiel

from pyzabbix import ZabbixAPI

zapi = ZabbixAPI("http://zabbix/")
zapi.login(api_token="TOKEN")

# Hosts abrufen
hosts = zapi.host.get(output=["hostid", "host", "status"])
for host in hosts:
    print(f"{host['host']}: {host['status']}")

Proxy

Proxy installieren

# Auf Proxy-Server
apt install zabbix-proxy-mysql

# Datenbank
mysql -u root -p << EOF
CREATE DATABASE zabbix_proxy CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
GRANT ALL ON zabbix_proxy.* TO 'zabbix'@'localhost' IDENTIFIED BY 'password';
EOF

zcat /usr/share/zabbix-sql-scripts/mysql/proxy.sql.gz | mysql -uzabbix -p zabbix_proxy

Proxy konfigurieren

# /etc/zabbix/zabbix_proxy.conf

Server=192.168.1.10           # Zabbix Server
Hostname=proxy-office         # Muss in Zabbix konfiguriert sein
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=password

Proxy in Zabbix registrieren

Administration → Proxies → Create proxy

Proxy name:   proxy-office
Proxy mode:   Active

Troubleshooting

Server-Logs

# Log prüfen
tail -f /var/log/zabbix/zabbix_server.log

# Detailliertes Logging
# /etc/zabbix/zabbix_server.conf
DebugLevel=4

Agent-Test

# Agent-Konnektivität
zabbix_get -s 192.168.1.20 -k agent.ping

# Item abfragen
zabbix_get -s 192.168.1.20 -k system.cpu.util

# Lokaler Test
zabbix_agent2 -t system.cpu.util

Häufige Probleme

# Agent nicht erreichbar
# → Firewall prüfen (Port 10050)
# → Agent-Konfiguration prüfen

# Keine Daten
# → Item-Status in Frontend prüfen
# → Agent-Log prüfen

# Template-Änderungen nicht aktiv
# → Cache leeren: Administration → General → Housekeeper

Zusammenfassung

| Komponente | Port | Beschreibung | |------------|------|--------------| | Server | 10051 | Empfängt Agent-Daten | | Agent | 10050 | Sendet Metriken | | Frontend | 80/443 | Web-Interface | | API | 80/443 | REST-API |

| Datei | Beschreibung | |-------|--------------| | /etc/zabbix/zabbix_server.conf | Server-Config | | /etc/zabbix/zabbix_agent2.conf | Agent-Config | | /var/log/zabbix/ | Logs |

| Befehl | Funktion | |--------|----------| | zabbix_get -s HOST -k KEY | Item abfragen | | zabbix_agent2 -t KEY | Lokaler Item-Test | | zabbix_server -R config_cache_reload | Cache neu laden |

Fazit

Zabbix ist eine vollständige Enterprise-Monitoring-Lösung mit umfangreichen Funktionen. Die Kombination aus Agent-basiertem Monitoring, SNMP und API-Integration deckt praktisch alle Anwendungsfälle ab. Templates und Auto-Discovery reduzieren den Konfigurationsaufwand erheblich. Für verteilte Umgebungen bieten Proxies eine skalierbare Architektur.