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.)