Premature end of script headers 的原因


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看是否正確。如果有什么錯誤的話,修正即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 premature end of file openstack安裝dashboard后訪問horizon出錯 End of script output before headers: django.wsgi 微信公眾平台 Premature end of file Error on line -1 of document : Premature end of file. Nested exception: Premature end of file. Caused by: org.xml.sax.SAXParseException: Premature end of file. provisional headers are shown 原因分析 解決 org.apache.http.ConnectionClosedException: Premature end of chunk coded message body: closing chunk expected 由Premature end of Content-Length delimited message body因發的問題排查