CGI mit NGINX unter CentOS7

12 Nov 2019 - Lesezeit: 3 Minuten

CGI ist nicht tot zu bekommen. Warum auch? Ist es doch eine (für den Admin) coole Lösung um mal fix ein BASH Skript zu schreiben und dieses durch eine URL angetriggert auszuführen.

Leider läuft das ganze nicht out-of-the-Box, daher müssen folgende Dinge auf einem CentOS System passieren, damit es funktioniert:

yum install -y fcgiwrap.x86_64 spawn-fcgi

damit haben wir dann schon die Grundlage geschaffen.

  • fcgiwrap ist das tool der Wahl und die als Wrapper für unsere Skripts
  • spawn-fcgi dient uns damit, das es fcgiwrap für uns als deamon startet

Nun müssen wir noch spawn-fcgi konfigurieren, damit es später mit unserem NGINX zusammenspielt:

cat << EOF > /etc/sysconfig/spawn-fcgi
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0777"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"
EOF

damit legen wir nach dem Start einen unix socket für die Kommunikatio unter /var/run/fcgiwrap.socket an und übergeben die Rechte an NGINX.

Nun machen wir uns noch ein Skriptverzeichnis:

mkdir -p -m 770 /var/www/cgi-bin
chown -vR nginx:nginx /var/www/cgi-bin

und natürlich müssen wir unserem NGINX beibringen mit dem Dienst zu reden - dazu nutzen wir eine location directive:

  location / {
    root /var/www/cgi-bin;
    fastcgi_intercept_errors on;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
  }

im Anschluss müssen wir unsere Dienste noch aktualisieren:

systemctl enable spawn-fcgi
systemctl start spawn-fcgi
systemctl restart nginx

von nun an sollten wir in der Lage sein Skripte unter /var/www/cgi-bin über den Aufruf innerhalb der URL anzusprechen und zur Ausführung zu bewegen. Ein Skript sollte übrigens in etwa so beginnen:

#!/bin/bash

echo "Content-type: text/html"
echo ""

echo "<html>"
echo "<head>"
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">"
echo "<title>Bash CGI script</title>"
echo "</head>"
echo "<body>"
echo ""
echo ""
echo ""
echo "</body>"
echo "</html>"

Es wurden noch keine Kommentare verfasst, sei der erste!