
我有一個 Web 伺服器 (nginx) 和一個使用 fcgiwrap 運行的 CGI 應用程式 (gitweb),以啟用對其的快速 CGI 存取。我希望 Fast CGI 協定透過 unix 套接字檔案進行。
要啟動 fcgiwrap 守護進程,我運行:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(這是一個守護程式工具守護程式)
問題是我的網頁伺服器以用戶身份運行www-data
,而不是以用戶身份運行git
。並使用使用者、群組和非所有者的唯讀fcgiwrap
權限建立套接字。因此,nginc與該用戶無法存取該套接字。fastcgi.sock
git
git
www-data
顯然,fcgiwrap 無法選擇 unix 套接字檔案的權限。這很煩人。此外,如果我設法在運行之前讓套接字文件存在fcgiwrap
(鑑於我沒有找到任何 shell 命令來創建套接字文件,這非常困難),它會退出並出現以下錯誤:
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,並讓它在設定了黏性位的資料夾中建立套接字。 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