Nginx

預設 fcgiwrap 套接字訪問權限和 nginx(Alpine Linux)的問題

  • February 24, 2021

我想使用 nginx 和 fcgiwrap 在 Alpine Linux 中執行 git-daemon (git-http-backend)。但是,預設安裝 nginx 和 fcgiwrap 會導致 502 Bad Gateway 錯誤。顯然,組訪問權限似乎錯過了 fcgiwrap 套接字的寫入權限。

當我授予 fcgiwrap 套接字上組的寫訪問權限時,一切正常。什麼是使這項工作的正確方法?套接字文件是在 fcgiwrap 啟動時創建的,所以在它執行之前我無法調整權限。

細節:

我正在使用 Alpine Linux 3.10。其中我安裝了包 nginx、fcgiwrap 和 git-daemon。對於一個簡單的 fcgiwrap 測試,我添加了 perl 和一個測試腳本f.pl

這些是服務啟動後 fcgiwrap 套接字的權限:

gitsrv-dev:~# ls -la /run/fcgi*
total 0
drwxrwsr-x    2 fcgiwrap www-data        60 Feb 21 08:52 .
drwxr-xr-x    7 root     root           320 Feb 17 19:03 ..
srwxr-xr-x    1 fcgiwrap www-data         0 Feb 21 08:52 fcgiwrap.sock

服務以以下使用者身份執行:

gitsrv-dev:~# ps axu | grep -E '(nginx|fcgiwrap)'
3436 root      0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
3443 nginx     0:00 nginx: worker process
3490 fcgiwrap  0:00 /usr/bin/fcgiwrap -f -c 1 -s unix:/run/fcgiwrap/fcgiwrap.sock
3554 root      0:00 grep -E (nginx|fcgiwrap)

我的測試 perl 腳本由 fcgiwrap 執行:

gitsrv-dev:~# cat /repos/f/f.pl
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<h1>f.pl is working</h1>";

在 nginx 中執行 f.pl 腳本的配置:

gitsrv-dev:~# vi /etc/nginx/conf.d/f.conf
   server {
           listen *:82;
           location ~ /f(/.*) {
                   gzip off;
                   root /repos/f;
                   client_max_body_size 0;
                   include fastcgi_params;
                   fastcgi_param SCRIPT_FILENAME /repos/f/f.pl;
                   fastcgi_param PATH_INFO $1;
                   fastcgi_param REMOTE_USER $remote_user;
                   fastcgi_pass unix:/run/fcgiwrap/fcgiwrap.sock;
           }
   }

如前所述,此預設配置會導致 502 Bad Gateway 錯誤 (URL http://192.168.1.221:82/f/)。

當我授予g+w權利時,它會起作用:

gitsrv-dev:~# chmod g+w /run/fcgiwrap/fcgiwrap.sock
gitsrv-dev:~# ls -la /run/fcgi*
total 0
drwxrwsr-x    2 fcgiwrap www-data        60 Feb 21 08:52 .
drwxr-xr-x    7 root     root           320 Feb 17 19:03 ..
srwxrwxr-x    1 fcgiwrap www-data         0 Feb 21 08:52 fcgiwrap.sock

現在重新載入瀏覽器會導致輸出f.pl is working

我將 Alpine Linux 用於一些內部伺服器——所有伺服器都在 VM 中執行良好。這些是使用 vagrant / puppet 設置的,我現在想創建一個 git 伺服器。所以我想保持簡單,而不是修改預設腳本文件。我是否錯過了一些明顯的配置選項,讓 fcgiwrap 和 nginx 可以很好地協同工作?

這是一個小小的猜測……

fcgiwrap的手冊提到了這一點:

很可能您會希望使用如下配置通過 spawn-fcgi 啟動 fcgiwrap:

FCGI_SOCKET=/var/run/fcgiwrap.sock 
FCGI_PROGRAM=/usr/sbin/fcgiwrap
FCGI_USER=nginx 
FCGI_GROUP=www 
FCGI_EXTRA_OPTIONS="-M 0700"
ALLOWED_ENV="PATH"

環顧四周,您可能已經在 alpine 上安裝了它,並且它在 Alpine 上fcgiwrap的配置文件是(在此處提到)。 你沒有在你的問題中提到你是如何開始 fcgiwrap 的,所以我想這就是你開始它的方式。/etc/conf.d/spawn-fcgi

所以編輯這個文件並找到註釋掉的行:

# Additional options you might want to pass to spawn-fcgi
#
#FCGI_EXTRA_OPTIONS=

改成這樣說:

# Additional options you might want to pass to spawn-fcgi
#
FCGI_EXTRA_OPTIONS="-M 0770"

這應該更改套接字上的權限(模式)。該選項在此處-m記錄。

引用自:https://unix.stackexchange.com/questions/635674