Frage Apache2-Proxy-Zeitüberschreitung


Ich habe Apache2 mit PHP + PHP-FPM konfiguriert nach:

http://wiki.apache.org/httpd/PHP-FPM

Ich schreibe ein Skript, das lange dauern wird, um auf einem internen Vhost ausgeführt zu werden, aber das Zeitlimit bleibt bestehen, alles läuft einwandfrei, wenn das Skript in weniger als 30 Sekunden ausgeführt wird.

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:

Wenn ich versuche, das Skript auszuführen, bekomme ich eine 503 Service Unavailable nach genau 30 Sekunden Ausführungszeit. Logischerweise würde dies bedeuten, dass ich eine Timeout-Anweisung oder Einstellung auf 30 Sekunden gesetzt habe, aber ich habe diese in meiner Vhost-Konfiguration:

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 auf Port 9001 für mich)

Ich habe auch versucht, die Timeout und ProxyTimeout im httpd.conf ohne Unterschied.

Anscheinend gibt es irgendwo noch eine andere Zeitüberschreitungseinstellung mod_proxy_fcgiaber ich kann es nicht finden. Ich habe den Apache2 httpd aus dem offiziellen Tarball installiert, keiner der Mods scheint mit irgendwelchen Konfigurationsdateien zu kommen.

Wenn mir jemand in die richtige Richtung weist, wäre das sehr zu begrüßen.


18
2018-04-18 05:11


Ursprung




Antworten:


Ich habe dieses Problem nach dem Testen einiger Konfigurationsparameter behoben. Ich habe die Lösung zweimal getestet und alle vorherigen Änderungen entfernt. Nur ein Parameter wurde benötigt, um es zu beheben.

Für die neuesten Versionen von httpd und mod_proxy_fcgi können Sie einfach hinzufügen timeout= bis zum Ende der ProxyPassMatch Linie, z.B.

ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800

Für ältere Versionen war es etwas komplizierter, z.

<Proxy fcgi://127.0.0.1:9000>
  ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1

Ich musste die Proxy-Anweisung hinzufügen, um das Timeout auf 30 Minuten zu setzen. In einigen Anwendungen gibt es normalerweise beim Ausführen einer Datenbank Routinen, deren Ausführung mehr als 10 Minuten dauern kann. Ich habe das Timeout vorübergehend auf 30 Minuten eingestellt, um sicherzustellen, dass sie beendet werden. Besonders nützlich bei der Verwendung des Installationsassistenten, der (meiner bescheidenen Meinung nach) zu viel Zeit in Anspruch nimmt.

Nebenbei bemerkt wurde der anfängliche Input, der mir half, dieses Problem zu lösen, im Folgenden gefunden URL-Adresse.


26
2018-05-08 10:10



Es sieht so aus, als wäre dies unter den letzten Versionen von Apache, AH00526, kaputt gegangen: ProxyPass / <Proxy> und ProxyPassMatch / <ProxyMatch> können nicht mit dem gleichen Worker-Namen verwendet werden - Stewart Adam
Ich habe das obige Problem gelöst, indem ich am Ende der ProxyPassMatch-Zeile einen Parameter 'timeout = 120' hinzugefügt habe. - Stewart Adam
@Palantir froh, es zu hören! Als Antwort eingereicht. - Stewart Adam
Zwei weitere Dinge, die ich brauchte: Zuerst müssen Sie "Timeout" und "ProxyTimeout" in Ihrer globalen Apache-Konfigurationsdatei länger einstellen als die anderen FPM-Timeouts. Zweitens: Mein FPM-Pool hat auf einem Unix-Socket gelauscht, und ich verwende SetHandler wie folgt: [SetHandler "proxy: unix: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // localhost: 8000 "]. Aber <Proxy> passt auf den fcgi: // localhost-Teil der SetHandler-Zeile (der Teil NACH dem | ..., der nicht einmal tatsächlich verwendet wird!) Und NICHT auf den Unix: / var / run / part. So konfigurieren Sie Timeouts für die obige Verwendung: <Proxy fcgi: // localhost: 8000> und nicht <Proxy unix: / var / run / ... - Professor Falken


Ich wollte darauf hinweisen, obwohl diese Antwort funktioniert gut für ältere Versionen, es bricht unter den letzten Versionen von Apache 2.4 mit Fehlercode AH00526. ProxyPass und ProxyPassMatch oder <Proxy> und <ProxyMatch> kann nicht zusammen mit demselben Namen verwendet werden. Das funktionierte früher gut, also weiß nicht, ob das von Design geändert wurde oder ob es ein Bug ist.

In jedem Fall können Sie dies beheben, indem Sie nur einen ProxyPassMatch mit dem Parameter 'timeout = 120' (oder was auch immer Ihr gewünschter Wert ist) verwenden, z.

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120

8
2018-06-11 00:53





Ich habe Apache 2.4.6, aber die patch zu beheben ist in Apache> = 2.4.8 vorgesehen. Der Schlüssel hier ist zu Start Ihre Ausgabe sofort, so dass Apache (mod_proxy_fcgi) denkt, dass die Verbindung aktiv ist.

Zum Beispiel verwende ich PHP und die DB-Abfrage für meinen AJAX-Anruf dauert> 30 Sekunden. Da ich weiß, dass die allgemeine Antwort "Content-Type: application / json" sein wird, sende ich diesen Header sofort.

#1: Start output immediately
#Note: Sending the header is innocuous
#   it can be changed later using the $replace parameter
#   (see #3)
header( 'Content-Type: application/json' );

#2: Run slow query
mysql_query( "SELECT * FROM giant_table" );

#3: Change header as needed
header( 'Content-Type: application/csv', true );

#output content

6
2018-01-05 04:53





Sollte das nicht sein:

<IfModule mod_proxy.c>

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

request_terminate_timeout 610s

(Beachten Sie die s am Ende)

Es gibt nicht viel zu konfigurieren mit mod_proxy_fcgi selbst, wie Sie auf der Apache-Seite sehen können. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

Aktivieren Sie auch die php-fpm Debug-Protokollierung, damit Sie sehen können, wo die Zeit abläuft. http://php-fpm.org/wiki/Configuration_File (Aktivieren Sie catch_workers_output)

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 für die Module ein, die Sie benötigen: http://httpd.apache.org/docs/current/mod/core.html#loglevel

Wenn diese nicht helfen, poste deine php-fpm Konfigurationsdatei.

Als letzten Ausweg, vielleicht tötet ein Daemon einen lang andauernden Prozess?


2
2018-04-19 03:08





Ich habe festgestellt, dass Sie PHP-FPM verwenden. Ich benutze es auch, aber mit Apache 2.4.6.

Vorausgesetzt, dass das Problem seit einiger Zeit besteht, scheint es, dass der Timeout-Wert für mod_proxy_fcgi ist hart codiert. Ich habe aufgeschrieben, was ich gefunden habe Hier


2
2018-03-19 21:51





Da Sie die Timout-Einstellungen in Apache korrigiert haben, sollte das nicht das Problem sein. Der zweite Ort, an dem Sie suchen sollten, wären Netzwerkgeräte, aber da Sie sich auf Ihren eigenen Server bewerben, ist das auch unwahrscheinlich. Der verbleibende Ort ist also der Backend-Server.

Ih die Konfigurationsdatei für PHP-pfm, suchen Sie nach

; This is a hard kill switch on php execution.  It ignores the
; max_execution_time that can be set/changed with php_ini.  Basically
; it avoids timeout issues between apache and php-fpm.
request_terminate_timeout=30

Dies sollte gleich oder etwas unterhalb der Zeitlimiteinstellung in Apache eingestellt werden.


1
2018-04-18 09:23



Ich habe das eingestellt request_terminate_timeout bis 400, immer noch keine Veränderung :( Ich habe das Gefühl, dass ich etwas einstellen muss mod_proxy_fcgi, aber es scheint nicht mit Konfigurationsdateien zu kommen. - wyqydsyq


Stellen Sie enableuruse = off zusätzlich zum Timeout ein. Ich fand, wenn es auf einige Anfragen zu lang laufenden Skripten war, würde richtig funktionieren und andere würden früh getötet werden.


0
2018-05-12 14:10