nagios check_http HTTP严重-无法打开TCP套接字,可从命令行正常运行

时间:2019-06-18 19:45:31

标签: nagios

我具有以下服务定义:

define service{
    use                     my-service      ; Name of service template to use
    host_name               dra
    service_description     https://www.example.com
    check_command           check_http!-I my.ip.address --ssl -H www.example.com
    notifications_enabled   1
    retry_check_interval    2
    normal_check_interval   5
    contact_groups          myadmins
}

服务检查不断失败

Name or service not known
HTTP CRITICAL - Unable to open TCP socket

但是,如果我从命令行运行http_check,则会得到200 OK的结果:

/usr/lib/nagios/plugins/check_http -I my.ip.address --ssl -H www.example.com -v

.....
HTTP OK: HTTP/1.1 200 OK - 9176 bytes in 0.074 second response time |time=0.073543s;;;0.000000 size=9176B;;;0

还要注意,所讨论的URL在浏览器中工作正常,证书有效,等等。我还对许多其他站点使用完全相同的服务定义,它们都工作正常。我唯一能想到的是,此远程主机在DigitalOcean上运行,并为其分配了“浮动IP”。我尝试用分配给主机的浮动IP或“标准” IP替换上面的my.ip.address(以及nagios配置文件的主机定义),但这没有什么区别。

当由nagios运行时,同一命令怎么可能失败,而在手动运行时,成功吗?

1 个答案:

答案 0 :(得分:0)

我的问题的答案是:不要使用check_http,请使用

  1. 使用check_https_hostname
  2. 确保host_name节是实际的主机名
  3. 这需要匹配同一cfg文件中所有host_nameservice定义中的host节。

所以:

define service{
    use                     my-service         ; Name of service template to use
    host_name               www.example.com
    service_description     https://www.example.com
    check_command           check_https_hostname
    notifications_enabled   1
    retry_check_interval    2
    normal_check_interval   5
    contact_groups          myadmins
}

这是为什么:通过查看安装中check_http文件中的check_https_hostname/etc/nagios-plugins/config/http.cfg的定义,可以清楚地了解到。

# 'check_http' command definition
define command{
        command_name    check_http
        command_line    /usr/lib/nagios/plugins/check_http -H '$HOSTADDRESS$' -I '$HOSTADDRESS$' '$ARG1$'
        }

# 'check_https_hostname' command definition
define command{
        command_name    check_https_hostname
        command_line    /usr/lib/nagios/plugins/check_http --ssl -H '$HOSTNAME$' -I '$HOSTADDRESS$' '$ARG1$'
        }

您会注意到-H中的-Icheck_http自变量获得相同的值$HOSTADDRESS$,而在check_https_hostname中自变量获得$HOSTNAME$$HOSTADDRESS$

我将原始命令构建为check_http!-I my.ip.address --ssl -H www.example.com的事实并不重要。最后,/usr/lib/nagios/plugins/check_http命令为-I得到了两个值,为-H得到了两个值,第二对被忽略。

这确实使Cloudflare失去了“感谢”,因为Cloudflare动态分配给我的www.example.com的IP地址与我在主机定义中指定的实际主机IP地址不同。

最后,我想提一提帮助我弄清这件事的原因

debug_level=-1
debug_verbosity=1

在我的/etc/nagios3/nagios.cfg文件中,然后浏览/var/log/nagios3/nagios.debug

还要在check_http中检出/etc/nagios-plugins/config/http.cfg命令的所有不同变体。有一些非常有用的。