CyberseguridadGeneralLinuxServidoresTecnologíaWeb

Depurar un problema con una implementación del servidor Apache en la nube (error 500) y como solucionarlo.

Eres administrador de TI en una startup pequeña que ejecuta un servidor web denominado ws01 en la nube. Un día, cuando intenta acceder al sitio web servido por ws01, obtiene un error HTTP 500. Dado que su implementación aún se encuentra en una etapa temprana, sospecha que un desarrollador podría haber utilizado este servidor para realizar algunas pruebas o ejecutar algunos experimentos. Ahora necesita solucionar los problemas de ws01, descubrir qué está pasando y hacer que el servicio vuelva a un estado saludable.

Error 500

Es un error muy común, y suele suceder cuando el servidor ha tenido etapas previas de «testeo» de aplicaciones y servicios de manera aislada, y posteriormente se utiliza como servidor de producción.

¿Qué haremos para detectar el fallo?

  • Entender lo que significa el código de estado.
  • Aprender a verificar el estado del puerto con el comando netstat.
  • Aprenda a administrar servicios con elcomando systemctl.
  • Comprender cómo monitorear los recursos del sistema e identificar la causa raíz de un problema dentro del escenario comentado del «testeo» previo de aplicaciones y servicios.

El Error 500 nos indica que alguna petición o solicitud al servidor web donde está alojada nuestra página no fue bien, tanto porque existen errores mismo en nuestro site, en el servidor o en el proxy caché que el proveedor está utilizando, pero no es posible especificar cuál es el problema exacto.

Depurar el problema

Los códigos de estado de respuesta HTTP indican si una solicitud  específica se completó con éxito. Las respuestas se agrupan en cinco clases:

  • Respuestas informativas (100–199)
  • Respuestas exitosas (200–299)
  • Redirecciones (300–399)
  • Errores del cliente (400–499)
  • Errores del servidor (500–599)

Puedes ver un detalle más amplio de estos códigos aquí.

El código de respuesta de error interno del servidor del Protocolo de transferencia de hipertexto (HTTP) 500 indica que el servidor encontró una condición inesperada que le impidió cumplir con la solicitud. 

Previo al análisis es importante mencionar que al instalar el servidor web Apache en un sistema operativo Linux como Ubuntu, Debian u otro, la mayoria de las veces se crea un archivo de configuración (.conf) para el sitio web default del servidor, en una ruta similar a «/etc/apache2/sites-available/«. Los contenidos de este archivo son similares a esto:

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /ruta/a/tu/nuevo/sitio

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Para este sitio web default Apache escuchará el puerto 80 del sistema.

Herramientas

Antes de solucionar el error, necesitarás comprender más sobre el comando systemctl que utilizaremos.

systemctl es una utilidad para controlar el sistema systemd y el administrador de servicios. Viene con una larga lista de opciones para diferentes funciones, incluido iniciar, detener, reiniciar o recargar un daemon. Te recomendamos leer este artículo.

Ahora solucionemos el problema. Dado que la página web devuelve un código de estado de error HTTP, verifiquemos el estado del servidor web, es decir, apache2.

sudo systemctl status apache2

Suponemos que el fallo persiste y entonces veriamos una salida de este tipo:

Los resultados dicen «Error al iniciar el servidor HTTP Apache». Este podría ser el motivo del código de estado de error HTTP que se muestra en la página web. Intentemos reiniciar el servicio usando el siguiente comando:

sudo systemctl restart apache2

Este comando también falla. Comprobemos nuevamente el estado del servicio y encontraremos más información y la causa raíz del problema.

Observe el resultado, hay una línea que dice «La dirección ya está en uso: AH00072: make_sock: no se pudo vincular a la dirección [::]:80». Como indicamos, el servidor web Apache escucha la conexión entrante y se vincula al puerto 80. Pero según el mensaje mostrado, otro proceso está utilizando el puerto 80, por lo que el servidor web Apache no puede vincularse al puerto 80.

Para encontrar qué procesos están escuchando en qué puertos, usaremos el comando netstat , que devuelve información relacionada con la red. Aquí, usaremos una combinación de indicadores junto con el comando netstat para verificar qué proceso está usando un puerto en particular:

sudo netstat-nlp

Puede ver un PID de proceso (1376) y un nombre de programa asociado que usa el puerto 80. Un programa de Python3 está usando el puerto.

Averigüamos qué programa de Python3 es usando el siguiente comando:

ps -ax | grep python3

Aquí se muestra una lista de procesos de Python3. Ahora, busque el PID del proceso que estamos buscando y compárelo con el que usa el puerto 80 (salida del comando netstat ).

Ahora puede conocer el script /usr/local/bin/jimmytest.py por su PID, que es el que está utilizando el puerto 80 y causando conflicto.

Podemos hacer una suposición y pensar que esta es una prueba escrita por algún o algunos desarrolladores y no debería tomar el puerto predeterminado para correr su servicio.

Terminemos el proceso creado por /usr/local/bin/jimmytest.py usando el comando kill y su PID:

sudo kill 1376

Enumere los procesos nuevamente para averiguar si el proceso que acabamos de eliminar realmente finalizó.

Este tipo de comportamiento debería ser causado por el servicio. Dado que se trata de un script de Python creado por Jimmy, verifiquemos la disponibilidad de cualquier servicio con las palabras clave «python» o » jimmy«.

sudo systemctl --type=service | grep jimmy

Hay un servicio disponible llamado jimmytest.service. Ahora deberíamos detenerlo y deshabilitar este servicio usando el siguiente comando:

sudo systemctl stop jimmytest && sudo systemctl disable jimmytest

El servicio ahora está eliminado.

Para confirmar que no hay procesos escuchando en 80, use el siguiente comando:

sudo netstat-nlp

Como no hay procesos escuchando en el puerto 80, ahora podemos iniciar de nuevo el servidor web Apache:

sudo systemctl start apache2

¡Actualice la pestaña del navegador que mostraba el error 500 interno del servidor! O puede abrir la página web escribiendo la dirección IP externa del servidor ws01 en una nueva pestaña del navegador web y verás el servidor web Apache en pleno funcionamiento:

Conclusión

Puede que no llegues a encontrar un error como este al correr tu servidor web, pero si es muy probable que tengas que resolver muchos tipos de problemas y conflictos al administrar el sistema operativo y las aplicaciones que se instalen en este. Aquí te hemos presentado un escenario donde se utilizan varias herramioenras de Linux para monitorear el sistema y resolver conflictos entre servicios y asignación de puerto.

Hay muchas herramientas más a tu disposición en los sistema operativos que deberás ir conociendo poco a poco y poniendo en práctica para que adquieras una mayor experiencia Como Administrador de Sistemas.

Existen paneles de control administrativos como Cockpit que pueden facilitarte mucho la tarea de obtener información de tu sistema al ofrecerte una interface gráfica con muchas y variadas herramientas como listados de servicios, acceso a bitácoras (logs), estado del Firewall, y uso de recursos entre otros. Te recomendamos que leas su documentación web.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *