
У меня есть веб-сервер (nginx) и приложение CGI (gitweb), которое запускается с fcgiwrap для обеспечения доступа Fast CGI к нему. Я хочу, чтобы протокол Fast CGI работал через файл сокета unix.
Чтобы запустить демон fcgiwrap, я запускаю:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(этоDAEMON Toolsдемон)
Проблема в том, что мой веб-сервер работает как пользователь, www-data
а не как пользователь git
. И fcgiwrap
создает сокет fastcgi.sock
с пользователем git
, группой git
и только для чтения для не владельца. Таким образом, nginc с пользователем www-data
не может получить доступ к сокету.
Судя по всему, fcgiwrap не может выбирать разрешения для файлов сокетов unix. И это довольно раздражает. Более того, если мне удается создать файл сокета до запуска fcgiwrap
(что довольно сложно, учитывая, что я не нашел ни одной команды оболочки для создания файла сокета), он завершается со следующей ошибкой:
Failed to bind: Address already in use
Единственное решение, которое я нашел, — запустить сервер следующим образом:
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"
Что далеко не самое элегантное решение. Можете ли вы придумать что-нибудь лучше?
Спасибо
решение1
Fcgiwrap теперь совместим с активацией сокета systemd. Должно быть возможно использовать протокол systemd отдельно на ОС без systemd.
решение2
Одним из способов было бы запустить fcgiwrap как определенный пользователь и заставить его создать сокет в папке с установленным sticky bit. Stickybit гарантирует, что все файлы, созданные в этом каталоге, будут иметь заданную группу.
mkdir sdir
chgrp www-data sdir
chmod g+s sdir
exec setuidgid git fcgiwrap -s "unix:$PWD/sdir/fastcgi.sock"
Вы можете использовать символическую ссылку, если вы все еще хотите видеть исходное имя сокета.
ln -s fastcgi.sock sdir/fastcgi.sock