Apache 2.4 Timeouts seit Serverumgebung 0.331

  • Mir ist bei einer PHP Applikation, wo relativ große Dateien hochgeladen werden, mit 0.331 aufgefallen dass es hier zu Timeouts kommt, die es vorher definitiv nicht gab. Die relevanten Limits in der php.ini sind in Ordnung und habe ich mittels phpinfo() geprüft.


    In der httpd.conf (sowie natürlich httpd24.conf-template) habe ich

    Timeout 9500

    (also ein defintiiv ausreichender Wert)


    Das CPU Limit des zugrundeliegenden Angebots war auch stets sehr hoch, habe ich jetzt mittlerweile sogar testweise auf 5.000 erhöht.


    Im Einsatz ist derzeit cgiwrap.


    Dennoch, wenn ich einen http Upload mit 100MB mache (was vorher jahrelang kein Problem war), bricht dieser ab. Im error_log erscheint


    Code
    1. [Tue Apr 16 10:12:41.176261 2019] [cgid:error] [pid 1928] (70007)The timeout specified has expired: [client 78.132.xx.xxx:38429] AH01270: Error reading request entity data, referer: https://server.com/filetest.php

    Welches Limit könnte hier noch zuschlagen?

  • Mal testweise auf PHP-FPM umgestellt statt cgiwrap, Fehlermeldung äußerst ähnlich, was mich vermuten lässt das das Timeout an dem es scheitert Apache 2.4 seitig ist.


    Code
    1. [Tue Apr 16 10:45:35.412981 2019] [proxy_fcgi:error] [pid 8597] (70007)The timeout specified has expired: [client 78.132.xx.xxx:13920] AH01075: Error dispatching request to : (reading input brigade),
  • Neue Erkenntnis:
    Das Problem besteht nach einem testweisen Umschalten auf Apache 2.2 nicht.


    Ich stelle daher mal vorsichtig die Behauptung auf, dass die aktuell enthaltene Apache 2.4 Version die Timeout Anweisung in der httpd.conf ignoriert. Es ist kein generelles 2.4 Problem, da das System auch schon vorher auf dem 2.4er Zweig lief ohne diese Probleme. Es muss mit der aktuellen 2.4 Version 2.4.39 zu tun haben.

  • tbc233

    Hat den Titel des Themas von „CGI Timeouts seit Serverumgebung 0.331“ zu „Apache 2.4 Timeouts seit Serverumgebung 0.331“ geändert.
  • Ist ggf. irgendwo "ProxyTimeout" definiert? Wenn nicht, sollte ProxyTimeout = Timeout sein.

    Auf die schnelle habe ich im Changelog zu Version 2.4.39 kein Anhaltspunkt zu möglichen Änderungen gefunden.


    Wurde einmal die Zeit bis zum Timeout gemessen? Also lässt das Zeitfenster bis zum Timeout verlässlich reproduzieren?


    Ansonsten würde ich den Prozess einmal beobachten und mit strace versuchen zu debuggen.

  • ProxyTimeout wird nicht verwendet. Ich hab das Problem (und dessen Beseitigung durch Rückschritt auf 2.2) auf zwei unterschiedlichen Servern reproduziert. Auch die Zeit nach der abgebrochen wurde, war stets in etwa die selbe, nämlich 45 Sekunden (witzigerweise exakt der in meinem Fall auskommentierte Defaultwert "Timeout 45").

  • Hier ist definitiv was im Busch.


    Eben musste ich einen anderen Server, der mit all dem bisherigen nichts zu tun hat, auch auf 2.2. rückstufen. Ein Kunde mit einer eher langsamen Internetverbindung konnte in seinen Wordpress Blog keine 12MB Datei hochladen. War bei ihm mit Teamviewer drauf - wieder in etwa die 45 Sekunden, dann Abbruch mit selber Meldung im error_log.


    Auf Apache 2.2 umgestellt und alles funktioniert.

  • Ausgangslage Centos7 mit Umgebung 0.331 und aktiviertem Apache 2.4. Habe Fehler heute nachvollzogen auf 3 verschiedenen pd-admin Installationen bei 2 verschiedenen Providern / Rechenzentren.


    Es muss ein http Upload provoziert werden, der zwar seitens aller relevanten Limits (cgi Limits, PHP max_upload_sitze, PHP post_max_size, apache Timeout in der httpd.conf) funktionieren müsste, aber dennoch länger als 45 Sekunden (sagen wir sicherheitshalber 60 Sekunden) dauert. Wenn die Internetverbindung des Clients zum Server sehr sehr gut ist, wird man den Fehler vielleicht nie bemerken.


    Konkreter Aufbau (zum Teil im Zuge des Testens absurd hohe Werte nachfolgend, ändert aber nichts am stets reproduzierbarem Verhalten):


    1) apache Timeout 4500 Sekunden (ggf anpassen in /usr/local/pd-admin2/httpd-2.4/conf/httpd24.conf-template , dann /opt/pdadmin/bin/httpd_vhosts.pl ausführen)


    2) cgi CPU Zeit des zugrundeliegenden Angebots auf 600 Sekunden


    3) zuständige php.ini: PHP max_upload_sitze auf 1024M, post_max_size ebenso


    4) Einen http Upload durchführen, der wie gesagt länger als 60 Sekunden dauert. In meinem Fall hier hat meine Internetanbindung um die 30Mbit Upload, da reicht ein 120MB File um den Fehler zu reproduzieren. Kleinere Files gehen problemlos und produzieren den Fehler nicht.


    5) Den Upload zum Beispiel mit wordpress "Mediathek" durchführen falls grad bei der Hand. Falls nicht, kann auch mein PHP Testskript anbei verwendet werden, mit dem kann ich den Fehler genauso jederzeit reproduzieren.


    6) Der Upload bricht ab, im Browser erscheint ein Verbindungsfehler. Im error_log erscheint "The timeout specified has expired..... Error reading request entity data".


    Umschalten auf Apache 2.2: Alles funktioniert.