無法讓 Perl FastCGI 腳本在 Apache 伺服器上執行:錯誤 500
我正在嘗試執行一個通過快速 CGI 執行一些腳本的 Apache 伺服器,但我一生都無法弄清楚如何真正讓它工作。我的問題尤其是“錯誤 500:標題之前的腳本輸出結束”。
我一直在閱讀很多關於此的內容,遵循我能找到的每一個建議,但仍然沒有運氣。有一些關於 IOTimeout 和 BusyTimeout 以及所有其他類型的 Fcgid 超時可用,但那些沒有做任何事情,我認為我的問題與它無關。
從全新的 linux 安裝開始,這就是我所做的:
- 安裝
apache
和mod_fcgid
./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";
- 我已將此附加到
/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
- 在您的問題中使用原始 Apache 配置。
- 確保你有
perl
模組:CGI::Fast
- 像這樣修改您的 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 程式碼所需的重要資訊。參考:
- https://httpd.apache.org/mod_fcgid/
perldoc CGI::Fast
perldoc CGI