
Eu tenho um servidor web (nginx) e um aplicativo CGI (gitweb) que é executado com fcgiwrap para permitir acesso rápido ao CGI. Quero que o protocolo Fast CGI ocorra em um arquivo de soquete unix.
Para iniciar o daemon fcgiwrap, executo:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(isto é umDaemon Toolsdaemon)
O problema é que meu servidor web é executado como usuário www-data
e não como usuário git
. E fcgiwrap
cria o soquete fastcgi.sock
com user git
, group git
e somente leitura para o não proprietário. Assim, o nginc com o usuário www-data
não pode acessar o soquete.
Aparentemente, o fcgiwrap não é capaz de selecionar permissões de arquivos de soquete unix. E isso é muito chato. Além disso, se eu conseguir que o arquivo de soquete exista antes de executar fcgiwrap
(o que é bastante difícil, pois não encontrei nenhum comando shell para criar um arquivo de soquete), ele será encerrado com o seguinte erro:
Failed to bind: Address already in use
A única solução que encontrei foi iniciar o servidor da seguinte maneira:
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"
O que está longe de ser a solução mais elegante. Você consegue pensar em algo melhor?
Obrigado
Responder1
Fcgiwrap agora é compatível com a ativação do soquete systemd. Deve ser possível usar o protocolo systemd separadamente em sistemas operacionais sem systemd.
Responder2
Uma maneira seria iniciar o fcgiwrap como um usuário específico e fazer com que ele criasse o soquete em uma pasta com o sticky bit definido. Stickybit garante que todos os arquivos criados neste diretório tenham um determinado grupo.
mkdir sdir
chgrp www-data sdir
chmod g+s sdir
exec setuidgid git fcgiwrap -s "unix:$PWD/sdir/fastcgi.sock"
Você pode criar um link simbólico se ainda quiser ver o nome do soquete original
ln -s fastcgi.sock sdir/fastcgi.sock