【问题标题】:nagios check_http HTTP CRITICAL - Unable to open TCP socket, works fine from command linenagios check_http HTTP CRITICAL - 无法打开 TCP 套接字,从命令行可以正常工作
【发布时间】:2019-06-18 19:45:31
【问题描述】:

我有以下服务定义:

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运行时会失败,而手动运行时会成功?

【问题讨论】:

  • 编辑:我开始认为这可能是由于 cloudflare 处理 www.example.com 的 A 记录。
  • 我有一个类似的 check_http 命令失败的案例。这里www.example.com 是指向*.apps.example.com 的CNAME --- 也许* 混淆了插件命令使用的DNS 解析器?

标签: nagios


【解决方案1】:

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

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

所以:

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
}

原因如下:查看我安装的/etc/nagios-plugins/config/http.cfg 文件中的check_httpcheck_https_hostname 的定义就很清楚了。

# '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$'
        }

您会注意到check_http 中的-H-I 参数得到相同的值$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

另外,查看/etc/nagios-plugins/config/http.cfgcheck_http 命令的所有不同变体。有一些非常有用的。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多