如何在 CentOS 6 中使用 Icinga/Nagios 通过 HA 代理监控 Web 服务器节点

如何在 CentOS 6 中使用 Icinga/Nagios 通过 HA 代理监控 Web 服务器节点

在本指南中,我根本不关注如何设置 HA 代理或为什么要这样做。如果您有它并且想要使用 Icinga 正确监控它,这里有一个关于如何做到这一点的想法。

以下是一个可能的情况:

  • 2 个数据中心 A 和 B
  • 每个数据中心 1 个 HA 代理节点
  • 每个 HA 代理指向每个数据中心 A1、A2、B1、B2 中的 2 个 Web 服务器
  • 在这种情况下,Web 服务器实际上是一个 Web 服务端点,对 URL 进行简单的 HTTP GET 并不能告诉你太多有关系统实际运行状况的信息

监控方面,你可以对当前活跃节点进行外部检查(如 pingdom 或其他)。但这会产生一些影响:

  • 你不会测试被动节点,这意味着在节点切换之前,你不确定被动节点是否正常工作
  • 一个节点的故障不会给你明确的指示什么地方出了问题

以下是偏执狂的做法:

  • 我希望从外部 IP、HA 代理到系统全程监控每个节点,以发现过程中的任何故障
  • 我想对后端服务进行实际的 Web 服务调用,以验证它是否正常工作 - 如果你正在测试一个普通的网站,这显然不适用

那么让我们开始吧...

答案1

首先,您需要在 haproxy 中启用 cookie 插入功能,并为每个后端节点分配其唯一密钥。这通常用于会话粘性 - 即,如果后端节点仍然可用,您不希望访问您网站的人总是获得相同的后端节点。但它也可以用于通过发送适当的 cookie 来监视单个节点。因此,如果不存在 cookie,请将 cookie 添加到您的 haproxy 服务器定义中:

cookie SERVERID insert indirect nocache
server webA1 10.0.0.1:80 cookie S1 
server WebA2 10.0.0.2:80 cookie S2 

其次,您需要弄清楚检查哪些内容最有意义,为此,您需要自己进行一些思考和调整,以找出最有意义的内容以及如何使用 nagios 的出色 check_http 进行检查。为了完整起见,我将在下面给出一个复杂示例,说明如何测试针对后端 Web 服务的 POST。对于此示例场景,要求如下:

 - Post data should be <echo>Hello</echo>
 - A successful execution will return the echo string back
 - Disable any cache through HTTP headers
 - Set content-type to text/xml and expect the same back
 - SSL should be used
 - Host name is example.com
 - Port is 443
 - URI is /service
 - Max response time is 3 seconds

这将通过 check_http 的以下参数来处理(Cent OS 6 上的 /usr/lib64/nagios/plugins/check_http)

-P "<echo>Hello</echo>"
-r 'Hello'
-k "Cache-Control: no-cache" -k "Pragma: no-cache"
-k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml"
-S 
-H example.com
-p 443
-u /service
-t 3

现在,所有这些放在一起应该会给你一个不错的 OK 输出,先让它工作起来。

然后是时候进行一些自定义操作了,通过 cookie 启用节点选择,还可以选择发送 IP,您可以使用该 IP 覆盖 DNS,例如,如果您想要检查通过被动数据中心的路径。为此,我们将围绕 check_http 编写一个小型 shell 脚本包装器,它将接受一个参数作为后端节点的主机名(为方便起见,让我们使用 icinga 认为的主机名)和一个可选参数,覆盖要检查的服务器的 IP(绕过 DNS 查找)。所有这些都会导致 shell 脚本看起来像这样(我建议将其放在 /usr/lib64/nagios/plugins/ 中,并根据其中的其他插件对其进行 chown、chmod):

#/bin/bash

if [  -z "$1" ]
  then
    echo "Usage: $0 host-name [haproxy-ip]"
  exit 2
fi

if [[ $# -eq 2 ]]; then
    APPEND_OPTS=" -I $2"
fi

#Map icinga/nagios host names to haproxy node names in case these differ and you don't want to expose them on the internetz
declare -A nodes
nodes=(["webA1"]="S1"
        ["webA2"]="S2"
        ["webB1"]="S3"
        ["webB2"]="S4")
node=${nodes["$1"]}


/usr/lib64/nagios/plugins/check_http -P "<echo>Hello</echo>" -r 'Hello' -k "Cache-Control: no-cache" -k "Pragma: no-cache" -k "Content-Type: text/xml; charset=UTF-8" -k "Accept: text/xml" -S -H example.com -p 443 -u /service -t 3 -k "Cookie: SERVERID=$node" $APPEND_OPTS

注意SERVERID是haproxy中设置的cookie的名字。

一旦完成,您就可以定义类似于以下的 nagios 检查命令:

#Check path through av A fw and haproxy
define command{
        command_name    check_node_external_a
        command_line    $USER1$/check_node '$HOSTNAME$' '<A external IP>'
        }

其中 check_node 是包装器脚本的名称,“A 外部 IP”是用于访问数据中心 A 中的系统的 IP。

这会为我过去几天节省很多时间,所以我希望它也能为你指明正确的方向。

相关内容