
저는 빠른 CGI 액세스를 활성화하기 위해 fcgiwrap으로 실행되는 웹 서버(nginx)와 CGI 응용 프로그램(gitweb)을 가지고 있습니다. 저는 Fast CGI 프로토콜이 Unix 소켓 파일을 통해 이루어지기를 원합니다.
fcgiwrap 데몬을 시작하려면 다음을 실행합니다.
setuidgid git fcgiwrap -s "unix:$PWD/fastcgi.sock"
(이것은데몬툴즈악마)
문제는 내 웹 서버가 사용자 www-data
가 아닌 사용자 로 실행된다는 것입니다 git
. 그리고 소유자가 아닌 사용자 , 그룹 및 읽기 전용 fcgiwrap
소켓을 생성합니다 . 따라서 사용자의 nginc는 소켓에 액세스할 수 없습니다.fastcgi.sock
git
git
www-data
분명히 fcgiwrap은 유닉스 소켓 파일의 권한을 선택할 수 없습니다. 그리고 이것은 꽤 짜증나는 일이다. 또한 실행하기 전에 소켓 파일이 존재하도록 관리하면 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가 없는 OS에서도 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