Premature,英文解釋, 過早的。
Premature end of script headers 也就是cgi執行過早的結束了。通常這是因為CGI程序有問題,未能按照格式正確的打印完畢,就結束了。所以會報錯。
但是 今天遇到一個很奇怪的問題。開發,測試環境中,某CGI運行正常,一到運營環境就報錯:Premature end of script headers .
但是的邏輯就是,為什么程序沒有變,但卻運行突然出錯了。而且一開始的時候,還能夠運行。突然就報錯。也沒有人修改過程序,嘗試重新編譯,結果仍然一樣報錯。
后來查看cgi應用日志,發現打印了一串錯誤信息,報讀取配置文件失敗。
才恍然大悟。 cgi 在沒有變更的情況下,突然無法執行的原因如下:
1 應用日志報 讀取XX.conf配置文件失敗。 因為之前配置文件一直讀取正常,所以CGI也運行正常。
但是現在配置文件無法讀取了,cgi打印了錯誤到頁面上,此段代買存在一定的問題,導致頁面無法現顯示,報Premature end of script headers .
2 為什么conf文件突然無法顯示了呢? 因為在suse服務器下,文件的權限默認都很少。 apache以nobody用戶運行,本來沒事。 因為文件數組也改成Nobody了。但是上服務器修改了某配置,保存。這配置文件編程了root ,導致該文件無法被以Nobody用戶起的apache讀取,報錯。
而報錯信息這一分支顯然沒有經過仔細的測試,存在問題。導致報Premature end of script headers。
所以,當程序都沒有動過的時候,突然出現異常。我們就應該考慮,程序是否因為某種原因,走到了某一個特殊的分支,導致出錯。此時,詳細的應用日志,能給定位問題帶來巨大的方便。
-------------------------------------
現狀:
當使用Apache(或其他web server,例如lighttpd),以及fastcgi(或cgi)等來部署rails或python等時,經常會出現以下錯誤:
Premature end of script headers: dispatch.fcgi
解決方案:
本解決方案是基於Rails+Apache+fastcgi+debian,其他類似。
- 檢查dispatch.fcgi的用戶或用戶組,以及訪問權限,至少定義為755.
- 檢查dispatch.fcgi的第一行的ruby編譯器是否正確,很多人開發在windows平台上,而部署則在Linux/Unix平台上, 所以將#!C:/ruby.exe改為# !/usr/bin/ruby。ruby具體在什么位置,輸入whereis ruby即可。
- 不能允許有打印的代碼。例如在rails里,堅決不要將p 或puts寫到代碼里,這樣會導致header破壞。其他語言看着辦。
- 如果以上方案均為解決,到dispatch所在的目錄下運行 ./dispatch.fcgi看是否正確。如果有什么錯誤的話,修正即可。
