
私は Web サーバー (nginx) と CGI アプリケーション (gitweb) を持っており、これらを fcgiwrap で実行して Fast CGI アクセスを有効にしています。Fast 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
(ソケット ファイルを作成するシェル コマンドが見つからなかったので、これは非常に困難です)、次のエラーで終了します。
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 のない OS でも systemd プロトコルを個別に使用できるようになります。
答え2
1 つの方法は、特定のユーザーとして fcgiwrap を起動し、スティッキー ビットが設定されたフォルダーにソケットを作成する方法です。スティッキー ビットにより、このディレクトリに作成されたすべてのファイルに特定のグループが割り当てられます。
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