У меня есть веб-сервер (nginx) и приложение CGI (gitweb), которое работает с fcgiwrap, чтобы обеспечить быстрый доступ к нему CGI. Я хочу, чтобы протокол Fast CGI проходил через файл сокета Unix.
Чтобы запустить демон fcgiwrap, я запускаю:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(это DAEMON Tools демон)
Проблема в том, что мой веб-сервер работает как пользователь www-data
а не пользователь git
, А также fcgiwrap
создает сокет fastcgi.sock
с пользователем git
, группа git
и читать только для не владельца. Таким образом, nginx с пользователем 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"
Что далеко не самое элегантное решение. Можете ли вы придумать что-нибудь лучше?
Спасибо
источник