Error 500 por Timeout

Supongo que la mayoría de nosotros se ha encontrado con una aplicación, un plugin o una acción de su pagina web que daba un molesto error 500, debido a que el tiempo que necesitaba PHP para realizar la acción, excedía del tiempo máximo configurado.

Normalmente ocurre para acciones que nos son de ejecución diaria, en Prestashop, alguna acción que deba recorrer la base de datos, en WordPress, muchas acciones de mantenimiento…..

La solucion completa y real, pasa por analizar el motivo de que dicho script este tardando tanto, e incluso, si es necesario, podemos y sabemos, modificar dicha pagina para que se vaya llamando cada 30 segundos, autopasandose el avance que lleva hecho, hasta completar el trabajo; eso hará que el script se mantenga dentro de los 30 segundos que normalmente tenemos como tiempo estándar.

Sin embargo, y cuando sea algo que no se ha de utilizar a diario, podemos modificar temporalmente el tiempo que autorizamos al script a funcionar, y luego de realizar la accion, volverlo a dejar como estaba.

La ultima vez que me encontré con el problema, fue sincronizando mis usuarios con los usuarios de MailRelay, con un plugin que facilita esa empresa, y que para mis 1200 usuarios, tardaba mas de 6 minutos. (Otro día hablaremos de lo que opino)

El caso es que queria probar sus servicios, y para eso necesitaba traspasarle los usuarios, y cada vez que lo intentaba, recibía un bonito error 500, y la ayuda de ellos fue clara…

Es por un timeout

Ante ese derroche de generosidad, inteligencia y ganas de ayudar, me puse a buscar soluciones y encontré esta que comparto hoy.

Para un administrador de Linux, la opción pasa por localizar el fichero php.ini , y si está utilizando “fastcgi”, encontrar también su fichero de configuracion, y alli modificar las variables que controlan el timeout:

max_execution_time = 0
max_input_time = 120n

y posteriormente, modificar la configuración de FastCGI (si lo estas utilizando

FcgidProcessLifeTime 8200
FcgidIOTimeout 8200
FcgidConnectTimeout 400
FcgidMaxRequestLen 1000000000
FcgidBusyTimeout 3600

Indudablemente, la mejor opción, pero…..

Si tu control de Linux no es demasiado amplio y has instalado virtualmin en tu servidor, tienes otra opción bastante más sencilla:

Abres tu Virtualmin, te situas en el web sobre el que necesitas actuar, y seleccionas “Server Configuration” -> “Website Options”PHP-Modificandotimeout

Alli, puedes modificar el tiempo que crees puede utilizar la acción, o dejarlo como ilimitado.

Una vez realizada la acción, te aconsejo que lo dejes como estaba, o como máximo, aumentando el tiempo hasta 60 segundos.

Virtualmin se encargará de modificar los ficheros necesarios, y reiniciar Apache para que recoja los cambios.

Si, por el contrario tienes instalado cPanel, te recomiendo que leas este articulo que te explica como solucionarlo, modificando la configuracion de Apache desde WHM:

http://www.heath-whyte.info/david/computers/mod_fcgid-timeouts-and-downloads

Y que seria añadiendo estas lineas:

# Set a maximum number of requests a process will handle,
# then it'll die
# this is just to keep memory cleaned up
# somewhere I've read that a php process will die after 500,
# whatever you set here
# but you need to set 500 here as well!
    FcgidMaxRequestsPerProcess 500
#
# These two govern how many processes are created, 
# but I'm using defaults so I've commented them out
#   FcgidMaxProcesses            6
#   FcgidMaxProcessesPerClass    6
#
# What's the least number of processes for a class?
# not sure what a 'class' is, but set this zero
# to enable processes to be killed off
    FcgidMinProcessesPerClass    0
#
# Now some idle settings
#
# Scan interval, fairly straight forward – how often it checks 
    FcgidIdleScanInterval       30
#
# How long should a process be idle for before we kill it?
    FcgidIdleTimeout           300
#
# How old do you want processes to get?
# Once they get to this number, they'll be killed once they're 
# idle, regardless of FcgidIdleTimeout
# its another way of doing what FcgidMaxRequestsPerProcess does, 
# but with time instead of requests
    FcgidProcessLifeTime      3600
#
# What about a process waiting for a connection to be made?
    FcgidConnectTimeout        100
#
# And this is a timer for a script that has connected, 
# but is waiting for input/output to happen,
# like a script waiting for an upload
    FcgidIOTimeout             600
#
# a FastCGI application will be killed after handling
# a request for FcgidBusyTimeout
# This is the one that kills long downloads
# - the download is busy, but waiting, so it times-out
    FcgidBusyTimeout          3600
#
# This is self-explanatory, the interval that 'busy' is checked
    FcgidBusyScanInterval      120
#
# And last, but not least, the size of requests that can be made
# needs to be bigger than any upload you want to do
    FcgidMaxRequestLen   100000000

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Desarrollo Web, PHP y MySQL/MariaDB, Prestashop y etiquetada , . Guarda el enlace permanente.

Deja un comentario