fcgiwrap прослушивание файла сокета unix: как изменить права доступа к файлу

1375
user36520

У меня есть веб-сервер (nginx) и приложение CGI (gitweb), которое запускается с fcgiwrap, чтобы обеспечить быстрый доступ к нему CGI. Я хочу, чтобы протокол Fast CGI проходил через файл сокета Unix.

Чтобы запустить демон fcgiwrap, я запускаю:

setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock" 

(это демон daemontools )

Проблема в том, что мой веб-сервер работает как пользователь, 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

2 ответа на вопрос

0
teknopaul

Одним из способов было бы запустить fcgiwrap от имени конкретного пользователя и заставить его создать сокет в папке с установленным фиксированным битом. 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 
-1
user36520

Fcgiwrap теперь совместим с активацией сокета systemd. Должна быть возможность использовать протокол systemd отдельно от os без systemd.