我有一个 Web 服务器 (nginx) 和一个 CGI 应用程序 (gitweb),它们使用 fcgiwrap 运行以启用对它的快速 CGI 访问。我希望快速 CGI 协议通过 unix 套接字文件进行。
要启动 fcgiwrap 守护进程,我运行:
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(这是一个守护进程工具守护进程
问题是我的 Web 服务器以用户身份运行,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