Timeout proxy Apache2


23

Ho Apache2 con PHP + PHP-FPM configurato secondo:

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

Sto scrivendo uno script che richiederà molto tempo per essere eseguito su un Vhost interno, ma continua a scadere, tutto funziona perfettamente se lo script viene eseguito in meno di 30 secondi.

Il mio registro di Apache mi dice:

[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:

Quando provo a eseguire lo script mi ​​viene dato un 503 Service Unavailableesatto tempo di esecuzione dopo 30 secondi. Logicamente questo significherebbe che ho una direttiva di timeout o un'impostazione impostata su 30 secondi, ma li ho nella configurazione del mio 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 è in esecuzione sulla porta 9001 per me)

Ho anche provato a posizionare Timeoute ProxyTimeoutin httpd.confsenza alcuna differenza.

Sembra che ci sia un'altra impostazione di timeout in un posto specifico mod_proxy_fcgi, ma non riesco a trovarlo. Ho installato Apache2 httpd dal tarball ufficiale, nessuna delle mod sembra essere arrivata con alcun file di configurazione.

Se qualcuno può indicarmi la giusta direzione, sarebbe molto apprezzato.

Risposte:


32

Ho finalmente risolto questo problema dopo aver testato diversi parametri di configurazione. Ho provato la soluzione due volte, rimuovendo tutte le modifiche precedenti. Era necessario solo un parametro per risolverlo.

Per le ultime versioni di httpd e mod_proxy_fcgi puoi semplicemente aggiungere timeout=alla fine della ProxyPassMatchriga, ad esempio:

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

Per le versioni precedenti era un po 'più complicato, ad esempio:

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

Avevo bisogno di aggiungere la direttiva Proxy per impostare il timeout su 30 minuti. In alcune applicazioni, in genere quando si utilizza il database, ci sono routine che possono richiedere più di 10 minuti per l'esecuzione. Ho impostato temporaneamente il timeout su 30 minuti per assicurarmi che finissero. Particolarmente utile quando si utilizza la procedura guidata di installazione, che richiede troppo tempo (a mio modesto parere).

A proposito, l'input iniziale che mi ha aiutato a risolvere questo problema è stato trovato nel seguente indirizzo URL .


1
Sembra che questo si sia rotto con le ultime versioni di Apache, AH00526: ProxyPass / <Proxy> e ProxyPassMatch / <ProxyMatch> non possono essere usati del tutto con lo stesso nome lavoratore
Stewart Adam

4
Ho risolto quanto sopra aggiungendo un parametro 'timeout = 120' alla fine della riga ProxyPassMatch.
Stewart Adam,

@Palantir felice di sentirlo! Presentato come risposta .
Stewart Adam,

Altre due cose di cui avevo bisogno: in primo luogo, è necessario impostare "Timeout" e "ProxyTimeout" nel file di configurazione globale di Apache in modo che sia più lungo degli altri timeout FPM. In secondo luogo, il mio pool FPM era in ascolto su un socket unix e uso SetHandler in questo modo: [SetHandler "proxy: unix: /var/run/php/example.com-php7.0-fpm.sock | fcgi: // localhost: 8000 "]. Ma <Proxy> corrisponde alla parte fcgi: // localhost della linea SetHandler (la parte DOPO la | ... che non è nemmeno effettivamente usata!) E NON l'unix: / var / run / part. quindi per configurare i timeout per l'uso sopra: <Proxy fcgi: // localhost: 8000> e non <Proxy unix: / var / run / ...
Professor Falken,

9

Volevo sottolineare che, sebbene questa risposta funzioni perfettamente per le versioni precedenti, si interrompe nelle versioni recenti di Apache 2.4 con codice di errore AH00526. ProxyPasse ProxyPassMatcho <Proxy>e <ProxyMatch>non può essere utilizzato insieme con lo stesso nome lavoratore. Questo funzionava bene, quindi non so se è stato modificato dal design o se si tratta di un bug.

In entrambi i casi, è possibile risolvere questo problema utilizzando solo ProxyPassMatch con il parametro 'timeout = 120' (o qualunque sia il valore desiderato), ad esempio:

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

6

Ho Apache 2.4.6, ma la patch per risolverlo è fornita in Apache> = 2.4.8. La chiave qui è avviare immediatamente l'output in modo che Apache (mod_proxy_fcgi) pensi che la connessione sia attiva.

Ad esempio, sto usando PHP e la query DB per la mia chiamata AJAX richiede> 30 secondi. Poiché so che la risposta generale sarà "Content-Type: application / json", invio immediatamente quell'intestazione.

#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

2

Non dovrebbe essere:

<IfModule mod_proxy.c>

Assicurati che l'impostazione php.ini max_execution_time sia impostata anche su 600. (controlla phpinfo () sulla pagina live per assicurarti di vedere il valore effettivo utilizzato)

Come ha detto Jenny, imposta l'impostazione php-fpm

request_terminate_timeout 610s

(nota la s alla fine)

Non c'è molto da configurare con mod_proxy_fcgi stesso, come puoi vedere nella pagina apache. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html

Attiva anche la registrazione di debug di php-fpm in modo da poter vedere dove passa. http://php-fpm.org/wiki/Configuration_File (attiva anche catch_workers_output)

E attiva la registrazione a livello di debug per i moduli mod_proxy e mod_proxy_fcgi poiché stai usando apache 2.4. Funzionalità molto bella, accendi solo per i moduli di cui hai bisogno: http://httpd.apache.org/docs/current/mod/core.html#loglevel

Se quelli non ti aiutano, pubblica il tuo file di configurazione php-fpm.

Come ultima risorsa, forse un demone sta uccidendo un processo di lunga durata?


2

Ho notato che stai usando PHP-FPM. Anch'io lo uso, ma con Apache 2.4.6.

Supponendo che il problema esista da un po 'di tempo, sembra che il valore di timeout per mod_proxy_fcgisia hard coded . Ho scritto quello che ho trovato qui


1

Dal momento che hai corretto le impostazioni di timout in apache, questo non dovrebbe essere il problema. Il secondo posto in cui cercare sarebbe qualsiasi apparecchiatura di rete, ma dal momento che stai eseguendo il proxy al tuo server, è anche improbabile. Quindi il posto rimanente da guardare è il server back-end.

Ih il file di configurazione per php-pfm, cerca

; 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

Deve essere impostato uguale o leggermente al di sotto dell'impostazione di timeout in apache.


1
Ho impostato il valore request_terminate_timeout400, ancora nessun cambiamento :( Ho la sensazione che ci sia qualcosa per cui devo impostare mod_proxy_fcgi, ma non sembra venire con nessun file di configurazione.
wyqydsyq,

0

Oltre al timeout, imposta enablereuse = off. Ho scoperto che quando su alcune richieste gli script a lungo funzionavano correttamente e altri sarebbero stati uccisi presto.


0

Questo post ha cambiato l'intero affare per me.

Sembra che il mod_reqtimeout di Apache non utilizzi il valore predefinito.

Aggiungi le seguenti righe al tuo file httpd.conf :

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.