Mam Apache2 z PHP + PHP-FPM skonfigurowany zgodnie z:
http://wiki.apache.org/httpd/PHP-FPM
Piszę skrypt, który będzie długo działał na wewnętrznym Vhostie, ale wciąż mija limit czasu, wszystko działa bezbłędnie, jeśli skrypt wykona się w czasie krótszym niż 30 sekund.
Mój dziennik Apache mówi mi:
[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:
Podczas próby uruchomienia skryptu dostaję 503 Service Unavailable
dokładnie 30 sekund czasu wykonania. Logicznie oznaczałoby to, że mam dyrektywę lub ustawienie limitu czasu ustawione na 30 sekund, ale mam je w konfiguracji mojego Vhosta:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
(php-fpm działa dla mnie na porcie 9001)
Próbowałem również umieszczenie Timeout
i ProxyTimeout
w httpd.conf
bez różnicy.
Wygląda na to, że istnieje inne ustawienie limitu czasu, które jest specyficzne mod_proxy_fcgi
, ale nie mogę go znaleźć. Zainstalowałem httpd Apache2 z oficjalnego tarballa, żaden z modów nie wydaje się mieć żadnych plików konfiguracyjnych.
Byłbym bardzo wdzięczny, gdyby ktokolwiek mógł skierować mnie w dobrym kierunku.
źródło
Chciałem zauważyć , że chociaż ta odpowiedź działa świetnie w starszych wersjach, psuje się w ostatnich wersjach Apache 2.4 z kodem błędu AH00526.
ProxyPass
iProxyPassMatch
lub<Proxy>
i<ProxyMatch>
nie mogą być używane razem w ramach tego samego nazwiska pracownika. Kiedyś działało dobrze, więc nie wiem, czy zostało to zmienione projektowo, czy jest to błąd.Tak czy inaczej, możesz to naprawić tylko przy użyciu ProxyPassMatch z parametrem „timeout = 120” (lub dowolną pożądaną wartością), np .:
źródło
Mam Apache 2.4.6, ale łatka do naprawy jest dostępna w Apache> = 2.4.8. Kluczem tutaj jest natychmiastowe uruchomienie danych wyjściowych, aby Apache (mod_proxy_fcgi) uznał, że połączenie jest aktywne.
Na przykład używam PHP, a zapytanie DB dla mojego wywołania AJAX zajmuje> 30 sekund. Ponieważ wiem, że ogólną odpowiedzią będzie „Content-Type: application / json”, natychmiast przesyłam ten nagłówek.
źródło
Czy nie powinno to być:
Upewnij się, że ustawienie php.ini max_execution_time jest również ustawione na 600. (sprawdź phpinfo () na stronie na żywo, aby upewnić się, że widzisz rzeczywistą zastosowaną wartość)
Jak powiedziała Jenny, ustaw ustawienie php-fpm
(zwróć uwagę na s)
Jak widać na stronie apache, niewiele można skonfigurować za pomocą samego mod_proxy_fcgi. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
Włącz rejestrowanie debugowania php-fpm, abyś mógł zobaczyć, gdzie się tam kończy. http://php-fpm.org/wiki/Configuration_File (również włącz catch_workers_output)
I włącz rejestrowanie na poziomie debugowania dla modułów mod_proxy i mod_proxy_fcgi, ponieważ używasz Apache 2.4. Bardzo fajna funkcja, włącz tylko te moduły, których potrzebujesz: http://httpd.apache.org/docs/current/mod/core.html#loglevel
Jeśli to nie pomoże, opublikuj plik konfiguracyjny php-fpm.
W ostateczności może jakiś demon zabija długotrwały proces?
źródło
Zauważyłem, że używasz PHP-FPM. Ja też go używam, ale z Apache 2.4.6.
Zakładając, że problem istnieje od jakiegoś czasu, wydaje się, że wartość limitu czasu dla
mod_proxy_fcgi
jest zakodowana na stałe . Zapisałem to, co tu znalazłemźródło
Ponieważ naprawiłeś ustawienia limitu czasu w Apache, nie powinno to stanowić problemu. Drugim miejscem do obejrzenia jest każdy sprzęt sieciowy, ale ponieważ jesteś proxy do własnego serwera, jest to również mało prawdopodobne. Pozostałym miejscem do obejrzenia jest serwer zaplecza.
Ih plik konfiguracyjny dla php-pfm, poszukaj
Powinno to być ustawione tak samo lub nieco poniżej limitu czasu w Apache.
źródło
request_terminate_timeout
na 400, wciąż bez zmian :( Mam wrażenie, że jest coś, co muszę ustawićmod_proxy_fcgi
, ale nie wydaje się, aby pochodziło z żadnymi plikami konfiguracyjnymi.Oprócz limitu czasu ustaw enablereuse = off. Przekonałem się, że w przypadku niektórych żądań długo działające skrypty działałyby poprawnie, a inne zostały zabite wcześnie.
źródło
Ten post zmienił dla mnie całą ofertę.
Dodaj następujące wiersze do pliku httpd.conf :
źródło