Ich habe Apache2 mit PHP + PHP-FPM konfiguriert gemäß:
http://wiki.apache.org/httpd/PHP-FPM
Ich schreibe ein Skript, dessen Ausführung auf einem internen Vhost viel Zeit in Anspruch nimmt, aber es läuft immer wieder aus, wenn das Skript in weniger als 30 Sekunden ausgeführt wird, läuft alles einwandfrei.
Mein Apache-Log sagt mir:
[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:
Beim Versuch, das Skript auszuführen, erhalte ich eine 503 Service Unavailable
Ausführungszeit von genau 30 Sekunden. Logischerweise würde dies bedeuten, dass ich eine Timeout-Anweisung oder -Einstellung auf 30 Sekunden gesetzt habe, aber ich habe diese in der Konfiguration meines Vhost:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
(php-fpm läuft für mich auf Port 9001)
Ich habe auch versucht, die Timeout
und ProxyTimeout
in zu platzierenhttpd.conf
ohne Unterschied zu setzen.
Anscheinend gibt es irgendwo eine andere Timeout-Einstellung, die spezifisch ist mod_proxy_fcgi
, aber ich kann sie nicht finden. Ich habe den Apache2 httpd vom offiziellen Tarball installiert, keiner der Mods scheint mit irgendwelchen Konfigurationsdateien geliefert worden zu sein.
Wenn jemand mich in die richtige Richtung lenken kann, wäre er sehr dankbar.
quelle
Ich wollte darauf hinweisen, dass diese Antwort , obwohl sie für ältere Versionen hervorragend funktioniert, unter neueren Versionen von Apache 2.4 mit dem Fehlercode AH00526 funktioniert.
ProxyPass
undProxyPassMatch
oder<Proxy>
und<ProxyMatch>
können nicht zusammen mit demselben Arbeiternamen verwendet werden. Früher funktionierte das einwandfrei, daher weiß ich nicht, ob das durch das Design geändert wurde oder ob es sich um einen Fehler handelt.In beiden Fällen können Sie dies beheben, indem Sie nur einen ProxyPassMatch mit dem Parameter 'timeout = 120' verwenden (oder einen beliebigen gewünschten Wert), z. B .:
quelle
Ich habe Apache 2.4.6, aber der Patch, mit dem ich das Problem beheben kann, ist in Apache> = 2.4.8 enthalten. Der Schlüssel hier ist, Ihre Ausgabe sofort zu starten, damit Apache (mod_proxy_fcgi) denkt, dass die Verbindung aktiv ist.
Zum Beispiel verwende ich PHP und die DB-Abfrage für meinen AJAX-Aufruf dauert> 30 Sekunden. Da ich weiß, dass die allgemeine Antwort "Content-Type: application / json" lautet, sende ich diesen Header sofort.
quelle
Sollte das nicht sein:
Stellen Sie sicher, dass die php.ini-Einstellung max_execution_time ebenfalls auf 600 gesetzt ist. (Überprüfen Sie phpinfo () auf der Live-Seite, um sicherzustellen, dass Sie den tatsächlich verwendeten Wert sehen.)
Wie Jenny sagte, stelle die PHP-FPM-Einstellung ein
(Beachten Sie das s am Ende)
Wie Sie auf der Apache-Seite sehen können, müssen Sie nicht viel mit mod_proxy_fcgi selbst konfigurieren. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
Aktivieren Sie die PHP-FPM-Debug-Protokollierung, damit Sie sehen können, wo das Zeitlimit liegt. http://php-fpm.org/wiki/Configuration_File (auch catch_workers_output aktivieren)
Und aktivieren Sie die Debug-Level-Protokollierung für die Module mod_proxy und mod_proxy_fcgi, da Sie Apache 2.4 verwenden. Sehr nette Funktion, schalten Sie nur die Module ein, die Sie benötigen: http://httpd.apache.org/docs/current/mod/core.html#loglevel
Wenn das nicht hilft, poste deine PHP-FPM-Konfigurationsdatei.
Vielleicht beendet ein Dämon als letztes Mittel einen lang andauernden Prozess?
quelle
Ich habe festgestellt, dass Sie PHP-FPM verwenden. Ich benutze es auch, aber mit Apache 2.4.6.
Unter der Annahme , dass das Problem seit einiger Zeit existiert hat, so scheint es zu sein , dass für den Timeout - Wert
mod_proxy_fcgi
ist hart codiert . Ich habe aufgeschrieben, was ich hier gefunden habequelle
Da Sie die Zeitlimit-Einstellungen in Apache korrigiert haben, sollte dies nicht das Problem sein. Der zweite Ort, an dem Sie nachsehen müssen, ist jede Netzwerkausrüstung. Da Sie jedoch einen Proxy für Ihren eigenen Server einrichten, ist dies ebenfalls unwahrscheinlich. Der verbleibende Ort ist also der Backend-Server.
Suchen Sie nach der Konfigurationsdatei für php-pfm
Dies sollte mit der Zeitüberschreitungseinstellung in Apache identisch sein oder geringfügig darunter liegen.
quelle
request_terminate_timeout
mod_proxy_fcgi
Setzen Sie zusätzlich zum Timeout die Option "Enablereuse" auf "Off". Ich stellte fest, dass einige Anfragen nach lang laufenden Skripten korrekt funktionierten und andere vorzeitig beendet wurden.
quelle
Dieser Beitrag hat das Ganze für mich verändert.
Fügen Sie Ihrer httpd.conf- Datei die folgenden Zeilen hinzu :
quelle