Springe zum Inhalt

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:

/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
/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:

[Unit]
Description=Munin CGI Graph Socket
 
[Socket]
SocketUser=www-data
SocketGroup=www-data
SocketMode=0600
ListenStream=/var/run/munin/fcgi-graph.sock
 
[Install]
WantedBy=sockets.target
[Unit]
Description=Munin CGI HTML Socket
 
[Socket]
SocketUser=www-data
SocketGroup=www-data
SocketMode=0600
ListenStream=/var/run/munin/fcgi-html.sock
 
[Install]
WantedBy=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:

#!/bin/bash
 
set -e
 
if [ "${LISTEN_PID}" != $$ ]; then
        echo >&2 "file descriptors not for us, pid not matching: '${LISTEN_PID}' != '$$'"
        exit 255
fi
 
if [ "${LISTEN_FDS}" != "1" ]; then
        echo >&2 "Requires exactly one socket passed to fastcgi, got: '${LISTEN_FDS:-0}'"
        exit 255
fi
 
unset LISTEN_FDS
 
# move socket from 3 to 0
exec 0<&3
exec 3<&-
 
# spawn fastcgi backend
exec "$@"

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:

[Unit]
Description=Munin CGI Graph Service
After=network.target
Requires=munin-cgi-graph.socket
 
[Service]
User=www-data
Group=www-data
StandardOutput=null
StandardError=syslog
ExecStart=/usr/local/sbin/systemd-spawn-fcgi.sh /usr/lib/munin/cgi/munin-cgi-graph
 
[Install]
WantedBy=multi-user.target
[Unit]
Description=Munin CGI HTML Service
After=network.target
Requires=munin-cgi-html.socket
 
[Service]
User=www-data
Group=www-data
StandardOutput=null
StandardError=syslog
ExecStart=/usr/local/sbin/systemd-spawn-fcgi.sh /usr/lib/munin/cgi/munin-cgi-html
 
[Install]
WantedBy=multi-user.target

Aktivierung

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

systemctl enable munin-cgi-graph.socket
systemctl enable munin-cgi-graph.service
systemctl enable munin-cgi-html.socket
systemctl enable munin-cgi-html.service
 
systemctl start munin-cgi-graph.service
systemctl start munin-cgi-html.service

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

# systemctl status munin-cgi-*.service
● munin-cgi-graph.service - Munin CGI Graph Service
   Loaded: loaded (/etc/systemd/system/munin-cgi-graph.service; enabled)
   Active: active (running) since Mi 2016-06-15 13:56:26 CEST; 4h 22min ago
 Main PID: 8745 (munin-cgi-graph)
   CGroup: /system.slice/munin-cgi-graph.service
           └─8745 /usr/bin/perl -T /usr/lib/munin/cgi/munin-cgi-graph
 
● munin-cgi-html.service - Munin CGI HTML Service
   Loaded: loaded (/etc/systemd/system/munin-cgi-html.service; enabled)
   Active: active (running) since Mi 2016-06-15 13:58:08 CEST; 4h 20min ago
 Main PID: 8816 (munin-cgi-html)
   CGroup: /system.slice/munin-cgi-html.service
           └─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.)