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:
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:
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:
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.
Logs
Si en cambio navegamos a la app de Logs, podremos ver nuestros logs de acceso y error que se han enviado desde Filebeat.
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:
Si lo reducimos a una búsqueda de "nginx", tendremos estos dashboards disponibles:
Por ejemplo, el dashboard ECS de logs de acceso y error [Filebeat NGINX] se ve así:
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.