Apache2 FastCGI Scripte brechen nach 40 Sekunden ab
Das Problem ist das länger laufende Scripte immer nach exakt 40 Sekunden abbrechen. Zum Beispiel bei längeren MySQL Befehlen in phpmyadmin hat es mich genervt. Diese musste ich schon oft auf der Console ausführen. Das erhöhen des IPCCommTimeout in der Config hat mir leider nicht geholfen, da es aktuell einen Bug gibt. Die Werte aus der Config werden in den vhost Containern wieder zurück gesetzt und das passiert für das ganze System. Die Lösung war dann recht einfach. Man lädt die Config in jedem vhost. Nicht nur in einem, sondern wirklich in jedem!
<VirtualHost *:80>
Include /etc/apache2/mods-available/fcgid.conf
</VirtualHost>
Nachdem man dies in jeden vhost eingetragen hat und man den IPCCommTimeout in der Config erhöht hat, muss man noch den apache neu starten.
$ apache2ctl configtest Syntax OK $ /etc/init.d/apache2 restart
Testen
Zum testen hier ein kleines PHP Script, das für 120 Sekunden schläft.
<?php echo 'start<br />'; $sleep = 120; echo $sleep . ' sleep<br />'; sleep($sleep); echo 'end<br />'; ?>
Ruft man es ohne diese Anpassungen auf, sollte nach 40 Sekunden ein Timeout kommen und man sieht einen 500 Fehler. In den Logfiles landen dann diese Fehler:
[warn] mod_fcgid: read data timeout in 40 seconds [error] [client 111.111.2.111] Premature end of script headers: test.php [warn] mod_fcgid: read data timeout in 40 seconds [error] [client 111.111.2.111] Premature end of script headers: test.php [warn] mod_fcgid: read data timeout in 40 seconds [error] [client 111.111.2.111] Premature end of script headers: test.php [warn] mod_fcgid: read data timeout in 40 seconds [error] [client 111.111.2.111] Premature end of script headers: test.php [warn] mod_fcgid: read data timeout in 40 seconds
Nach dem man den IPCCommTimeout in der Config hoch gesetzt hat und sie in jedem vhost geladen hat, sollte das Script durchlaufen. Ich schätze außerdem das dies nicht nur für den IPCCommTimeout aus der Config gilt, sondern auch bei anderen Settings. Hatte ich leider noch keine Zeit zu testen, wenn da jemand mehr weiß bitte hinterlasst mir ein Kommentar.
19 Kommentare
Commander1024
schrieb am 17.03.2010 um 16:05 Uhr
Komisches ding, der Parameter MaxProcessCount wurd auch ohne separaten Include im VHost ausgewertet, aber das 40Sek Timeout Problem hat Deine Methode behoben, jetzt meckert der wordpress beim Update auch nicht mehr. Thnx.
Mark Breyer
schrieb am 01.04.2010 um 15:05 Uhr
Hab selbst lange nach dem Problem gesucht, aber auf den include bin ich nicht gekommen. Hab es seit ca. einer Woche in Betrieb und seither keine Probleme mehr. Vielen Dank.
Flo
schrieb am 10.04.2010 um 10:31 Uhr
Ich kämpfe auch seit langem mit dem 40 Sekunden timeout. Bei mir habe ich IPCCommTimeout auf 360 gesetzt, der Server scheint die Einstellungen auch geschluckt zu haben, rufe ich über PHP den 120 Sekunden sleep auf, beendet das Programm und es gibt kein Timeout. Schaue ich jeodch in die Server logs taucht hier das Timeout 40 Problem fast jeden Tag auf, hervogerufen durch scripts die per cronjob gestartet werden.
Das verrückte daran jedoch ist, dass die cronjobs mit GET ‘url..’ augerufen werden, also nichts anderes als würde ich das Script per Browser aufrufen.
Hat jemand eine Idee woran das liegen könnte?
Flo
schrieb am 10.04.2010 um 10:50 Uhr
Ich habe noch einen Vhost Eintrag gefunden indem kein inlude der fcgid.conf enthalten war. Das hatte zwar nicht den Vhost betroffen in dem ich das Problem habe, aber kann es sein, dass dieser auch wenn hier gar keine Einstellungen zu fcgid festgelegt wurden die anderen dann auch zurücksetzt und es dann immer ein hin und her der fcgid einstellungen der anderen Vhost und diesem ist?
kostaki
schrieb am 10.04.2010 um 10:54 Uhr
Ich glaube schon. Geh am besten davon aus und trage die fcgid.conf in jeden vhost ein. Sollte keinen Negativen Effekt haben, aber dieser Bug scheint sich darauf zurück zu führen lassen. Seltsam ist es natürlich schon das es bei dir Teilweise funktioniert… Bei mir war es entweder immer oder gar nicht mehr. Hast du mal das Testscript per Crontab aufgerufen?
Der Adminblogger
schrieb am 21.04.2010 um 15:11 Uhr
Die “Lösung” von Dir funktioniert leider nicht.
Es ist richtig, dass beim Eintragen von IPCCommTimeout in den VirtualHost (oder bei dir das Inkludieren der fcgid.conf) der erste Request sich an diese Einstellung hält.
Ein IPCCommTimeout 200 z.b. bewirkt bei meinem Skript sleep(300); einen Abbruch nach 200 Sekunden. So steht es auch im error_log.
Anschließend wird der PHP-Prozess von Apache gekillt.
Rufe ich die Datei jetzt erneut auf, forkt Apache einen neuen PHP-Prozess, der allerdings wieder den einkompilierten Default-Wert von 40 Sekunden benutzt.
Eine Lösung mit dem libapache2-mod-fcgid aus lenny ist leider nicht in Sicht.
Gruß,
Marcel.
kostaki
schrieb am 21.04.2010 um 16:58 Uhr
Hi,
bist du dir sicher das du es in jeden Vhost eingetragen hast? Ich hab es gerade noch mal auf einem seit 2 Wochen laufenden Apache getestet und bei mir kommt dieser Fehler nicht vor. Das Script schläft 200 Sekunden und gibt mir dann die Ausgabe aus.
Gruß
kostaki
Der Adminblogger
schrieb am 22.04.2010 um 11:35 Uhr
Hi kostaki,
ich muss mich korrigieren – Du hast recht, es funktioniert.
Ich hatte es nur in einem Vhost drin und sobald einer der anderen Vhosts aufgerufen wurde, sind die Werte auf die Defaults zurückgesetzt worden.
Laut mehreren Berichten ist es auch unbedingt erforderlich, dass DefaultMinClassProcessCount in jeden Vhost gesetzt wird, sonst haben die Timeouts keine Wirkung (http://sourceforge.net/mailarchive/message.php?msg_name=20070516151638.13781e84.listen%40mjh.name)
Nachdem ich dann noch über https://bugs.launchpad.net/ubuntu/+source/libapache2-mod-fcgid/+bug/273388 gestolpert bin, habe ich es dann tatsächlich in *jeden* Vhost eingetragen und es funktioniert.
Laut http://svn.apache.org/viewvc/httpd/mod_fcgid/trunk/README-FCGID?view=log haben neuere Versionen von mod_fcgid nicht mehr das Problem, die Bugs sind offenbar gefixt worden.
Gruß,
Marcel.
kostaki
schrieb am 24.04.2010 um 10:17 Uhr
Schön das es nun funktioniert. Den Release von Squeeze kann ich auch kaum erwarten, aber bis dahin kann man sich mit dieser Lösung behelfen.
Gruß
kostaki
webby
schrieb am 08.07.2010 um 14:54 Uhr
Hallo, auch bei mir brechen einige skripte nach 40 sek ab und ich erhalte die selbe fehlermeldung im Log.
Ich habe keine “fcgi.conf” datei die ich in der VirtualHost includieren könnte.
Die entsprechende Konfiguration habe ich in httpd.conf reingeschrieben:
AddHandler fcgid-script .fcgi
SocketPath /tmp/fcgid_sock
IdleTimeout 3600
DefaultMinClassProcessCount 100
IPCConnectTimeout 400
Ist ein Include trotzdem noch notwendig damit ich das Problem mit den 40 sekunden lösen kann?
lg
Webby
webby
schrieb am 08.07.2010 um 15:16 Uhr
offenbar werden die sptizen klammern hier “gefressen”
am beginn der oben genannten Zeilen in httpd.conf steht noch:
IfModule mod_fcgid.c
bzw. am ende
IfModule
kostaki
schrieb am 08.07.2010 um 18:23 Uhr
Die fcgid Settings mussen nur in jedem vhost stehen. Ob das durch einen Include gemacht wird oder direkt eingetragen wird ist egal, es muss nur wirklich in jedem vhost passieren! Wenn man eh immer die gleichen haben will, bietet sich der Include natürlich an.
Erwin
schrieb am 07.11.2010 um 16:48 Uhr
Hurra !!!
Dieses Problem nervt mich seit ewigen Zeiten (fast 2Jahre)
Hatte mich damit abgefunden – aber immo kam es grad wieder hoch und ich hab Onkel G00gle gefragt und bämm – schon isses Geschichte.
Made my day !!!
Pangu
schrieb am 01.02.2012 um 18:26 Uhr
Auf Debian Squeeze 64bit mit Apache 2.2.16 und php 5.3.3 mit fcgid und suexec funzt das nicht. Wie muss denn die /etc/apache2/mods-available/fcgid.conf aussehen, bitte postet mal den Inhalt hier rein. Ich verwende wegen einer Apache-Sicherheitslücke Files Match in meiner vHost-Konfig. Meine vHost sieht so aus, und ich krieg immer noch 500er Fehler mit dem hier geposteteten Script-Test zum Checken des Timeouts.
ServerName defaultsite.localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/defaultsite
SuexecUserGroup phpfcgiuser phpfcgiuser
Options FollowSymLinks
AllowOverride None
FCGIWrapper /var/www/conf/fcgi-starter .php
SetHandler fcgid-script
Options +ExecCGI -Indexes
Order allow,deny
allow from all
AllowOverride All
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
Pangu
schrieb am 01.02.2012 um 18:42 Uhr
OH MANN! Ich hab den Fehler!! Hab vom Beitrag von (webby) weiter oben abgeschrieben
und der hatte drinstehen “IPCConnectTimeOut” dabei heißt es richtigerweise “IPCCommTimeout 400″
jetzt klappt’s auch mit dem test-script. DANKE!
Philipp Klaus
schrieb am 26.04.2012 um 17:16 Uhr
Hallo Pangu, danke für den Hinweis! Ich hatte es auch falsch abgeschrieben und wurde fast verrückt!
Gruß Philipp
Pangu
schrieb am 02.08.2012 um 11:20 Uhr
Übrigens: mit den neueren Versionen geht das ganz einfach, und zwar gibts dafür die FCGID Direktive “FcgidIOTimeout”
Beschreibung und Erklärung:
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidiotimeout
Um also das Timeout zu erhöhen, könnt ihr einfach direkt in /etc/apache2/mods-available/fcgid.conf die Zeile hinzufügen:
FcgidIOTimeout 300
Das erhöht dann den Timeout von den standardmässigen 40 sekunden auf 300 Sekunden.
Viele Grüße,
Pangu