
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-data
und nicht als Benutzer ausgeführt wird git
. Und fcgiwrap
erstellt den Socket fastcgi.sock
mit Benutzer git
, Gruppe git
und nur Lesezugriff für den Nichtbesitzer. Daher www-data
kann 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