Monitoreo y alarma Nginx Upstream

Escribí un artículo antes, presentando cómo Nginx monitorea el tráfico de cada servidor , principalmente agregando un módulo de estado de terceros para ver el estado de todos los servidores y el flujo ascendente. Luego, la gente siempre pregunta si hay una manera de monitorear el flujo ascendente y alertar , así que lo presentaré hoy., Métodos completos de monitoreo y advertencia upstream


Aplicación: Nginx / Tengine

模块 : ngx_http_upstream_check_module

Seguimiento: zabbix

Alerta: Enterprise WeChat / Dingding


Debido a que el upstream de nginx es pasivo por defecto y no será monitoreado activamente, el módulo upstream_check de tengine se usa directamente aquí


Si es tengine, siempre que sea la versión 1.4 o superior, el módulo se abrirá de forma predeterminada. Si es nginx, debe volver a compilar nginx y agregar el módulo. El método de compilación no tiene mucho que decir aquí. Descargue el código fuente y agréguelo con --add-module Simplemente compile


El módulo upstream_check proporciona una función activa de verificación del estado del servidor back-end. Aquí hay algunas instrucciones proporcionadas por el módulo


  • controlar

Sintaxis: intervalo de verificación = milisegundos [caída = cuenta] [subida = cuenta] [tiempo de espera = milisegundos] [default_down = true | false] [type = tcp | http | ssl_hello | mysql | ajp] [puerto = check_port] 
Predeterminado: intervalo = 30000 caída = 5 subida = 2 tiempo de espera = 1000 default_down = true type = tcp 
Contexto: upstream
 
 

Este comando puede activar la función de verificación de estado del servidor back-end. El significado de los parámetros después del comando es:

intervalo : el intervalo de los paquetes de verificación de estado enviados al backend

fall (fall_count) : si el número de fallos consecutivos alcanza fall_count, el servidor se considera inactivo

Rise (Rise_count) : si el número de éxitos consecutivos alcanza Rise_count, el servidor se considera
tiempo de espera agotado : el tiempo de espera de la solicitud de estado del back-end.

default_down : establece el estado inicial del servidor, si es verdadero, significa que el predeterminado está inactivo

type : el tipo de paquete de verificación de estado, ahora admite los siguientes tipos múltiples

  • tcp: conexión tcp simple, si la conexión es exitosa, el backend es normal

  • ssl_hello: envíe un paquete de saludo SSL inicial y acepte el paquete de saludo SSL del servidor

  • http: envíe una solicitud HTTP y juzgue si el backend está activo por el estado del paquete de respuesta del backend

  • mysql: conéctese al servidor mysql y juzgue si el backend está activo al recibir el paquete de saludo del servidor

  • ajp: envía el paquete Cping del protocolo AJP al backend y juzga si el backend está activo al recibir el paquete Cpong

puerto : especifique el puerto de verificación del servidor back-end. Puede especificar el puerto del servidor back-end que es diferente del servicio real. Por ejemplo, el back-end proporciona una aplicación en el puerto 443. Puede verificar el estado del puerto 80 para determinar el estado del back-end. El valor predeterminado es 0, lo que significa que el puerto es el mismo que el puerto de servicio real proporcionado por el servidor backend. Esta opción aparece en Tengine-1.4.0


  • check_keepalive_requests

Sintaxis: check_keepalive_requests request_num 
Predeterminado: 1 
Contexto: ascendente

Este comando puede configurar el número de solicitudes enviadas por una conexión. El valor predeterminado es 1, lo que significa que Tengine cerrará la conexión después de completar una solicitud.


  • check_http_send

Sintaxis: check_http_send http_packet 
Predeterminado: "GET / HTTP / 1.0" 
Contexto: ascendente

Este comando puede configurar el contenido de la solicitud enviada por el paquete de verificación de estado de http. Para reducir la cantidad de datos transmitidos, se recomienda el método "HEAD". Cuando se usa una conexión larga para la verificación de estado, el encabezado de la solicitud de mantener vivo debe agregarse al comando, como: "HEAD / HTTP / 1.1 \ r \ nConexión: keep-alive \ r \ n \ r \ n" . Al mismo tiempo, en el caso de utilizar el método "GET", el tamaño de la uri de solicitud no debe ser demasiado grande para garantizar que la transmisión se pueda completar en 1 intervalo, de lo contrario se considerará como un servidor back-end. o anomalía de la red por parte del módulo de verificación de estado


  • check_http_expect_alive

Sintaxis: check_http_expect_alive [http_2xx | http_3xx | http_4xx | http_5xx] 
Predeterminado: http_2xx | http_3xx 
Contexto: ascendente

Este comando especifica el estado correcto de la respuesta HTTP. De forma predeterminada, el estado de 2XX y 3XX se considera correcto.


  • check_shm_size

Sintaxis: check_shm_size size 
Predeterminado: 1M 
Contexto: http

El estado de la verificación de estado de todos los servidores back-end se almacena en la memoria compartida. Este comando puede establecer el tamaño de la memoria compartida. El valor predeterminado es 1 M, si tiene más de 1000 servidores y se produce un error durante la configuración, es posible que deba ampliar el tamaño de la memoria


  • comprobar estado

Sintaxis: check_status [html | csv | json] 
Predeterminado: check_status html 
Contexto: ubicación

显示服务器的健康状态页面。该指令需要在http块中配置。在Tengine-1.4.0以后,你可以配置显示页面的格式。支持的格式有: html、csv、 json。默认类型是html。你也可以通过请求的参数来指定格式,假设‘/status’是你状态页面的URL, format参数改变页面的格式

比如:

/status?format=html
/status?format=csv
/status?format=json

下面是一个HTML状态页面的例子(server number是后端服务器的数量,generation是Nginx reload的次数。Index是服务器的索引,Upstream是在配置中upstream的名称,Name是服务器IP,Status是服务器的状态,Rise是服务器连续检查成功的次数,Fall是连续检查失败的次数,Check type是检查的方式,Check port是后端专门为健康检查设置的端口)

图片

下面是json格式

图片


监控数据就是从这里获取,在zabbix的agent中添加脚本如下:

json
urllib3

():
    url = http = urllib3.PoolManager()
    up_status = http.request(url).data.decode()
    up_status = json.loads(up_status)
    upstreams = []
    upserver up_status[][]:
        status = {: upserver[]: upserver[]: upserver[]: upserver[]: upserver[]: upserver[]}
        upstreams.append(status)
    result = { : upstreams}

    result

__name__ == :
    :
        (call_api())
    e:
        (e)

这里主要是把status返回的数据处理成zabbix需要的格式,因为我是用zabbix自动发现功能,所以这里直接写成遍历server,执行脚本输出如下:

图片

数据收集就没问题了,接着在zabbix中添加自动发现规则

图片

接着添加监控项原型图片

监控项原型主要是获取upstream后端server状态,接着添加触发器

图片

监控很简单,就添加完了,当upstream后端server状态down掉就会触发规则,将告警信息通过告警媒介发送到企业微信,当然你也可以是钉钉或短信,看你自己配置的告警媒介

图片

恢复后通知:

图片


Supongo que te gusta

Origin blog.51cto.com/15080021/2654494
Recomendado
Clasificación