Arch-Linux

無法讓 Perl FastCGI 腳本在 Apache 伺服器上執行:錯誤 500

  • February 19, 2020

我正在嘗試執行一個通過快速 CGI 執行一些腳本的 Apache 伺服器,但我一生都無法弄清楚如何真正讓它工作。我的問題尤其是“錯誤 500:標題之前的腳本輸出結束”。

我一直在閱讀很多關於此的內容,遵循我能找到的每一個建議,但仍然沒有運氣。有一些關於 IOTimeout 和 BusyTimeout 以及所有其他類型的 Fcgid 超時可用,但那些沒有做任何事情,我認為我的問題與它無關。

從全新的 linux 安裝開始,這就是我所做的:

  1. 安裝apachemod_fcgid.
  2. /var/www/test用一些空文件和一個腳本創建了一個新的空網站。我已經相應地設置了權限,只是為了確保將所有者和組更改為 http。
$ ls -l /var/www
drwxrwxr-x 1 http http 122 Nov  8 16:08 test/

$ ls -l /var/www/test
-rw-rw-r-- 1 http http   0 Nov  8 15:29 file01.txt
-rw-rw-r-- 1 http http   0 Nov  8 15:29 file02.txt
-rw-rw-r-- 1 http http   0 Nov  8 15:29 file03.txt
-rwxr-xr-x 1 http http 107 Nov  8 16:08 run.fcgi*

$ cat /var/www/test/run.fcgi 
#!/usr/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";
print "Hello world.\n";
  1. 我已將此附加到/etc/httpd/conf/httpd.conf
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
 AddHandler fcgid-script .fcgi
</IfModule>

<VirtualHost *:80>
 DocumentRoot /var/www/test
 <Directory /var/www/test>
   Options +Indexes +ExecCGI
   Require all granted
 </Directory>
</VirtualHost>

現在,我可以從終端完美地執行腳本了。然後http://localhost,當我按預期返回時,我得到了目錄文件的列表,但是當我打開腳本時,我得到了上面提到的錯誤 500。apache的錯誤日誌顯示了這一點(剪掉了不必要的部分):

Content-type: text/html

Hello world.
(...) Connection reset by peer (...) mod_fcgid: error reading data from FastCGI server, referer: (...)                                                                                  
(...) End of script output before headers: run.fcgi, referer: (...)

為什麼腳本的輸出被記錄到錯誤日誌中?我認為這與權限和所有權有關,但我不知道如何,我想我已經相應地設置了所有這些。你知道我能做些什麼來讓它執行嗎?

我正在嘗試在 64 位 Arch linux 機器中執行所有這些。

謝謝你們!

您的 Apache 配置是設置 FastCGI 的許多不同方法之一。此特定配置可能不適用於所有發行版和 Apache 配置風格。這個配置對你有用。

因為 500 錯誤表明 apache 認為您的腳本正在執行,並且由於您的程式碼在日誌中,所以我們知道 apache 找到了該文件。但是,與 CGI腳本不同,FastCGI伺服器需要與 apache 進行額外的通信層。您的 FastCGI 程式碼必須等待來自 apache 的請求。在中,模組處理那個額外的層。perl``CGI::Fast

  1. 在您的問題中使用原始 Apache 配置。
  2. 確保你有perl模組:CGI::Fast
  3. 像這樣修改您的 FastCGI 伺服器腳本:
#!/usr/bin/perl

use strict;
use warnings;

use CGI::Fast;

while (my $q = CGI::Fast->new) {
   print "Content-type: text/html\n\n";
   print "Hello world.\n";
}

這段程式碼構成了一個 FastCGI 伺服器。CGI::Fast->new等待和接收來自的請求和環境,並apache設置您的perl執行時環境以輕鬆充當 FastCGI 伺服器。環境包含 CGI 程式碼所需的重要資訊。

參考:

  1. https://httpd.apache.org/mod_fcgid/
  2. perldoc CGI::Fast
  3. perldoc CGI

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