FCGI „Premature end of script headers“ und die Lösung

Gott, hab ich mich geärgert!

Es gibt alle möglichen Gründe für CGI und besonders FastCGI statt den Apache PERL und PHP Modulen die ich hier nicht erörtern will, die, die es brauchen wissen warum und den anderen ist es egal 🙂

Aber was ich aufschreiben möchte, sind die Sachen die ich mit google nicht finden konnte. Die üblichen Anleitungen schweigen sich über ein paar Fehlerquellen und besonders über die Fehlersuche aus.
Ich hoffe, es hilft jemandem.

Nachdem FCGI und der Script Wrapper für PHP eingerichtet und der Apache neu gestartet ist, wird man von einem Fehler 500 begrüßt, na toll! Der erste Blick geht also ins error_log vom virtuellen Server und da steht nicht viel hilfreiches, nur

[Mon Aug 01 17:13:19 2011] [error] [client 66.249.72.207] Premature end of script headers: php.fcgi

php-cgi von Hand aufrufen funktioniert, der Wrapper ist auch richtig, die php.ini ist wo sie sein soll. Im error_log vom Apache findet sich dann schon mehr, aber auch nicht wirklich hilfreich

[Mon Aug 01 17:13:25 2011] [notice] mod_fcgid: process /var/www/testserver/
cgi-bin/php.fcgi(3440) exit(communication error), terminated by calling exit(),
return code: 114

Ich hab dann einfach ein grep auf php.fcgi gemacht und was passendes im suexec_log gefunden

[2011-08-01 17:13:19]: uid: (501/testuser) gid: (504/504) cmd: php.fcgi
[2011-08-01 17:13:19]: command not in docroot (/var/www/testserver/cgi-bin/php.fcgi)
 Da ging der Ärger los! Ich hab ewig gebraucht bis ich dahinter kam, dass docroot bei suexec nur indirekt mit DocumentRoot vom Apache zu tun hat! Je nachdem mit welchen Optionen suexec compiliert wurde, ist docroot ein bestimmtes Unterverzeichnis vom DocumentRoot des virtuellen Servers. Wenn man das nicht selbst kompiliert hat, dann ist die einfachste Methode herauszufinden wo das denn nun liegen soll suexec -V als root auszuführen

 

-D AP_DOC_ROOT="/home"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"
Es ist also /home und zwar das DocumentRoot aus dem virtuellen Server und da home. In meinem Fall also /var/www/testserver/home.  Ich hab also meinen fcgiWrapper php.fcgi in das neu erstellte Unterverzeichnis geschoben und meine Webseite lief!  

Schreibe einen Kommentar