Código de estado HTTP 504 (Tiempo de espera de puerta de enlace agotado)
Un código de estado HTTP 504 (tiempo de espera de puerta de enlace superado) indica que cuando CloudFront reenvió una solicitud al origen (porque el objeto solicitado no estaba en la caché perimetral), se produjo alguna de las siguientes circunstancias:
-
El origen devolvió un código de estado HTTP 504 a CloudFront.
-
El origen no respondió antes de que la solicitud caducara.
CloudFront devolverá un código de estado HTTP 504 si un firewall o grupo de seguridad bloquea el tráfico al origen o si el origen no es accesible en Internet. Compruebe en primer lugar si ocurren estos problemas. A continuación, si el acceso no es el problema, explore los retrasos de la aplicación y los tiempos de espera del servidor para ayudarle a identificar y corregir los problemas.
Temas
- Configurar el firewall en su servidor de origen para permitir el tráfico de CloudFront
- Configurar los grupos de seguridad en su servidor de origen para permitir el tráfico de CloudFront
- Hacer que su servidor de origen personalizado sea accessible en Internet
- Buscar y corregir respuestas con retardo desde aplicaciones en su servidor de origen
Configurar el firewall en su servidor de origen para permitir el tráfico de CloudFront
Si el firewall en el servidor de origen bloquea el tráfico de CloudFront, CloudFront devuelve un código de estado HTTP 504, por lo que es recomendable asegurarse de que este no es el problema antes de comprobar otros problemas.
El método que se utiliza para determinar si se trata de un problema con su firewall depende del sistema que utiliza su servidor de origen:
-
Si utiliza un firewall IPTable en un servidor Linux, puede buscar herramientas e información para ayudarle a trabajar con IPTables.
-
Si utiliza Windows Firewall en un servidor de Windows, consulte Agregar o editar regla de firewall
en la documentación de Microsoft.
Al evaluar la configuración del firewall en su servidor de origen, busque las reglas de firewalls o de seguridad que bloquean el tráfico desde ubicaciones de borde de CloudFront, en función del intervalo de direcciones IP publicado. Para obtener más información, consulte Ubicaciones e intervalos de direcciones IP de servidores de borde de CloudFront.
Si el intervalo de direcciones IP de CloudFront tiene permiso para conectarse al servidor de origen, asegúrese de actualizar las reglas de seguridad del servidor para incorporar los cambios. Puede suscribirse a un tema de Amazon SNS y recibir notificaciones cuando se actualiza el archivo del rango de direcciones IP. Después de recibir la notificación, puede utilizar código para recuperar el archivo, analizarlo y realizar ajustes para el entorno local. Para obtener más información, consulte Suscribirse a cambios de direcciones IP públicas de AWS mediante Amazon SNS
Configurar los grupos de seguridad en su servidor de origen para permitir el tráfico de CloudFront
Si su origen usa Elastic Load Balancing, revise los grupos de seguridad de ELB y asegúrese de que los grupos de seguridad permiten el tráfico de entrada desde CloudFront.
También puede utilizar AWS Lambda para actualizar de manera automática sus grupos de seguridad para permitir el tráfico entrante desde CloudFront.
Hacer que su servidor de origen personalizado sea accessible en Internet
Si CloudFront no puede acceder al servidor de origen personalizado porque no está disponible públicamente en Internet, devuelve un error HTTP 504.
Las ubicaciones de borde de CloudFront se conectan con los servidores de origen a través de Internet. Si el origen personalizado se encuentra en una red privada, CloudFront no puede tener acceso a él. Por este motivo, no puede utilizar servidores privados, incluidos equilibradores de carga clásicos internos, como servidores de origen con CloudFront.
Para comprobar que el tráfico de Internet puede conectarse a su servidor de origen, ejecute los siguientes comandos (donde OriginDomainName
es el nombre de dominio de su servidor):
Para tráfico HTTPS:
-
nc -zv
OriginDomainName
443 -
telnet
OriginDomainName
443
Para el tráfico HTTP:
-
nc -zv
OriginDomainName
80 -
telnet
OriginDomainName
80
Buscar y corregir respuestas con retardo desde aplicaciones en su servidor de origen
Los tiempos de espera superados del servidor suelen deberse a que la aplicación tarda mucho en responder o a que se ha establecido un valor de tiempo de espera demasiado bajo.
Una solución rápida que ayuda a evitar errores HTTP 504 consiste sencillamente en establecer un valor de tiempo de espera de CloudFront mayor para su distribución. Sin embargo, le recomendamos que primero se asegure de corregir los problemas de desempeño y de latencia con la aplicación y el servidor de origen. A continuación, puede establecer un valor de tiempo de espera razonable que ayude a evitar errores HTTP 504 y proporcione buena capacidad de respuesta a los usuarios.
A continuación, se muestra información general de los pasos que puede seguir para buscar problemas de desempeño y corregirlos:
-
Mida la latencia típica y de carga elevada (capacidad de respuesta) de su aplicación web.
-
Añada recursos adicionales, como CPU o memoria, si es necesario. Tome otras medidas para corregir problemas como, por ejemplo, ajuste de consultas de base de datos para dar cabida a supuestos de carga elevada.
-
Si es necesario, ajuste el valor de tiempo de espera de su distribución de CloudFront.
A continuación se muestran los detalles de cada paso.
Medir la latencia típica y de carga elevada
Para determinar si uno o más servidores de aplicación web de backend experimentan una alta latencia, ejecute el siguiente comando curl de Linux en cada servidor:
curl -w "DNS Lookup Time: %{time_namelookup} \nConnect time: %{time_connect} \nTLS Setup: %{time_appconnect} \nRedirect Time: %{time_redirect} \nTime to first byte: %{time_starttransfer} \nTotal time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject
nota
Si ejecuta Windows en sus servidores, puede buscar y descargar curl para Windows para ejecutar un comando similar.
A medida que mide y evalúa la latencia de una aplicación que se ejecuta en su servidor, tenga en cuenta lo siguiente:
-
Los valores de latencia son relativos a cada aplicación. Sin embargo, un valor de Tiempo hasta el primer byte en milisegundos en lugar de segundos o más, es razonable.
-
Si mide la latencia de la aplicación con carga normal y está bien, tenga en cuenta que es posible que los espectadores sigan sufriendo tiempos de espera con cargas elevadas. Cuando hay una demanda alta, es posible que los servidores tengan respuestas con retraso o que no respondan. Para ayudarle a evitar problemas de latencia de carga elevada, compruebe los recursos del servidor tales como CPU, memoria y lecturas y escrituras en disco para asegurarse de que los servidores tengan la capacidad de escalar una carga elevada.
Puede ejecutar los siguientes comandos de Linux para comprobar la memoria que utilizan los procesos de Apache:
watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"
-
Una utilización de CPU alta en el servidor puede reducir notablemente el desempeño de una aplicación. Si utiliza una instancia Amazon EC2 para su servidor backend, revise las métricas de CloudWatch del servidor para comprobar la utilización de la CPU. Para obtener más información, consulte la Guía del usuario de Amazon CloudWatch. O bien, si está utilizando un servidor propio, consulte la documentación de ayuda del servidor para obtener instrucciones sobre cómo comprobar el uso de la CPU.
-
Compruebe si hay otros posibles problemas con cargas elevadas, como, por ejemplo, consultas de base de datos que se ejecutan lentamente cuando hay un gran volumen de solicitudes.
Agregar recursos y ajustar servidores y bases de datos
Después de evaluar la capacidad de respuesta de las aplicaciones y servidores, asegúrese de que dispone de recursos suficientes para las situaciones de tráfico normal y de carga elevada:
-
Si tiene su propio servidor, asegúrese de tener suficiente CPU, memoria y espacio en disco para gestionar las solicitudes de los espectadores, en función de su evaluación.
-
Si utiliza una instancia Amazon EC2 como servidor backend, asegúrese de que el tipo de instancia cuente con los recursos apropiados para responder adecuadamente a las solicitudes entrantes. Para obtener más información, consulte Tipos de instancia en la Guía del usuario de Amazon EC2.
Además, tenga en cuenta los siguientes pasos de ajuste para ayudar a evitar tiempos de espera:
-
Si el valor Tiempo hasta el primer byte que devuelve el comando curl parece alto, tome medidas para mejorar el desempeño de su aplicación. Mejorar la capacidad de respuesta de la aplicación a su vez reduce los errores de tiempo de espera.
-
Ajuste las consultas de la base de datos para asegurarse de que puedan administrar volúmenes de solicitudes elevados sin un desempeño lento.
-
Configure conexiones keep-alive (persistente)
en su servidor de backend. Esta opción ayuda a evitar las latencias que se producen cuando las conexiones deben volver a establecerse para las solicitudes o usuarios posteriores. -
Si utiliza Elastic Load Balancing como origen, las siguientes son las posibles causas de un error 504:
El equilibrador de carga no consigue establecer una conexión con el destino antes de que expire el tiempo de espera de la conexión (10 segundos).
El equilibrador de carga establece una conexión con el destino pero este no responde antes de que transcurra el periodo de tiempo de espera de inactividad.
La lista de control de acceso (ACL) de red para la subred no permite el tráfico desde los destinos a los nodos del equilibrador de carga en los puertos efímeros (1024-65535).
El destino devuelve un encabezado de longitud de contenido que es mayor que el cuerpo de la entidad. Se agota el tiempo del equilibrador de carga a la espera de los bytes que faltan.
El destino es una función de Lambda y Lambda no responde antes de que se agote el tiempo de espera de la conexión.
Para obtener más información sobre cómo reducir la latencia, consulte ¿Cómo soluciono una alta latencia en mi equilibrador de carga clásico de ELB?
-
Si utiliza MediaTailor como origen, las siguientes son las posibles causas de un error 504:
Si se gestionan mal las URL relativas, MediaTailor puede recibir URL con formato incorrecto de los reproductores.
Si MediaPackage es el origen del manifiesto para MediaTailor, los errores de manifiesto 404 de MediaPackage pueden provocar que MediaTailor devuelva un error 504.
La solicitud al servidor de origen MediaTailor tarda más de dos segundos en completarse.
-
Si utiliza Amazon API Gateway como origen, la siguiente es una posible causa de un error 504:
Una solicitud de integración tarda más que su parámetro de tiempo máximo de integración de la API de REST de API Gateway. Para obtener más información, consulte ¿Cómo soluciono los errores de tiempo de espera HTTP 504 de la API con API Gateway?
Si es necesario, ajuste el valor de tiempo de espera de CloudFront
Si ha evaluado y solucionado el desempeño de aplicaciones lento, la capacidad del servidor de origen y otros problemas, pero los espectadores siguen experimentando errores HTTP 504, entonces debería plantearse cambiar el tiempo especificado en su distribución para tiempo de espera de respuesta de origen. Para obtener más información, consulte Tiempo de espera de respuesta (solo orígenes personalizados).