Installation Nagios Core

Zuletzt aktualisiert am 10. Januar 2026 von Lars

Was ist Nagios und was ist Nagios Core?

Nagios ist ein weitverbreitetes System zur Überwachung von IT-Infrastrukturen. Es wird in zwei unterschiedlichen Varianten angeboten: Nagios Core ist die Open-Source-Variante. Nagios XI baut auf Nagios Core auf, bietet zusätzliche Funktionalitäten und Support und ist kostenpflichtig.

Primärer Einsatz für mich war das Pingen von Systemen, meist Websites, um festzustellen, ob diese noch am "Leben" sind. Ursprünglich habe ich dazu einen Gratis-Account eines Dienstleisters genutzt. Da ich halt doch so einiges am Laufen habe, meinte dieser, ich dürfe den Gratis-Account nicht behalten, da der nicht für "Professionals" wäre. Das war Ansporn genug, mich mit Nagios auseinanderzusetzen. Zunächst auch primär zum Pingen. Seit ich mich dann zunehmend mit Raspberry Pi beschäftige und einige eigene Systeme habe, bin ich auch an weiteren Checks dran.

Nagios Core

Ich setze bei mir Nagios Core ein, um meine kleine Umgebung zu überwachen. Nagios Core bietet immerhin auch eine Weboberfläche, auch wenn diese nicht so arg schick ist. Die Produkt-Homepage findest du hier.

Zunächst habe ich mir Nagios auf einem externen Server unter Ubuntu installiert. Inzwischen läuft es aber auf einem Raspberry Pi 4 bei mir in meinem Home-Lab.

Ich bin Einsteiger und habe sicherlich vieles nicht korrekt oder Best Practice gemacht. Diese Mitschrift dient mir selbst als Doku, damit ich Nagios schnell wieder einrichten kann. Ich werde den Artikel regelmässig mit neuen Learnings updaten.

Installation Nagios

Zur Vorbereitung erst einmal auf dem Server

$ sudo apt update
$ sudo apt upgrade

Danach die nötigen Abhängigkeiten herunterladen

$ sudo apt-get update
$ sudo apt-get install -y autoconf gcc libc6 make wget unzip apache2 php libapache2-mod-php libgd-dev ufw
$ sudo apt-get install -y openssl libssl-dev

Beim Raspberry Pi fehlt ausserdem

$ sudo apt install -y libssl-dev

Downloading Quellcode Nagios

$ cd /tmp
$ wget -O nagioscore.tar.gz $(wget -q -O - https://api.github.com/repos/NagiosEnterprises/nagioscore/releases/latest  | grep '"browser_download_url":' | grep -o 'https://[^"]*')
$ tar xzf nagioscore.tar.gz

Kompilieren des Quellcodes

$ cd /tmp/nagios-*
$ sudo ./configure --with-httpd-conf=/etc/apache2/sites-enabled
$ sudo make all

User und Group anlegen

Mit den folgenden Kommandos werden der Nagios-User und die Nagios-Gruppe angelegt. Der www-data User wird ausserdem der Nagios-Gruppe hinzugefügt.

$ sudo make install-groups-users
$ sudo usermod -a -G nagios www-data

Installieren der Binaries

Dieser Schritt installiert die Binärdateien, CGIs und HTML-Dateien.

$ sudo make install
$ sudo make install-init

External Command File installieren

$ sudo make install-commandmode

Was ist das External Command File?

  • Es ermöglicht externen Programmen oder Skripten, Befehle an das Monitoring-System zu senden, z. B. um den Status von Diensten zu ändern, Benachrichtigungen zu deaktivieren oder geplante Downtimes zu setzen.
  • Die Datei fungiert als Kommunikationsschnittstelle zwischen externen Tools und dem Monitoring-System.

Configuration Files installieren

Mit dem folgenden Kommando installierst du die BEISPIEL-Konfigurationsdateien. Sie sind notwendig, weil Nagios einige Konfigurationsdateien benötigt, um überhaupt starten zu können.

sudo make install-config

Installieren von Service / Daemon

Hier werden die Dienst- oder Daemon-Dateien installiert und so konfiguriert, dass sie beim Systemstart automatisch gestartet werden.

sudo make install-daemoninit

Installieren der Apache Config Files

Damit installierst du die Konfigurationsdateien für den Apache-Webserver und richtest die entsprechenden Einstellungen ein.

sudo make install-webconf
sudo a2enmod rewrite
sudo a2enmod cgi

Firewall konfigurieren

Du musst in deiner lokalen Firewall eingehenden Datenverkehr über Port 80 erlauben, damit du auf die Nagios-Core-Weboberfläche zugreifen kannst.

sudo ufw allow Apache
sudo ufw reload

Auch SSH, damit du dich nicht aussperrst.

sudo ufw allow 22/tcp

Und VNC, falls benötigt.

sudo ufw allow 5900/tcp

Bei mehreren Displays VNC ggf.:

sudo ufw allow 5900:5905/tcp

Und natürlich eventuell andere Dienste nicht vergessen.

nagiosadmin User Account erstellen

Du brauchst einen httpasswd-User, um dich in Nagios einloggen zu können. Mit dem folgenden Befehl legst du einen Benutzer namens "nagiosadmin" an. Du wirst aufgefordert, ein Passwort für diesen Account festzulegen.

sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Apache Webserver starten

sudo service apache2 restart

Nagios Service / Daemon starten

sudo systemctl start nagios.service

Nagios Plugins installieren

Nagios-Plugins sind kleine Programme, die den Zustand von Diensten und Ressourcen überprüfen. Damit kannst du wichtige Kennzahlen wie CPU-Auslastung oder Netzwerkverbindungen überwachen. Die Ergebnisse der Plugins nutzt Nagios, um Benachrichtigungen zu verschicken oder Aktionen auszulösen.

Plugins herunterladen und auspacken

$ cd /tmp
$ wget -O nagios-plugins.tar.gz $(wget -q -O - https://api.github.com/repos/nagios-plugins/nagios-plugins/releases/latest  | grep '"browser_download_url":' | grep -o 'https://[^"]*')
$ tar zxf nagios-plugins.tar.gz

Plugins Kompilieren und installieren

$ cd /tmp/nagios-plugins-*/
$ sudo ./configure
$ sudo make
$ sudo make install

Nagios Service / Daemon Kommandos

Du wirst häufig den Nagios-Service starten, stoppen, neu starten müssen. Die notwendigen Kommandos findest du hier:

$ sudo systemctl start nagios.service
$ sudo systemctl stop nagios.service
$ sudo systemctl restart nagios.service
$ sudo systemctl status nagios.service

Nagios kann nicht gestartet werden?

Beispiel-Ausgabe

$ sudo systemctl restart nagios.service
Job for nagios.service failed because the control process exited with error code.
See "systemctl status nagios.service" and "journalctl -xeu nagios.service" for details.

Was da schief läuft, siehst du mit dem folgenden Befehl:

$ sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Installations-Orte - was ist wo?

nagios.conf

Die nagios.conf ist die Hauptkonfigurationsdatei für Nagios. Sie definiert grundlegende Einstellungen wie Pfade, Logging, Konfigurationen und mehr.

nagios.conf ist in

/usr/local/nagios/etc/

Objektdateien

Steuerdateien sind in

/usr/local/nagios/etc/objects

In diesem Verzeichnis sind unter anderem die Dateien commands.cfg, contacts.cfg, localhost.cfg, timeperiods.cfg, templates.cfg und weitere Beispiele. Sie enthalten Definitionen für Kommandos, Kontakte, Host-Einstellungen, Zeiträume und Vorlagen.

Plugins

Die Plugins befinden sich unter

/usr/local/nagios/libexec/

nagios.cfg

Die Datei nagios.cfg ist die zentrale Konfigurationsdatei von Nagios Core – dem Kern des Überwachungssystems Nagios. In dieser Datei werden alle globalen Einstellungen definiert, die das Verhalten und den Betrieb von Nagios bestimmen. Du findest dort zum Beispiel die Zeile

log_file=/usr/local/nagios/var/nagios.log

Sie legt fest, in welche Datei Nagios Core seine Protokolleinträge schreibt.
Jede Aktivität von Nagios (wie Host- und Serviceüberprüfungen, Benachrichtigungen oder Warnungen) wird in dieser Logdatei vermerkt, damit sie später ausgewertet oder archiviert werden kann.

In der nagios.cfg werden über die Zeilen

cfg_file=/usr/local/nagios/etc/objects/commands.cfg
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg
:

einzelne zusätzliche Konfigurationsdateien angegeben, die Nagios beim Starten (bzw. bei einem Reload) einliest. Das bedeutet konkret:

  • commands.cfg: Enthält Definitionen aller Befehle (Commands), die Nagios für Checks und Benachrichtigungen ausführt.
  • contacts.cfg: Enthält Informationen über Kontakte bzw. Kontaktgruppen, die bei einem Alarm benachrichtigt werden sollen.
  • timeperiods.cfg: Legt fest, wann und in welchen Zeitfenstern Checks oder Benachrichtigungen durchgeführt werden dürfen.
  • templates.cfg: Enthält Vorlagen (Templates) für Hosts, Services oder Kontakte, um wiederkehrende Einstellungen zu vereinfachen.

Das definiert, dass diese Dateien von Nagios verarbeitet werden und die dort definierten Objekte (Befehle, Kontakte, Zeitfenster, Vorlagen) in die Gesamt-Konfiguration übernommen wird.

Let's Encrypt Zertifikat für Nagios

Für die Weboberfläche solltest du auch ein SSL-Zertifikat installieren. Hier bietet sich ein kostenloses Let’s-Encrypt-Zertifikat an.

Dazu Certbot installieren.

$ sudo apt install certbot python3-certbot-apache

Zertifikat ausstellen lassen

$sudo certbot --apache -d nagios.meine-domain.de

Let’s Encrypt-Zertifikate sind standardmässig 90 Tage gültig. Certbot konfiguriert in der Regel automatisch einen Cronjob bzw. systemd-Timer, der regelmässig die Zertifikate erneuert und den Webserver neu lädt. Du kannst manuell prüfen, ob eine Erneuerung klappt, indem du testweise ausführst:

$ sudo certbot renew --dry-run

Nagios aufrufen

Die Nagios-Weboberfläche ist jetzt über den Webserver im Unterverzeichnis /nagios erreichbar. Beispiel: Du hast eine URL meinserver.test.de, dann würdest du Nagios unter meinserver.test.de/nagios erreichen.

Die Oberfläche wirkt sehr old-fashioned, aber sie ist recht gut strukturiert. In der Regel solltest du nach einiger Zeit ganz gut damit zurecht kommen.

Die Nagios Web-Oberfläche
Die Nagios Web-Oberfläche

E-Mail Benachrichtigung konfigurieren

Für E-Mail-Benachrichtigungen brauchst du einen installierten E-Mail-Service. Am besten verwendest du Postfix. Die Anleitung dazu findest du unter Postfix auf Raspberry Pi

E-Mail hinterlegen

Die E-Mail hinterlegst du in der contacts.cfg

$ sudo vim /usr/local/nagios/etc/objects/contacts.cfg
###############################################################################
#
# CONTACTS
#
###############################################################################

# Just one contact defined by default - the Nagios admin (that's you)
# This contact definition inherits a lot of default values from the
# 'generic-contact' template which is defined elsewhere.

define contact {

    contact_name            nagiosadmin             ; Short name of user
    use                     generic-contact         ; Inherit default values from generic-contact template (defined a
bove)
    alias                   Nagios Admin            ; Full name of user
    email                   .img@.img      ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
    service_notification_period    24x7
    service_notification_options   w,u,c,r
    service_notification_commands  notify-service-by-email
}

###############################################################################
#
# CONTACT GROUPS
#
###############################################################################

# We only have one contact in this simple configuration file, so there is
# no need to create more than one contact group.

define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin
}

Konfig prüfen

$ sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Nagios neu starten

$ sudo systemctl restart nagios.service

Zu den Benachrichtigungsoptionen kommen wir noch weiter unten.

Nagios-Konfiguration

Im gezeigten Ausschnitt aus der Nagios-Konfiguration siehst du mehrere Objekttypen, die mit dem Schlüsselwort define beginnen: host, hostgroup und service. Nagios unterteilt seine Konfigurationsobjekte in verschiedene Kategorien, die jeweils eigene Pflicht- und Zusatzattribute haben.

Host-Definition

define host {
    use        linux-server
    host_name  localhost
    alias      localhost
    address    127.0.0.1
}

use: Verweist auf ein Host-Template (z. B. linux-server), sodass Standardwerte (z. B. Check-Intervalle, Benachrichtigungs-Optionen) übernommen werden.

  • host_name: Eindeutiger Name des Hosts in Nagios.
  • alias: Eine lesbare Bezeichnung für den Host (z. B. "Datenbankserver" o. Ä.). Der Alias wird aber auch in der E-Mail-Benachrichtigung verwendet. Du solltest also schon einen Namen wählen, der einen eindeutigen Rückschluss auf das Gerät zulässt.
  • address: IP-Adresse oder Hostname (DNS-Name).

Diese Definition sagt Nagios, dass es sich um einen Host namens localhost handelt, dessen Adresse 127.0.0.1 ist. Dank des Templates linux-server erbt dieser Host Einstellungen aus einer vordefinierten Vorlage.

Hostgroup-Definition

define hostgroup {
    hostgroup_name linux-servers
    alias          Linux Servers
    members        localhost
}
  • hostgroup_name: Der interne Name der Hostgruppe, unter dem Nagios die Gruppe führt.
  • alias: Eine lesbare Bezeichnung für die Hostgruppe.
  • members: Liste der Hosts, die zu dieser Hostgruppe gehören (kommagetrennt, wenn es mehrere sind).

Wichtig: Eine Hostgruppe ermöglicht es dir, mehrere Hosts zu einer logischen Gruppe zusammenzufassen. Später kann man in Service-Definitionen, Benachrichtigungen oder Reports gezielt auf diese Gruppe verweisen (z. B. Checks für alle Linux-Server auf einmal).

Beispiel - eine Definition einer Gruppe von Webserver

define hostgroup {
    hostgroup_name          Web-Server          ; The name of the hostgroup
    alias                   Web-Server          ; Long name of the group
    members                 it-zeugs.de,lars-schlageter.com
}

Beispiel - eine Definition einer Gruppe von mehreren Linux-Servern

define hostgroup {
    hostgroup_name  linux-servers
    alias           Linux Servers
    members         rasp-nas,nextcloudpi,rasp-backup

Du kannst eigene Hostgruppen definieren. Damit Nagios diese kennt, musst du sie in der nagios.conf einbinden.

$ sudo vim /usr/local/nagios/etc/nagios.cfg

Suche nach dem entsprechenden Abschnitt und ergänze.

cfg_file=/usr/local/nagios/etc/objects/websites.cfg
cfg_file=/usr/local/nagios/etc/objects/mailservers.cfg
cfg_file=/usr/local/nagios/etc/objects/linux-hosts.cfg
:
:

Service-Definition

In der Datei kannst du direkt auch die zugehörigen Services definieren.

Beispiel Service-Definition für eine ganze Gruppe

define service {
    use                     local-service           
    hostgroup_name          linux-servers
    service_description     PING
    check_command           check_ping!100.0,20%!500.0,60%
    notifications_enabled   1
    contact_groups          admins    
    notification_interval   1440 
}
  • use: Definiert das verwendete Template. Alle dort definierten Einstellungen werden übernommen, ausser du überschreibst sie hier explizit.
  • hostgroup_name: Dieser Service gilt für alle Hosts, die Mitglied der Hostgruppe linux-servers sind.
  • service_description: Name des Services, so wie er im Webinterface angezeigt wird.
  • check_command: Check, der ausgeführt wird
    • check_ping = Plugin
    • 100.0,20% = WARNING (Latenz / Paketverlust)
    • 500.0,60% = CRITICAL
  • notifications_enabled: Aktiviert Benachrichtigungen für diesen Service
  • contact_groups: Nur Mitglieder der Kontaktgruppe admins bekommen Benachrichtigungen.
  • notification_interval: Wiederholungsintervall für Benachrichtigungen in Minuten.
    1440 = 1× pro Tag, solange das Problem besteht.

Beispiel Service-Definition für einen einzelnen Server

define service {
    use                     local-service 
    host_name               raspz-web01
    service_description     HTTP
    check_command           check_http!-H 192.168.0.212 -p 80 -s "Willkommen"
    notifications_enabled   0
}

Hier wird statt hostgroup_name host_name verwendet. Die Notifcations sind disabled.

Template

Mit use wird ein Template definiert, aber wo ist das definiert?

Suchen kannst du es mit

$ grep -R "define service" .

Bei mir ist das in templates.cfg definiert.

Gerade relevant für Einsteiger dürften local-service und generic-service.

local-service ist eigentlich gedacht für den Nagios-Server selbst und generic-service können für Services im lokalen Netz verwendet werden.

Linux-Server im lokalen Subnet überprüfen

Damit du weitere lokale Linux-Server verwalten kannst, musst du auf diesen erst einmal den nrpe-Agent installieren und eventuell konfigurieren:

$ sudo apt-get update
$ sudo apt-get install nagios-nrpe-server nagios-plugins

Die Client-Konfiguration findest du unter:

$ sudo vim /etc/nagios/nrpe.cfg

Hier musst du in jedem Fall die IP des Nagios-Servers ergänzen, z. B.

allowed_hosts=127.0.0.1,192.168.0.100

Je nach Check sind weitere Anpassungen nötig, siehe weiter unten.

Den Agenten starten

$ sudo systemctl restart nagios-nrpe-server
$ sudo systemctl enable nagios-nrpe-server

Aber auch auf dem Server muss das Tool vorhanden sein, das mit den Agenten kommunizieren kann. Es heisst check_nrpe.

$ sudo apt install nagios-nrpe-plugin

Nagios kennt jetzt aber zunächst den Befehl check_nrpe gar nicht. Daher musste ich auf dem Nagios-Server erst einmal in der commands.cfg ergänzen:

define command {
    command_name    check_nrpe
    command_line    /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

Anschliessend auf dem Nagios-Server

$ sudo systemctl restart nagios.service

Um die Verbindung vom Nagios-Server auf den Client zu testen, kann man folgenden Befehl verwenden

$ /usr/lib/nagios/plugins/check_nrpe -H <IP Client>

Erwartetes Ergebnis

NRPE v4.0.x

NRPE arbeitet über TCP Port 5666. Wenn du also einen Fehler erhältst, prüfe, ob auf dem Client in der /etc/nagios/nrpe.cfg der allowed_hosts= Eintrag passt oder eine Firewall den Verkehr blockt.

Für Windows gibt es auch einen Agenten. Da ich im Moment aber keine passende Windows-Maschine habe, lasse ich das erst einmal aussen vor.

Häufige Anpassungen

Check auf Root-File-System

Ergänze in /etc/nagios/nrpe.cfg

command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /

Starte NRPE neu

$ sudo systemctl restart nagios-nrpe-server

Frage auf dem Nagios-Server den Check zum Beispiel so ab:

define service {
    use                     generic-service
    hostgroup_name          linux-servers
    service_description     Root Partition
    check_command           check_nrpe!check_root
    notification_interval   1440 
}

Check auf alle Partitionen

Schicker ist ein Check auf alle Partitionen. Hier gibt es aber Besonderheiten zu beachten. Je nach System sind bestimmte Mounts auszuschliessen. Zum Beispiel weil der Agent auf diese keine Berechtigung hat. Der unten stehende Check muss daher möglicherweise auch erweitert werden. Bei meiner Umgebung – Raspberry Pis – hat das so funktioniert.

Ergänze in /etc/nagios/nrpe.cfg

command[check_all_disks]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -l -A -X tmpfs -X devtmpfs -X squashfs -i '^/run/user' -i '^/tmp'

-w 20% (Warning): Schwellwert für den Warnzustand. Erzeugt eine Warnung, wenn der freie Speicherplatz unter 20 % fällt.

-c 10% (Critical): Schwellwert für den kritischen Zustand. Erzeugt einen Alarm, wenn der freie Speicherplatz unter 10 % fällt.

-l (Local): Beschränkt die Prüfung auf lokale Dateisysteme. Verhindert, dass hängende Netzwerk-Mounts (wie NFS oder SMB) das Plugin blockieren.

-A (All): Wählt explizit alle Pfade für die Prüfung aus. Dies ist technisch notwendig, damit die nachfolgenden Filter (-i) eine Basis zum Arbeiten haben.

-X [Typ] (Exclude Type): Schliesst komplette Dateisystem-Klassen aus:

  • tmpfs / devtmpfs: Virtuelle RAM-Speicher.
  • squashfs: Read-Only Container (z. B. Ubuntu Snaps), die immer als "100% voll" gemeldet würden.

-i '[Regex]' (Ignore): Ignoriert Pfade basierend auf einem regulären Ausdruck:

  • ^/run/user: Ignoriert benutzerbezogene Laufwerke (gvfs, doc-Portale), auf die Nagios keinen Zugriff hat.
  • ^/tmp: Ignoriert temporäre Mounts (wie AppImages oder Collabora-Instanzen), die dynamische Namen haben.

Starte NRPE neu

$ sudo systemctl restart nagios-nrpe-server

Frage auf dem Nagios-Server den Check zum Beispiel so ab:

define service {
    use                     generic-service
    hostgroup_name          linux-servers
    service_description     Check All Disks
    check_command           check_nrpe!check_all_disks
    notification_interval   1440 
}

CPU-Load Check

Ergänze in /etc/nagios/nrpe.cfg

command[check_load]=/usr/lib/nagios/plugins/check_load -r -w 0.8,0.7,0.6 -c 1.5,1.2,1.0

Der Parameter -r gibt die Last prozentual zu den Kernen zurück. Somit kannst du den Check unabhängig von der Anzahl der CPUs des Systems einsetzen.

Starte NRPE neu

$ sudo systemctl restart nagios-nrpe-server

Frage auf dem Nagios-Server den Check zum Beispiel so ab:

define service {
    use                     local-service           
    hostgroup_name          linux-servers
    service_description     Current Load
    check_command           check_nrpe!check_load
    notification_interval   1440 
}

Testmöglichkeit wäre hier das Tool stress_ng

$ sudo apt install stress-ng

Beispiel: 4 Kerne für 60 Sekunden voll auslasten

$ stress-ng --cpu 4 --timeout 60s

...to be continued...

Und sonst?

Wo ist eigentlich die Apache-Config?

Die befindet sich bei mir unter

/etc/apache2/sites-enabled/nagios.conf

CPU Load durch NRPE-Agent

Der Client-Agent scheint doch ordentlich Last generiert zu haben. Denn beide meiner Raspberry Pi Zeros sind über Nacht getaucht.

Natürlich war das hier auch übertrieben, auf diesen auch alle Parameter zu überwachen, aber die sind ja eigentlich auch nur Test-System. Werde diese nur noch per Ping prüfen.

So deinstalliere ich den Agent wieder:

$ sudo apt-get purge nagios-nrpe-server nagios-plugins
$ sudo apt purge monitoring-plugins* 
$ sudo apt-get autoremove --purge

Reste entfernen

$ sudo rm -rf /etc/nagios /etc/nrpe.d /etc/nagios-plugin

Anschliessend rebooten.

Zeit gespart? Dann unterstütze doch it-zeugs.de

Wenn dieser Tipp dir geholfen hat, Zeit zu sparen, überlege bitte, eine kleine Spende zu hinterlassen. Dein Beitrag hilft mir, weiterhin wertvolle Inhalte zu erstellen. Du kannst unter diesem Linke spenden: Spende it-zeugs.de

Falld du nicht spenden willst oder kannst, dann wäre es toll, wenn du deinen nächsten Amazon Einkauf mit diesem Link beginnen würdest: Amazon Link. Für dich wird es nicht teurer, ich bekomme aber einen kleinen Beitrag.

Vielen herzlichen Dank ❤️

Schreibe einen Kommentar