Tengo Apache2 con PHP + PHP-FPM configurado de acuerdo con:
http://wiki.apache.org/httpd/PHP-FPM
Estoy escribiendo un script que tardará mucho tiempo en ejecutarse en un Vhost interno, pero se agota el tiempo de espera, todo funciona perfectamente si el script se ejecuta en menos de 30 segundos.
Mi registro de apache me 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:
Cuando trato de ejecutar el script, recibo 503 Service Unavailable
exactamente 30 segundos de tiempo de ejecución. Lógicamente, esto significaría que tengo una directiva de tiempo de espera o configuración establecida en 30 segundos, pero tengo estos en la configuración de mi 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 se está ejecutando en el puerto 9001 para mí)
También he intentado colocar el Timeout
y ProxyTimeout
en httpd.conf
sin diferencias.
Parece que hay otra configuración de tiempo de espera en algún lugar que es específica mod_proxy_fcgi
, pero no puedo encontrarla. Instalé el httpd de Apache2 desde el tarball oficial, ninguno de los mods parece haber venido con ningún archivo de configuración.
Si alguien puede señalarme en la dirección correcta, sería muy apreciado.
fuente
Quería señalar que, aunque esta respuesta funciona muy bien para versiones anteriores, se rompe con las versiones recientes de Apache 2.4 con el código de error AH00526.
ProxyPass
yProxyPassMatch
o<Proxy>
y<ProxyMatch>
no se pueden usar juntos dentro del mismo nombre de trabajador. Esto solía funcionar bien, así que no sé si eso fue cambiado por diseño o si es un error.De cualquier manera, puede solucionar esto utilizando solo un ProxyPassMatch con el parámetro 'timeout = 120' (o cualquiera que sea el valor deseado), por ejemplo:
fuente
Tengo Apache 2.4.6, pero el parche para solucionarlo se proporciona en Apache> = 2.4.8. La clave aquí es comenzar su salida inmediatamente para que Apache (mod_proxy_fcgi) piense que la conexión está activa.
Por ejemplo, estoy usando PHP y la consulta DB para mi llamada AJAX tarda> 30 segundos. Como sé que la respuesta general será "Tipo de contenido: aplicación / json", envío ese encabezado de inmediato.
fuente
¿No debería ser eso?
Asegúrese de que la configuración php.ini max_execution_time también esté establecida en 600. (revise phpinfo () en la página en vivo para asegurarse de que está viendo el valor real utilizado)
Como dijo Jenny, establezca la configuración php-fpm
(tenga en cuenta la s al final)
No hay mucho que configurar con mod_proxy_fcgi, como puede ver en la página de apache. http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
Active el registro de depuración php-fpm también para que pueda ver dónde se agota el tiempo. http://php-fpm.org/wiki/Configuration_File (también active catch_workers_output)
Y active el registro de nivel de depuración para los módulos mod_proxy y mod_proxy_fcgi ya que está usando apache 2.4. Muy buena característica, enciéndala solo para los módulos que necesita: http://httpd.apache.org/docs/current/mod/core.html#loglevel
Si eso no ayuda, publique su archivo de configuración php-fpm.
Como último recurso, ¿tal vez algún demonio está matando el proceso de larga ejecución?
fuente
Noté que estás usando PHP-FPM. Yo también lo uso, pero con Apache 2.4.6.
Suponiendo que el problema existe desde hace algún tiempo, parece ser que el valor de tiempo de espera
mod_proxy_fcgi
está codificado . Escribí lo que encontré aquífuente
Dado que ha arreglado la configuración de tiempo de espera en apache, ese no debería ser el problema. El segundo lugar para buscar sería cualquier equipo de red, pero dado que está utilizando su propio servidor, eso también es poco probable. Por lo tanto, el lugar restante para buscar es el servidor de fondo.
Ih el archivo de configuración para php-pfm, busque
Esto debe establecerse de la misma manera o un poco por debajo de la configuración de tiempo de espera en apache.
fuente
request_terminate_timeout
a 400, todavía no hay cambios :( Tengo la sensación de que hay algo que necesito configurarmod_proxy_fcgi
, pero no parece venir con ningún archivo de configuración.Además del tiempo de espera, configure enablereuse = off. Encontré que cuando estaba en algunas solicitudes, los scripts de larga ejecución funcionarían correctamente y otros serían asesinados antes.
fuente
Esta publicación cambió todo el trato para mí.
Agregue las siguientes líneas a su archivo httpd.conf :
fuente