2016-11-11 36 views
2

將網站從運行Apache 2.2的較早的Web服務器移動到運行Apache 2.4的較新的Web服務器時,我遇到了一個奇怪的CGI問題。基本上沒有CGI腳本在新的web服務器上工作。他們返回500錯誤。但是在ScriptLog中沒有「%error」部分,「%response」爲空。腳本似乎正在運行,但完全沒有返回!由於沒有意味着沒有頭,結果是500錯誤。Apache 2.4中的CGI腳本運行但返回空響應?

加載mod_cgi模塊(通過運行「apachectl -M」確認)。我們正在使用prefork MPM,因此這是正確的模塊。

大多數CGI腳本都是Perl,但我們也有一個編譯C的腳本,它顯示了完全相同的行爲模式。即使是這樣一個基本的測試腳本不起作用:

#!/usr/bin/perl 
print STDOUT "Content-type: text/html\n\n"; 
print STDOUT "Hello, World."; 

我臨時分配一個殼了「阿帕奇」的用戶,切換到該用戶,並能夠運行多個這些腳本。當這種方式運行時,並不是所有產生有意義的輸出,但它們都運行。是的,/ usr/bin/perl確實存在,是系統上唯一的Perl副本,並且安裝了perl-CGI。

所有這些腳本都位於舊的和新的Web服務器使用的NFS共享上。舊的Web服務器仍然可以將這些腳本作爲CGI提供,而不會造成任何問題。所以如果還不清楚的話,這裏的問題不是CGI腳本本身。這是新的web服務器的配置問題。

NFS共享被掛載在/ mnt/cgi /和每個用戶的子目錄中。有包含在我們的Apache的配置文件中的部分看起來像這樣:

Alias /cgi-bin/usera /mnt/cgi/usera 
<Directory /mnt/cgi/usera> 
    Options +ExecCGI 
    AddHandler cgi-script .cgi .pl 
    Require all granted 
</Directory> 

此目錄中的腳本將在http://server.example.com/cgi-bin/usera/first.pl訪問。當我連接到這個頁面,這是附加到ServerLog中指定的日誌文件(用正確的IP地址......我XXX-ED者淘汰):

%% [Fri Nov 11 12:00:00 2016] GET /cgi-bin/usera/first.pl HTTP/1.1 
%% 500 /mnt/cgi/usera/first.pl 
%request 
Host: xxx.xxx.xxx.xxx 
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
DNT: 1 
Connection: keep-alive 
Via: 1.1 xxx.xxx.xxx.xxx:80 
X-Forwarded-For: xxx.xxx.xxx.xxx 
X-Forwarded-For-Port: 51380 
%response 

對這些腳本的權限都是755,所以這不是問題。如果我從腳本目錄的目錄定義中刪除了AddHandler行,那麼我可以下載腳本,所以Apache肯定能夠訪問它們。

新的服務器是RHEL7。 SELinux處於許可模式,不是強制執行。無論如何,布爾值httpd_enable_cgi和httpd_use_nfs都是「on」。

其中我試圖不利於事情是:

  • 設置 「的ScriptAlias/cgi-bin目錄/用戶A的/ mnt/CGI /用戶A」,而不僅僅是 「別名」。
  • 設置「ScriptAlias/cgi-bin// mnt/cgi」。一般來說,我們不希望使用ScriptAlias,因爲在這些目錄中還有文本數據文件。
  • 製作腳本所有者:group apache:apache。
  • 將「AllowOverride None」添加到目錄塊。
  • 添加「使用CGI :: Carp'fatalsToBrowser';」到腳本。這不會返回。再次,我認爲腳本運行正常,但輸出結果不被Apache以某種方式接收。

我還應該補充說,一般來說新的網絡服務器工作正常。基於PHP的webapps運行得很好,當然靜態內容也沒有問題。

所以這是很多細節,但最終的問題是這樣的:Apache如何執行CGI腳本,但根本沒有輸出?有什麼想法嗎?

回答

2

果然不會太長時間後,我問這個問題,我找到了答案。基本上,我們在配置文件中這一行這個網站:

RLimitMEM 2000000 3000000 

這限制了流程爲2MB(軟)和3MB(硬)的內存。對於CGI腳本來說也太少了。 50MB/80MB的工作。爲了以防萬一,我們將其設置得更高。

這裏是具有用於那些你的利益誰通過谷歌找到了這個網頁類似問題的人一些參考:

PHP out of memory error even though memory_limit not reached

http://www.wrensoft.com/forum/zoom-search-engine-v3-v4-v5-old-versions/29-php-cgi-script-returns-no-results-on-apache-rlimitmem-rlimitcpu

1

如果你的Perl腳本是

#!/usr/bin/perl 
print STDOUT "Content-type: text/html\n\n"; 
print STDOUT "Hello, World."; 

請嘗試刪除「STDOUT」從它。

+0

謝謝。我嘗試過,但沒有幫助。 無論哪種方式,這是一個基本的測試腳本,應該很容易成功。真正的問題更復雜。 –