fcgiwrap hört auf eine Unix-Socket-Datei: So ändern Sie die Dateiberechtigungen

fcgiwrap hört auf eine Unix-Socket-Datei: So ändern Sie die Dateiberechtigungen

Ich habe einen Webserver (nginx) und eine CGI-Anwendung (gitweb), die mit fcgiwrap ausgeführt wird, um Fast CGI-Zugriff darauf zu ermöglichen. Ich möchte, dass das Fast CGI-Protokoll über eine Unix-Socket-Datei ausgeführt wird.

Um den fcgiwrap-Daemon zu starten, führe ich aus:

setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"

(das ist eindaemontoolsDaemon)

Das Problem ist, dass mein Webserver als Benutzer www-dataund nicht als Benutzer ausgeführt wird git. Und fcgiwraperstellt den Socket fastcgi.sockmit Benutzer git, Gruppe gitund nur Lesezugriff für den Nichtbesitzer. Daher www-datakann nginc mit dem Benutzer nicht auf den Socket zugreifen.

Anscheinend kann fcgiwrap die Berechtigungen von Unix-Socket-Dateien nicht auswählen. Und das ist ziemlich ärgerlich. Wenn ich es außerdem schaffe, die Socket-Datei vor dem Ausführen zu erstellen fcgiwrap(was ziemlich schwierig ist, da ich keinen Shell-Befehl zum Erstellen einer Socket-Datei gefunden habe), wird es mit dem folgenden Fehler beendet:

Failed to bind: Address already in use

Die einzige Lösung, die ich gefunden habe, besteht darin, den Server folgendermaßen zu starten:

rm -f fastcgi.sock # Ensure that the socket doesn't already exists
(sleep 5; chgrp www-data fastcgi.sock; chmod g+w fastcgi.sock) &
exec setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"

Das ist bei weitem nicht die eleganteste Lösung. Fällt Ihnen etwas Besseres ein?

Danke

Antwort1

Fcgiwrap ist jetzt mit der Aktivierung des Systemd-Sockets kompatibel. Es sollte möglich sein, das Systemd-Protokoll separat auf Betriebssystemen ohne Systemd zu verwenden.

Antwort2

Eine Möglichkeit wäre, fcgiwrap als bestimmter Benutzer zu starten und den Socket in einem Ordner mit gesetztem Sticky-Bit erstellen zu lassen. Stickybit stellt sicher, dass alle in diesem Verzeichnis erstellten Dateien einer bestimmten Gruppe zugeordnet sind.

mkdir sdir
chgrp www-data sdir
chmod g+s sdir
exec setuidgid git fcgiwrap -s "unix:$PWD/sdir/fastcgi.sock"

Sie können einen symbolischen Link erstellen, wenn Sie immer noch den ursprünglichen Socket-Namen sehen möchten

ln -s fastcgi.sock sdir/fastcgi.sock

verwandte Informationen