FastCGI für Munin mit systemd

Munin kann so eingestellt werden, dass die Grafiken und HTML-Dateien nicht alle fünf Minuten sondern nur auf Anforderung bzw. beim Abrufen der jeweiligen Webseite erzeugt werden. Zuständig dafür sind die Einstellungen cgi_strategy und html_strategy in /etc/munin/munin.conf. Munin benötigt dazu zwei FastCGI-Schnittstellen, welche idealerweise über einen Socket angesprochen werden. Früher konnte man das Problem lösen, indem man an passender Stelle mit spawn-fcgi die entprechenden FastCGI-Schnittstellen über Sockets bereitstellte. Eine Lösungsmöglichkeit war z.B. folgende:

1/usr/bin/spawn-fcgi -s /var/run/munin/fcgi-graph.sock -U www-data -u www-data -g www-data /usr/lib/munin/cgi/munin-cgi-graph
2/usr/bin/spawn-fcgi -s /var/run/munin/fcgi-html.sock -U www-data -u www-data -g munin  /usr/lib/munin/cgi/munin-cgi-html

In Zeiten von systemd läßt sich das nun eleganter bewerkstelligen.

Sockets in systemd definieren

Für Munin müssen zwei Sockets definiert werden. Über einen Socket erfolgt die Kommunikation zum Erstellen der Grafiken, über den anderen die Kommunikation zur Erstellung der HTML-Dateien. Unter /etc/systemd/system werden dazu zwei Dateien erstellt:

 1[Unit]
 2Description=Munin CGI Graph Socket
 3
 4[Socket]
 5SocketUser=www-data
 6SocketGroup=www-data
 7SocketMode=0600
 8ListenStream=/var/run/munin/fcgi-graph.sock
 9
10[Install]
11WantedBy=sockets.target
 1[Unit]
 2Description=Munin CGI HTML Socket
 3
 4[Socket]
 5SocketUser=www-data
 6SocketGroup=www-data
 7SocketMode=0600
 8ListenStream=/var/run/munin/fcgi-html.sock
 9
10[Install]
11WantedBy=sockets.target

Startprogramm für Munin-FastCGI

Damit die Munin-FastCGI-Programm zusammen mit dem obigen Sockets gestartet werden können ist ein kleines Skript erforderlich. Folgendes Skript legt man am besten unter /usr/local/sbin ab:

 1#!/bin/bash
 2
 3set -e
 4
 5if [ "${LISTEN_PID}" != $$ ]; then
 6        echo >&2 "file descriptors not for us, pid not matching: '${LISTEN_PID}' != '$$'"
 7        exit 255
 8fi
 9
10if [ "${LISTEN_FDS}" != "1" ]; then
11        echo >&2 "Requires exactly one socket passed to fastcgi, got: '${LISTEN_FDS:-0}'"
12        exit 255
13fi
14
15unset LISTEN_FDS
16
17# move socket from 3 to 0
18exec 0<&3
19exec 3<&-
20
21# spawn fastcgi backend
22exec "$@"</pre>

Nun muss dieses Skript noch ausführbar gemacht werden:

chmod +x /usr/local/sbin/systemd-spawn-fcgi.sh

Unit-Files für Munin-FastCGI

Anschließend müssen zwei Unit-Files (ebenfalls unter /etc/systemd/system) erstellt werden, welche die zu startenden FastCGI-Prozesse und die Abhängigkeiten zu den zuvor definierten Sockets festlegen:

 1[Unit]
 2Description=Munin CGI Graph Service
 3After=network.target
 4Requires=munin-cgi-graph.socket
 5
 6[Service]
 7User=www-data
 8Group=www-data
 9StandardOutput=null
10StandardError=syslog
11ExecStart=/usr/local/sbin/systemd-spawn-fcgi.sh /usr/lib/munin/cgi/munin-cgi-graph
12
13[Install]
14WantedBy=multi-user.target
 1[Unit]
 2Description=Munin CGI HTML Service
 3After=network.target
 4Requires=munin-cgi-html.socket
 5
 6[Service]
 7User=www-data
 8Group=www-data
 9StandardOutput=null
10StandardError=syslog
11ExecStart=/usr/local/sbin/systemd-spawn-fcgi.sh /usr/lib/munin/cgi/munin-cgi-html
12
13[Install]
14WantedBy=multi-user.target

Aktivierung

Zum Schluss müssen die Sockets und Units aktiviert und gestartet werden:

1systemctl enable munin-cgi-graph.socket
2systemctl enable munin-cgi-graph.service
3systemctl enable munin-cgi-html.socket
4systemctl enable munin-cgi-html.service
5
6systemctl start munin-cgi-graph.service
7systemctl start munin-cgi-html.service

Beide FastCGI-Prozesse sollten jetzt ausgeführt werden, was man mit folgenden Kommandos überprüfen kann:

 1# systemctl status munin-cgi-*.service
 2 munin-cgi-graph.service - Munin CGI Graph Service
 3   Loaded: loaded (/etc/systemd/system/munin-cgi-graph.service; enabled)
 4   Active: active (running) since Mi 2016-06-15 13:56:26 CEST; 4h 22min ago
 5 Main PID: 8745 (munin-cgi-graph)
 6   CGroup: /system.slice/munin-cgi-graph.service
 7           └─8745 /usr/bin/perl -T /usr/lib/munin/cgi/munin-cgi-graph
 8
 9 munin-cgi-html.service - Munin CGI HTML Service
10   Loaded: loaded (/etc/systemd/system/munin-cgi-html.service; enabled)
11   Active: active (running) since Mi 2016-06-15 13:58:08 CEST; 4h 20min ago
12 Main PID: 8816 (munin-cgi-html)
13   CGroup: /system.slice/munin-cgi-html.service
14           └─8816 /usr/bin/perl -T /usr/lib/munin/cgi/munin-cgi-html

Zum Abschluss bleibt noch ein Entfernen der alten Starts von spawn-fcgi und (falls nicht mehr benötigt) ein apt purge spawn-fcgi.

(Angepasst aus dem spawn-fcgi-Wiki für Munin.)