Se observó un aumento repentino de errores 502 en producción, lo que inició un proceso de análisis para identificar la causa raíz.
- Verificación inicial de la conexión TCP
Primero se sospechó de un tiempo de excedido en la conexión TCP entre el balanceador de carga y los servidores backend, causando desconexiones. Para validar esta hipótesis, se capturó tráfico de red utilizando tcpdump:
tcpdump -i ens3 host 192.168.1.100 and tcp port 80 -w /tmp/captura.pcap
El aálisis mostró que el cliente completó exitosamente la solicitud POST antes de que el servidor iniciara el cierre de conexión con FIN. Esto indicó que el servidor había procesado la petición, pero falló en algún punto.
- Revisión de registros de error de Apache
Se revisó el archivo de registro de errores de Apache, ubicado según la configuración:
# En httpd.conf
ErrorLog "/var/log/httpd/error_log"
No se encontraron mensajes útiles para identificar el problema, por lo que se decidió habilitar el análisis de volcados de núcleo (core dumps).
- Configuración de volcados de núcleo
3.1 Habilitar la generación de archivos core
Se verificó y ajustó el límite de tamaño para archivos core:
# Comprobar estado actual
ulimit -c
# Establecer límite temporal
ulimit -c 1024
# o
ulimit -c unlimited
3.2 Definir ruta y formato de archivos core
Se configuró el patrón de nombres y ubicación para los volcados:
# Modificación temporal
echo "/var/log/coredumps/%e.core.%s.%p.%h.%t" > /proc/sys/kernel/core_pattern
echo 1 > /proc/sys/kernel/core_uses_pid
# Modificación permanente en /etc/sysctl.conf
kernel.core_pattern = /var/log/coredumps/%e.core.%s.%p.%h.%t
kernel.core_uses_pid = 1
# Aplicar cambios
sysctl -p
3.3 Crear directorio y asignar permisos
Se preparó el entorno para Apache:
mkdir -p /var/log/coredumps
chown apache:apache /var/log/coredumps
# En httpd.conf
CoreDumpDirectory /var/log/coredumps
Se reinició el servicio Apache con un reinicio complteo (stop y start) para aplicar los cambios.
- Análisis del volcado de núcleo
Se generó un archivo core durante un fallo y se analizó con GDB. Se aseguró de tener los símbolos de depuración instalados:
gdb /usr/sbin/httpd /var/log/coredumps/httpd.core.6.14582.server1.1672500000
Dentro de GDB, se ejecutó el comando bt full para obtener un rastreo detallado de la pila. Tras examinar la salida, se localizó la causa del error en el código de la aplicación. Se realizó una prueba en entorno controlado y se confirmó el problema, que fue corregido subsanando los errores 502.