pnp4nagios and icinga2

pnp4nagios and icinga2

This is not my article, it is copy from this site . It cover install icinga2 , icinga2 director and pnp4nagios on Ubuntu 20.04, but is very useful as manual for debian buster and Bullseye.

This guide shows how to install Icinga2 monitoring software on Ubuntu 20.04 – this includes backend, frontend, director and pnp4nagios (adding graphs to icinga). Especially PNP was hard to get working – but if you follow the guide everything is nicely lined up at the end.

Offset: Basic ubuntu 20.04 server with openssh package (used 2 vcpu, 3GB ram and 100GB disk)

# My setup:
IP address:

Icinga2 specific decissions:
Icing2 database
DB type mariadb
DB name: icinga2
DB User: icinga2
DB Passwd: icingaPW

icinga2web database:
DB type mariadb
DB name: icinga2_web
DB User: icinga2
DB Passwd: icingaPW

Director database:
DB type mariadb
DB name: icinga2_director
DB User: icinga2
DB Passwd: icingaPW

Let’s start out by disabling the firewall

systemctl stop ufw
systemctl disable ufw

Install and configure mysql

Install mariadb and create user and databases

apt-get install mariadb-server mariadb-client
mysql -u root -p

CREATE USER 'icinga2'@'localhost' IDENTIFIED BY 'icingaPW';
CREATE DATABASE icinga2_director CHARACTER SET 'utf8';

GRANT ALL ON *.* to 'icinga2'@'localhost' IDENTIFIED BY 'icingaPW'


Now your databases are ready for the install

Install icinga2 backend

Install all the packages needed using apt (so they will be updated using package manager)

apt-get update
apt-get -y install apt-transport-https wget gnupg

wget -O - | apt-key add -

. /etc/os-release; if [ ! -z ${UBUNTU_CODENAME+x} ]; then DIST="${UBUNTU_CODENAME}"; else DIST="$(lsb_release -c| awk '{print $2}')"; fi; \
 echo "deb icinga-${DIST} main" > \
 echo "deb-src icinga-${DIST} main" >> \

apt-get update
apt-get install icinga2
apt-get install monitoring-plugins
apt-get install icinga2-ido-mysql
# (answer yes to install and no to configure)

Debian Bullseye has packages in repository:

apt-get update
apt-get install apt-transport-https wget gnupg
apt-get install icinga2 monitoring-plugins icinga2-ido-mysql

Setup db connection in /etc/icinga2/features-available/ido-mysql.conf

vi /etc/icinga2/features-available/ido-mysql.conf

 * The db_ido_mysql library implements IDO functionality
 * for MySQL.

library "db_ido_mysql"

object IdoMysqlConnection "ido-mysql" {
  user = "icinga2",
  password = "icingaPW",
  host = "localhost",
  database = "icinga2"

Enable icinga2 to use database backend and load database schema

icinga2 feature enable ido-mysql
mysql -uicinga2 -picingaPW icinga2 < /usr/share/icinga2-ido-mysql/schema/mysql.sql
systemctl restart icinga2

Install Icinga2-web (frontend)

apt-get install apache2 php-gd php-json
icinga2 api setup

Now add a user to icinga2 backend by adding to /etc/icinga2/conf.d/api-users.conf, create a user object for icingaweb2 beneath the configured root user

vi /etc/icinga2/conf.d/api-users.conf

object ApiUser "icingaweb2" {
  password = "Wijsn8Z9eRs5E25d"
  permissions = [ "status/query", "actions/*", "objects/modify/*", "objects/query/*" ]

Restart incinga2 daemon

systemctl restart icinga2

Install the icingaweb2 frontend itself

note: (memorizing the token at the end (which can be displayed using the last command if you forget)

apt-get install icingaweb2 libapache2-mod-php icingacli
icingacli setup token create
icingacli setup token show

Browse to your new installation using IP (

  • insert the token click next
  • enable doc and monitoring and click next
  • accept that PDO-Postgress is missing and click next
  • set authentication to database and click next
  • Name your connection, fill in the new incingadb names and remember to set caracter set to utf8 click next
  • accept backend name of icingaweb2 click next
  • setup first webuser (the master admin) – click next
  • accept application config and click next
  • accept the summary and click next
  • Click next to start config
  • Accept default backend definitions, click next
  • Set the connection details for the icinga2 database (remember to specify utf8 as Char set) – click next
  • Command transport is set to Icinga2 API, use the username password generated earlier in the config file (icingaweb2 / Wijsn8Z9eRs5E25d) – click next
  • Accept the default protected variables – click next
  • Accept the backend config and click finish
  • click the login to Icinga Web 2 button in the upper left corner
  • Log in with the administrative user created in step 8

Adding icingaweb2 addons

Adding Director first – this module gives you the power to configure icinga through the webinterface of icinga2-web.

First lets install all modules from git.

git clone "" "/usr/share/icingaweb2/modules/director" --branch v1.8.0
cd /usr/share/icingaweb2/modules/director
git checkout "v1.8.0"

git clone "" "/usr/share/icingaweb2/modules/ipl" --branch "v0.5.0"
git clone "" "/usr/share/icingaweb2/modules/incubator" --branch "v0.6.0"
git clone "" "/usr/share/icingaweb2/modules/reactbundle" --branch "v0.9.0"

icingacli module enable ipl
icingacli module enable incubator
icingacli module enable reactbundle
icingacli module enable director

Now we need to add another user to /etc/icinga2/conf.d/api-users.conf underneath the icingaweb2 user definition

vi /etc/icinga2/conf.d/api-users.conf

object ApiUser "icingadirector" {
  password = "Wijsn8Z9eRs5E25d"
  permissions = [ "*" ]

Now you need to configure your first zone and first endpoint in zones.conf

vi /etc/icinga2/zones.conf

object Endpoint "" {
  host = ""

object Zone "master" {
 endpoints = [ "" ]

Reboot to ensure all comes up autoatically

shutdown -r now

From the webfrontend create a new database resource pointing to your new director db

  • goto Configuration -> Application -> Resources

  • create a new database object pointing to your director db – remember to set charset to utf8

  • goto module config: modules -> Director -> configuration

  • Select icinga2_director as database backend

  • click create database scheme This will start the kickstart engine

  • endpoint name:

  • icinga host:

  • icinga API user: icingadirector

  • icinga API password: Wijsn8Z9eRs5E25d

  • click store config

Deploy outstanding configurations in the webpage by:

Icinga Director -> Deployments -> click on Render Config

Now you need to setup the daemon for director to pickup changes

useradd -r -g icingaweb2 -d /var/lib/icingadirector -s /bin/false icingadirector
install -d -o icingadirector -g icingaweb2 -m 0750 /var/lib/icingadirector
cp /usr/share/icingaweb2/modules/director/contrib/systemd/icinga-director.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable icinga-director
systemctl start icinga-director

Setup PNP and pnp4nagios

This part is the hardest to get right – but the follow receipt worked for me.

install the graphing modules

apt-get install icingaweb2-module-pnp 
apt-get install rrdtool librrd-dev librrds-perl librrdp-perl php-xml php-rrd gcc make

mkdir -p /files/pnp
cd /files/pnp
wget -O pnp4nagios.tar.gz
tar -xzf pnp4nagios.tar.gz

cd pnp4nagios-0.6.26

./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-rrdtool=/usr/bin/rrdtool --with-perfdata-dir=/var/spool/icinga2/perfdata --with-httpd-conf=/etc/apache2/sites-available

make all
make full-install

Remove login to pnp4nagios (by changing apache conf file (all chages before mod_rewrite section)

vi /etc/apache2/sites-available/pnp4nagios.conf


Alias /pnp4nagios "/usr/local/pnp4nagios/share"

<Directory "/usr/local/pnp4nagios/share">
        AllowOverride None
#       Order allow,deny
#       Allow from all
        require all granted
        # Use the same value as defined in nagios.conf
#       AuthName "Nagios Access"
#       AuthType Basic
#       AuthUserFile /usr/local/nagios/etc/htpasswd.users
#       Require valid-user
        <IfModule mod_rewrite.c>
                # Turn on URL rewriting
                RewriteEngine On
                Options symLinksIfOwnerMatch
                # Installation directory
                RewriteBase /pnp4nagios/
                # Protect application and system files from being viewed
                RewriteRule "^(?:application|modules|system)/" - [F]
                # Allow any files or directories that exist to be displayed directly
                RewriteCond "%{REQUEST_FILENAME}" !-f
                RewriteCond "%{REQUEST_FILENAME}" !-d
                # Rewrite all other URLs to index.php/URL
                RewriteRule "^.*$" "index.php/$0" [PT]

Enable the config and reload apache

a2ensite pnp4nagios.conf
systemctl reload apache2

Add www-data to nagios group so it can read data

vi /etc/group add to the existing nagios line


Hit the pnp4nagios webpage – all should be green :

Enable pnp module and start creating perfdata

icingacli module enable pnp
icinga2 feature enable perfdata
systemctl restart icinga2
mv /usr/local/pnp4nagios/share/install.php /usr/local/pnp4nagios/share/install.php.orig
cd /usr/local/pnp4nagios/etc
mv misccommands.cfg-sample misccommands.cfg
mv nagios.cfg-sample nagios.cfg
systemctl enable npcd
systemctl start npcd

get_magic_quotes_runtime() is deprecated

When you run pnp4 nagios, you get this error:

Please check the documentation for information about the following error.
Function get_magic_quotes_runtime() is deprecated

file [line]:
/usr/local/pnp4nagios/lib/kohana/system/libraries/Input.php [57]:

Pnp4nagios is build for PHP5, as we are using PHP7 there is 1 deprecated function in Input.php that needs to be bypassed.

vi /usr/local/pnp4nagios/lib/kohana/system/libraries/Input.php

Find on row 57 this code:

if (get_magic_quotes_runtime())
        Kohana::log('debug', 'Disable magic_quotes_runtime! It is evil and deprecated:');

// magic_quotes_gpc is enabled
if (get_magic_quotes_gpc())
        $this->magic_quotes_gpc = TRUE;
        Kohana::log('debug', 'Disable magic_quotes_gpc! It is evil and deprecated:');

And replace with this code:

if (version_compare(PHP_VERSION, '5.3.0', '<')) 
        // magic_quotes_runtime is enabled
        if (get_magic_quotes_runtime())
                Kohana::log('debug', 'Disable magic_quotes_runtime! It is evil and deprecated:');

        // magic_quotes_gpc is enabled
        if (get_magic_quotes_gpc())
                 $this->magic_quotes_gpc = TRUE;
                 Kohana::log('debug', 'Disable magic_quotes_gpc! It is evil and deprecated:');

Then you need to change line 979 in the file: /usr/local/pnp4nagios/share/application/models/data.php

(use :979 to jump to that line)

vi /usr/local/pnp4nagios/share/application/models/data.php

# From:
if(sizeof($pages) > 0 ){
# To:
if(is_array($pages) && sizeof($pages) > 0 ){

Correct perfdata_spool_dir line in npcd config

vi /usr/local/pnp4nagios/etc/npcd.cfg

perfdata_spool_dir = /var/spool/icinga2/perfdata

restart npcd to pickup changes

systemctl restart npcd

Last go in icinga2 webpage and configure pnp to the correct config dir:

Log into icinga2 and goto configuration -> modules -> pnp -> configuration

  • set pnp4nagios configuration to: /usr/local/pnp4nagios/etc

At this point I like to reboot to ensure everything works after reboot

Shutdown -r now

Icingaweb2 service page not showing pnp thumbnails

After install pnp4nagios, I don't see any of thumbnails under the icingaweb2 service page.

pnp4nagios not showing thumbnails pnp4nagios not showing thumbnails

Problem occurs when there are two files (config.php and config_local.php) in PNP4Nagios etc's-directory which define identical views. The solution is to remove the views from one of the files.

~] ls -alFh
drwxr-xr-x 5 nagios nagios 4.0K Sep  2 12:37 ./
drwxr-xr-x 9 root   root   4.0K Sep  1 20:44 ../
-rw-r--r-- 1 nagios nagios  29K Sep  1 20:44 background.pdf
drwxr-xr-x 2 nagios nagios 4.0K Sep  1 20:44 check_commands/
drwxr-xr-x 2 nagios nagios 4.0K Sep  1 20:44 config.d/
-rw-r--r-- 1 nagios nagios 9.4K Sep  2 12:27 config_local.php
-rw-r--r-- 1 nagios nagios 9.4K Sep  1 20:44 config.php
-rw-r--r-- 1 nagios nagios 9.4K Sep  1 20:44 config.php.0.6.26
-rw-r--r-- 1 nagios nagios 1.4K Sep  1 20:44 misccommands.cfg
-rw-r--r-- 1 nagios nagios 1.7K Sep  1 20:44 nagios.cfg
-rw-r--r-- 1 nagios nagios 4.1K Sep  1 20:52 npcd.cfg
drwxr-xr-x 2 nagios nagios 4.0K Sep  1 20:44 pages/
-rw-r--r-- 1 nagios nagios  302 Sep  1 20:44 pnp4nagios_release
-rw-r--r-- 1 nagios nagios 2.5K Sep  1 20:44 process_perfdata.cfg
-rw-r--r-- 1 nagios nagios  651 Sep  1 20:44 rra.cfg-sample


You have to you comment out the view statements in the config_local.php file, this fixes the double thumbnails.

vi /usr/local/pnp4nagios/etc/config_local.php

# Define default views with title and start timerange in seconds
# remarks: required escape on " with backslash
#$views[] = array('title' => 'One Hour',  'start' => (60*60) );
#$views[] = array('title' => '4 Hours',   'start' => (60*60*4) );
#$views[] = array('title' => '25 Hours',  'start' => (60*60*25) );
#$views[] = array('title' => 'One Week',  'start' => (60*60*25*7) );
#$views[] = array('title' => 'One Month', 'start' => (60*60*24*32) );
#$views[] = array('title' => 'One Year',  'start' => (60*60*24*380) );

pnp4nagios thumbnails problem resolved:




comments powered by Disqus