Ingeniería

Cómo monitorear los servidores web NGINX con el Elastic Stack

En este artículo, detallaremos cómo podemos monitorear NGINX usando los diferentes componentes del Elastic Stack. Usaremos Metricbeat y Filebeat para recopilar datos. Estos datos se enviarán y se almacenarán dentro de Elasticsearch. Finalmente, visualizaremos esos datos con Kibana.

Metricbeat recopilará datos relacionados con conexiones (activas, gestionadas, aceptadas, etc.) y la cantidad total de solicitudes de cliente. Filebeat recopilará datos relacionados con los logs de acceso y error. Las cifras variarán según diferentes configuraciones, pero en la mayoría de los casos podemos usar esta información para deducir ciertas cuestiones, por ejemplo:

  • Un aumento en los logs de error para un recurso en particular puede significar que hemos eliminado un recurso que aún es necesario.
  • Los logs de acceso pueden mostrar cuándo se producen momentos pico de servicio (y por lo tanto establecer cuándo sería mejor realizar ciertas acciones, como mantenimiento).
  • Un aumento repentino de las solicitudes de los clientes puede apuntar a algo malicioso (como un ataque de DDoS).

El enfoque principal de este artículo es la funcionalidad de monitoreo, por lo que hablaremos brevemente de cuestiones como la configuración de Elasticsearch. Usamos Mac y por lo tanto usaremos las distribuciones Mac de Elasticsearch, Metricbeat, Filebeat y Kibana. Las distribuciones para otras plataformas se pueden adquirir en la página de descargas.

Instalación de Elasticsearch

Metricbeat y Filebeat (de hecho, todos los Beats) necesitan un cluster de Elasticsearch para almacenar datos. Configuraremos un cluster de Elasticsearch simple de manera local. Como no estamos exponiendo Elasticsearch de forma externa, no usaremos nuestro tiempo para configurar la seguridad.

Paso 1: Descargar Elasticsearch

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.0-darwin-x86_64.tar.gz

Paso 2: Extraer el archivo

tar -xvf elasticsearch-7.1.0-darwin-x86_64.tar.gz

Paso 3: Cambiar al directorio bin

cd elasticsearch-7.1.0/bin

Paso 4: Comenzar nuestro propio cluster de nodo

./elasticsearch

De manera predeterminada, tu cluster se ejecutará en localhost:9200.

Ejecución de NGINX

Existen diversas maneras de ejecutar NGINX: de forma independiente en el host, a través de un contenedor Docker, dentro de una configuración de Kubernetes, etc. Beats cuenta con una característica de detección automática que puede escuchar los eventos de la API de contenedor para rastrear los contenedores de nuestro servidor a medida que se activan o se eliminan.

Debido a la variedad de formas en que puede instalarse y configurarse NGINX, hay muchas cuestiones en este artículo que no daremos por sentadas, y mostraremos ejemplos de configuración de host y de detección automática (Docker, en este caso).

Configuración de Metricbeat y Filebeat

Ahora, configuraremos Beats para comenzar a recolectar y enviar nuestros datos.

Metricbeat

Usaremos Metricbeat para recopilar métricas.

Paso 1: Descargar Metricbeat:

curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.1.0-darwin-x86_64.tar.gz

Paso 2: Extraer el archivo

tar -xvf metricbeat-7.1.0-darwin-x86_64.tar.gz

Paso 3: Cambiar los directorios

cd metricbeat-7.1.0-darwin-x86_64

Momento de la configuración

De manera predeterminada, nuestro archivo de configuración (metricbeat.yml) buscará un cluster de Elasticsearch que se ejecute en localhost:9200, que fue lo que configuramos previamente.

Paso 4: Habilitar módulos de Metricbeat relevantes

De manera predeterminada, solo se recopilan las métricas de nivel de sistema:

./metricbeat modules enable nginx

Paso 5: Cambiar la propiedad de los archivos

Necesitamos cambiar la propiedad de algunos archivos, ya que ejecutaremos Metricbeat como raíz (otra alternativa consiste en elegir usar la opción --strict.perms=false en la línea de comando para deshabilitar la verificación estricta de permisos):

sudo chown root metricbeat.yml 
sudo chown root modules.d/system.yml 
sudo chown root modules.d/nginx.yml

Paso 6: Habilitar metricsets

Si abrimos nuestro archivo modules.d/nginx.yml, podremos habilitar el metricset de substatus, que consiste en descomentar lo siguiente:

#metricsets:
#  - stubstatus

Este metricset recopila datos del módulo de NGINX ngx_http_stub_status. Es importante que este módulo NGINX esté configurado para que el metricset funcione.

También puedes cambiar los hosts que se monitorean aquí. De manera predeterminada, se monitorea <a href="http://127.0.0.1">http://127.0.0.1</a>. Para configuraciones basadas en host, esto es todo lo que necesitamos.

Paso 7: Configuraciones de detección automática (alternativa)

Con las configuraciones de detección automática, la configuración equivalente variará según el tipo de proveedor, Docker, Kubernetes y Jolokia. Un ejemplo de Docker se vería como el siguiente, en el que agregamos un metricbeat.autodiscover al final del archivo de configuración metricbeat.yml.

metricbeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:
            contains:
              docker.container.image: nginx
          config:
            - module: nginx
              metricsets: ["stubstatus"]
              hosts: "${data.host}:${data.port}"

Con esta configuración, todos los contenedores Docker que usen una imagen con NGINX en el nombre (se llevará a cabo una combinación de substrings en lugar de una combinación exacta) se combinarán y usarán una configuración que habilitará el módulo NGINX con el metricset de substatus.

Paso 8: Ejecutar Metricbeat

Ahora que hemos configurado todo, podemos ejecutar Metricbeat con un marcador que envíe los logs a stderr y deshabilite la salida syslog/file:

sudo ./metricbeat -e

Si todo ha funcionado, deberías ver algunas salidas iniciales, y después más salidas cada vez que Metricbeat publica datos en tu cluster.

Filebeat

Usaremos Filebeat para recopilar logs.

Paso 1: Descargar Filebeat

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.0-darwin-x86_64.tar.gz

Paso 2: Extraer el archivo

tar -xvf filebeat-7.1.0-darwin-x86_64.tar.gz

Paso 3: Cambiar los directorios

cd filebeat-7.1.0-darwin-x86_64

Paso 4: Habilitar el módulo NGINX

./filebeat modules enable nginx

De manera predeterminada, se recopilarán los logs de acceso y error. Con respecto a las rutas del archivo de log, Filebeat intentará determinarlas con base en tu OS. Si necesitas establecer explícitamente diferentes rutas, puedes configurarlas en el archivo de configuración modules.d/nginx.

Paso 5: Cambiar la propiedad de los archivos

sudo chown root filebeat.yml
sudo chown root modules.d/nginx.yml
sudo chown root module/nginx/access/manifest.yml
sudo chown root module/nginx/error/manifest.yml

Para configuraciones basadas en host, esto es todo lo que necesitamos.

Paso 6: Configuraciones de detección automática (alternativa)

Al igual que antes, se necesita configuración adicional para usar la detección automática. Como en la sección previa, el ejemplo de Docker necesitará una sección de detección automática incorporada en la configuración, y filebeat.yml se verá de la siguiente manera:

filebeat.autodiscover:
 providers:
   - type: docker
     templates:
       - condition:
         contains:
           docker.container.image: nginx
         config:
           - module: nginx
             access:
               input:
                 type: docker
                 containers.ids:
                   - "${data.docker.container.id}"
             error:
               input:
                 type: docker
                 containers.ids:
                   - "${data.docker.container.id}"

Aquí configuramos las opciones de acceso y error para usar una entrada de Docker. Una entrada de Docker buscará logs de contenedor bajo su ruta (la ruta de base donde los logs de Docker se encuentran; de manera determinada, es /var/lib/docker/containers). Especificamos containers.ids usando las ids de los contenedores que coinciden con la condición de nuestra plantilla. En resumen, los logs (de manera predeterminada) se encontrarán en /var/lib/docker/containers/ac29b98ad83ca43bb4c15ae8f0d03aff8c7d57bf5dee9024124374b92b14b0f2/ (Las ids pueden ser diferentes).

Paso 7: Ejecutar Filebeat

sudo ./filebeat -e

Instalación de Kibana

Ahora que Metricbeat y Filebeat están enviando datos sobre nuestro servidor NGINX, necesitamos una forma de visualizar estos datos, y aquí es donde entra Kibana.

Paso 1: Descargar Kibana

curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.1.0-darwin-x86_64.tar.gz

Paso 2: Extraer el archivo y cambiar el directorio

tar -xzf kibana-7.1.0-darwin-x86_64.tar.gz
cd kibana-7.1.0-darwin-x86_64

Paso 3: Ejecutar Kibana

./bin/kibana

De manera predeterminada, Kibana usará un host de Elasticsearch de http://localhost:9200, y estará accesible en http://localhost:5601.

Si ingresas a http://localhost:5601, deberías ver lo siguiente:

Bienvenido a la pantalla de Kibana

Como opción, puedes probar los datos de muestra, pero nosotros solo haremos clic en Explorar por mi cuenta.

Visualización de datos NGINX en Kibana

A continuación, veremos cómo podemos usar Kibana para visualizar y analizar nuestros datos.

Infrastructure

Si navegamos a la app Infrastructure en la barra lateral de Kibana, podremos ver una vista de snapshot (último minuto) de nuestra infraestructura. Según la configuración que se usó, los datos estarán accesibles en Hosts para las configuraciones que no se basan en detección automática. En el caso de las configuraciones de detección automática, los botones de Docker y Kubernetes (con base en el proveedor que se usó) te llevarán al conjunto de datos correcto:

Botones Hosts, Kubernetes y Docker

Como estábamos usando una configuración basada en Hosts, podemos hacer clic en el botón Hosts y ver que se envían los siguientes datos desde Metricbeat:

Hacer clic en el botón Hosts para ver los datos que se envían

Si seleccionamos uno de los nodos y elegimos Ver métricas, podremos ver una página con métricas detalladas para ese único servidor NGINX.

Gráficos de Kibana con métricas de servidor

Logs

Si en cambio navegamos a la app de Logs, podremos ver nuestros logs de acceso y error que se han enviado desde Filebeat.

App de Logs de Kibana con logs de error y acceso

Dashboard de NGINX preconfigurado

Ahora que tenemos una instancia accesible y en ejecución de Kibana, podremos cargar algunos dashboards preestablecidos.

Para cargar los dashboards de Metricbeat, ejecuta lo siguiente en tu directorio de Metricbeat:

sudo ./metricbeat setup --dashboards

Y haz lo mismo para Filebeat:

sudo ./filebeat setup --dashboards

Ahora, si navegamos a la pestaña Dashboards en Kibana, deberíamos ver lo siguiente:

Página de Kibana con los dashboards disponibles

Si lo reducimos a una búsqueda de "nginx", tendremos estos dashboards disponibles:

Página de Kibana con los dashboards NGINX disponibles

Por ejemplo, el dashboard ECS de logs de acceso y error [Filebeat NGINX] se ve así:

ECS de logs de acceso y error NGINX de Filebeat

Y así aprendimos a usar el Elastic Stack para monitorear los servidores NGINX. A partir de aquí existen varias opciones para probar (diferentes opciones de agrupación y filtros, por ejemplo) para llegar a la información que realmente te interesa.

Pruébalo tú mismo

Comenzar con el Elastic Stack es fácil. Puedes descargar los diversos productos desde los comandos cURL provistos o navegar a nuestra página de Descargas y obtenerlos allí. O incluso más simple, activa una prueba gratuita de 14 días del Elasticsearch Service y comienza desde allí. Si tienes alguna pregunta, consulta los foros Discuss.