
Tengo un servidor web (nginx) y una aplicación CGI (gitweb) que se ejecuta con fcgiwrap para permitir el acceso rápido CGI. Quiero que el protocolo Fast CGI se realice sobre un archivo de socket Unix.
Para iniciar el demonio fcgiwrap, ejecuto:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(esto es unDaemon Toolsdemonio)
El problema es que mi servidor web se ejecuta como usuario www-data
y no como usuario git
. Y fcgiwrap
crea el socket fastcgi.sock
con usuario git
, grupo git
y solo lectura para el no propietario. Por lo tanto, nginc con el usuario www-data
no puede acceder al socket.
Aparentemente, fcgiwrap no puede seleccionar permisos de archivos de socket Unix. Y esto es bastante molesto. Además, si logro que el archivo de socket exista antes de ejecutarlo fcgiwrap
(lo cual es bastante difícil dado que no encontré ningún comando de shell para crear un archivo de socket), se cierra con el siguiente error:
Failed to bind: Address already in use
La única solución que encontré es iniciar el servidor de la siguiente manera:
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"
Lo cual está lejos de ser la solución más elegante. ¿Se te ocurre algo mejor?
Gracias
Respuesta1
Fcgiwrap ahora es compatible con la activación del socket systemd. Debería ser posible utilizar el protocolo systemd por separado en un sistema operativo sin systemd.
Respuesta2
Una forma sería iniciar fcgiwrap como un usuario específico y hacer que cree el socket en una carpeta con el bit adhesivo configurado. Stickybit garantiza que todos los archivos creados en este directorio tengan un grupo determinado.
mkdir sdir
chgrp www-data sdir
chmod g+s sdir
exec setuidgid git fcgiwrap -s "unix:$PWD/sdir/fastcgi.sock"
Puede realizar un enlace simbólico si aún desea ver el nombre del socket original
ln -s fastcgi.sock sdir/fastcgi.sock