Tengo microservicios escritos en node/express alojados en EC2 con un balanceador de carga de aplicaciones.
Algunos usuarios obtienen un 502 incluso antes de que la solicitud llegue al servidor.
Registro cada registro dentro de cada instancia, y no tengo los registros de esas solicitudes, tengo la solicitud inmediatamente anterior a la 502 y las solicitudes justo después de la 502, por eso asumo que la solicitud nunca llega a los servidores. La mayoría de los usuarios solucionan esto refrescando la página o usando una pestaña anónima, que hace la conexión a una máquina diferente (tenemos 6).
Puedo decir a partir de los registros del balanceador de carga que el balanceador de carga responde casi de inmediato a la solicitud con 502. Supongo que esto podría ser un TCP RST.
Tuve un problema similar hace mucho tiempo y tuve que agregar keepAliveTimeout y headersTimeout a la configuración del nodo. Aquí está mi configuración (todavía usando el valor predeterminado de LB de los años 60):
server.keepAliveTimeout = 65000; server.headersTimeout = 80000;Las métricas, especialmente el uso de memoria y CPU de todas las instancias, están bien.
Estos errores 502 comenzaron después de una actualización que hicimos donde introdujimos varios paquetes, por ejemplo, axios. Al principio, pensé que podría ser axios, porque el keep-alive no está habilitado de forma predeterminada. Pero no funcionó. Aparte de los axios , solo usamos la solicitud .
¿Algún consejo sobre cómo debo depurar/arreglar este problema?
Los errores HTTP 502 generalmente son causados por un problema con el balanceador de carga. Lo que explicaría por qué las solicitudes nunca llegan a su servidor, presumiblemente porque el equilibrador de carga no puede llegar al servidor por alguna u otra razón.
Este enlace tiene algunos consejos sobre cómo obtener registros de un balanceador de carga clásico. Sin embargo, dado que no especificó, es posible que esté usando un balanceador de carga de aplicaciones, en cuyo caso este enlace podría ser más útil.
A partir de los registros de acceso de ALB, supe que ALB no podía conectar el destino o que el destino finalizaba inmediatamente la conexión.
Y la parte más difícil fue descubrir cómo replicar el error 502.
Parece que la versión de nodo que estaba usando tiene un límite de tamaño de encabezado de solicitud de 8 kb. Si alguna solicitud excediera ese límite, el destino rechazaría la conexión y el ALB devolvería un error 502.
Solución:
Resolví el problema agregando --max-http-header-size=size a la línea de comando de inicio del nodo, donde el tamaño es un valor mayor a 8kb.