En ocasiones nos encontramos con un comportamiento extraño de Apache, como reinicios aleatorios, que no conseguimos depurar, pues la única información que observamos en los logs es el error «seg fault or similar nasty error detected in the parent process»
Primeramente, indicar que un error de segmentación es aquel causado por una mala comunicación o inoperatividad con algún módulo del OS que provoca un crash.
Pues bien, existe una forma de depurar estos errores y encontrar la causa de los mismos, para ello, hay que activar un memory dump de Apache, esperar a que haya un Crash para obtener un dump y después analizar el mismo. Estos dumps no suelen ocupar mucho pero por seguridad se recomienda establecerlos en una partición con suficiente espacio.
Para ello, procedemos a modificar el script de inicio de Apache en /etc/systemd/system/multi-user.target.wants/httpd.service , añadiendo la línea LimitCORE=infinity en el apartado [service] de forma que quede así:
vim /etc/systemd/system/multi-user.target.wants/httpd.service ... [Service] Type=notify ... LimitCORE=infinity
Si tenemos una distribución basada en debian, habría que editar /etc/init.d/apache2 y en la sección do_start() añadir:
ulimit -c unlimited
Tras esto, relanzamos el daemon:
systemctl daemon-reload
Ahora, creamos la carpeta donde se van a guardar los dumps, y le damos permisos:
mkdir -p /var/coredumps chmod a+w /var/coredumps
Y modificamos el valor del kernel para que cambie el patrón de los core_dump con el nombre,fecha, proceso, etc:
# echo /var/coredumps/core-%e-%s-%u-%g-%p-%t > /proc/sys/kernel/core_pattern
Ahora, en la configuración de apache, añadimos una línea para que Apache sepa donde dejar los dumps de memoria, para ello editamos el fichero general de configuración: /etc/httpd/conf/httpd.conf
y añadimos:
CoreDumpDirectory /var/coredumps
Ahora, reiniciamos apache2:
service httpd restart
Y con esto tenemos Apache preparado para que, con un nuevo fallo, nos deje un memory_dump.
Ahora, si hacemos un kill a algún proceso de Apache o el problema se repite, observaremos que nos deja un fichero con la nomenclatura:
core-httpd-11-0-0-62808-1523015066
Para analizar el mismo, necesitamos el aplicativo gdb:
# yum install gdb # apt-get install gdb
Y lanzamos el comando gdb, llamando al binario de apache2, y al core_dump:
gdb /usr/sbin/apache2 /var/coredumps/core-httpd-11-0-0-58513-1523014856
y por último, una vez estemos dentro de gdb, escribimos en pantalla los comandos:
bt full
Y obtendremos la traza completa del dump para ser analizada.
¡Mucha Suerte!
0 comentarios