¿Cómo puedo solucionar los errores 504 devueltos al utilizar un equilibrador de carga clásico?

4 minutos de lectura
0

Recibo errores HTTP 504 en los registros de acceso del equilibrador de carga clásico, en las métricas de Amazon CloudWatch o al conectarme al servicio a través de un equilibrador de carga clásico.

Resolución

Un error HTTP 504 es un código de estado HTTP que indica que se ha agotado el tiempo de espera de una puerta de enlace o un proxy. Al solucionar problemas, investigue lo siguiente:

Comprobación del tiempo de inactividad del equilibrador de carga y modificación en caso necesario

El motivo más común de los errores HTTP 504 es que la instancia correspondiente no responda a la solicitud dentro del tiempo de espera de inactividad configurado. De forma predeterminada, el tiempo de espera del equilibrador de carga clásico es de 60 segundos.

Si las métricas de CloudWatch están activadas, compruebe las métricas de CloudWatch para el equilibrador de carga. Cuando los puntos de datos de latencia son iguales al valor de tiempo de espera del equilibrador de carga configurado y HTTPCode_ELB_5XX tiene puntos de datos, se ha agotado el tiempo de espera de al menos una solicitud.

Para resolver este problema, puede hacer una de estas dos cosas:

  • Modificar el tiempo de espera de inactividad del equilibrador de carga para que la solicitud HTTP pueda completarse dentro del periodo de tiempo de espera de inactividad.
  • Ajustar la solicitud para que responda más rápidamente.

Comprobación de que las instancias de backend mantengan las conexiones abiertas

Cuando la instancia de backend cierra una conexión TCP con el equilibrador de carga antes de que alcance su valor de tiempo de espera de inactividad, es posible que aparezca un error HTTP 504.

Para resolver este problema, active la configuración Keep-Alive en sus instancias de backend y establezca el tiempo de espera de Keep-Alive en un valor superior al tiempo de inactividad del equilibrador de carga.

(Solo Apache) Desactivación de TCP_DEFER_ACCEPT

Cuando TCP_DEFER_ACCEPT está activado para las instancias de backend de Apache, el equilibrador de carga inicia una conexión enviando un SYN a la instancia de backend. A continuación, la instancia de backend responde con un SYN-ACK y el equilibrador de carga envía un ACK vacío a la instancia de backend.

Como el último ACK está vacío, el backend no lo acepta y reenvía un SYN-ACK al equilibrador de carga. Esto puede provocar que se agote el tiempo de espera para volver a intentar SYN posteriormente. Cuando FIN o RST no se envían antes de que la instancia del backend cierre la conexión, el equilibrador de carga considera que la conexión está establecida, pero no lo está. Entonces, cuando el equilibrador de carga envía solicitudes a través de esta conexión TCP, el backend responde con un RST y genera un error 504.

Para resolver este problema, defina AcceptFilter http y AcceptFilter https en none.

(Solo Apache) Desactivación del evento MPM y configuración óptima de los MPM prefork y worker

Se recomienda desactivar el MPM event en las instancias de backend que estén registradas en un equilibrador de carga. Como el backend de Apache cierra las conexiones de forma dinámica, estas conexiones cerradas pueden generar errores HTTP 504.

Para obtener un rendimiento óptimo al utilizar los MPM prefork y worker, siempre que el equilibrador de carga esté configurado con un tiempo de espera de 60 segundos de inactividad, utilice estos valores:

mod_prefork MPMmod_worker MPM
Timeout6565
KeepAliveTimeout6565
KeepAliveActivadoActivado
MaxKeepAliveRequests10 0000
AcceptFilter httpningunoninguno
AcceptFilter httpsningunoninguno

Información relacionada

Supervisión del equilibrador de carga clásico

Solución de problemas de un equilibrador de carga clásico: errores HTTP

¿Cuál es la configuración óptima para usar Apache o NGINX como servidor backend para ELB?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años