16 HTTP 代理

概述

此监控项类型允许使用 HTTP/HTTPS 协议轮询数据。 也可以使用 Zabbix sender 工具或 Zabbix sender protocol(用于向 Zabbix 服务器或 proxy 发送数据)进行 trap,或者使用 history.push API 方法(用于向 Zabbix 服务器发送数据)。

HTTP 监控项检查由 Zabbix 服务器执行。但是,当主机由 Zabbix proxy 监控时,HTTP 监控项检查由 proxy 执行。

HTTP 监控项检查不要求在被监控的主机上运行任何 agent。

HTTP agent 同时支持 HTTP 和 HTTPS。Zabbix 还可以选择跟随重定向(请参见下面的 Follow redirects 选项)。重定向的最大次数硬编码为 10(使用 cURL 选项 CURLOPT_MAXREDIRS)。

Zabbix 服务器/proxy 必须预先配置 cURL(libcurl)支持。

HTTP 检查以异步方式执行——在启动其他检查之前,无需先接收某个请求的响应。DNS 解析同样也是异步的。

异步检查的最大并发数为 1000(由 MaxConcurrentChecksPerPoller 定义)。

异步 HTTP agent poller 的数量由 StartHTTPAgentPollers 参数定义。

自 Zabbix 7.0 起,HTTP agent 检查已添加 cURL 持久连接功能。

配置

要配置 HTTP 监控项:

  • 转到:数据采集主机
  • 在该主机所在行中点击 监控项
  • 点击 创建监控项
  • 在表单中输入监控项参数

所有必填输入字段都以红色星号标记。

HTTP 监控项需要特别说明的字段如下:

Parameter Description
Type 在此选择 HTTP agent
Key 输入唯一的监控项键值。
URL 要连接并获取数据的 URL。例如:
https://www.example.com
http://www.example.com/download
域名可以使用 Unicode 字符指定。在执行 HTTP 检查时,它们会自动转换为 ASCII 的 punycode 形式。
Parse 按钮可用于将可选查询字段(如 ?name=Admin&password=mypassword)从 URL 中分离出来,并将属性和值移入 Query fields 中,以便自动进行 URL 编码。
限制为 2048 个字符。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_URL cURL 选项。
Query fields URL 的变量(见上文)。
以属性和值对的形式指定。
值会自动进行 URL 编码。来自宏的值会先被解析,然后自动进行 URL 编码。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_URL cURL 选项。
Request type 选择请求方法类型:GETPOSTPUTHEAD
Request body type 选择请求体类型:
Raw data - 自定义 HTTP 请求体,宏会被替换,但不会执行编码
JSON data - JSON 格式的 HTTP 请求体。宏可作为字符串、数字、true 和 false 使用;作为字符串使用的宏必须用双引号括起来。来自宏的值会先被解析,然后自动进行转义。如果未在标头中指定 "Content-Type",则默认使用 "Content-Type: application/json"
XML data - XML 格式的 HTTP 请求体。宏可用作文本节点、属性或 CDATA 段。来自宏的值在文本节点和属性中会先被解析,然后自动进行转义。如果未在标头中指定 "Content-Type",则默认使用 "Content-Type: application/xml"
Request body 输入请求体。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
Headers 执行请求时将发送的自定义 HTTP 标头。
以属性和值对的形式指定。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_HTTPHEADER cURL 选项。
Required status codes 期望的 HTTP 状态码列表。如果 Zabbix 获取到的状态码不在该列表中,则该监控项将变为不支持。如果留空,则不执行检查。
例如:200,201,210-299
列表中支持的宏:用户宏,低级别发现宏。
这将使用 CURLINFO_RESPONSE_CODE cURL 选项。
Follow redirects 勾选此复选框以跟随 HTTP 重定向。
这将设置 CURLOPT_FOLLOWLOCATION cURL 选项。
Retrieve mode 选择必须获取的响应部分:
Body - 仅正文
Headers - 仅标头
Body and headers - 正文和标头
Convert to JSON 如果 Retrieve mode 未设置为 Body,则标头会作为属性和值对保存在 "header" 键下。
如果遇到 'Content-Type: application/json',则正文会保存为对象;否则将保存为字符串,例如:
HTTP proxy 您可以指定要使用的 HTTP proxy,格式为 [protocol://][username[:password]@]proxy.example.com[:port]
可选的 protocol:// 前缀可用于指定其他 proxy 协议(例如 https、socks4、socks5;参见文档;协议前缀支持是在 cURL 7.21.7 中添加的)。如果未指定协议,则该 proxy 将被视为 HTTP proxy。如果指定了错误的协议,连接将失败,且该监控项将变为不支持。
默认将使用 1080 端口。
如果指定了 proxy,它将覆盖诸如 http_proxy、HTTPS_PROXY 之类与 proxy 相关的环境变量。如果未指定,则 proxy 不会覆盖与 proxy 相关的环境变量。输入的值会按“原样”传递,不进行合理性检查。
注意,HTTP proxy 仅支持简单认证。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_PROXY cURL 选项。
HTTP authentication 选择认证选项:
None - 不使用认证;
Basic - 使用基本认证;
NTLM - 使用 NTLM(Windows NT LAN Manager)认证;
Kerberos - 使用 Kerberos 认证(另请参见:使用 Zabbix 配置 Kerberos);
Digest - 使用 Digest 认证。
这将设置 CURLOPT_HTTPAUTH cURL 选项。
User name 输入用户名(最多 255 个字符)。
HTTP authentication 设置为 Basic、NTLM、Kerberos 或 Digest 时,此字段可用。支持用户宏和低级别发现宏。
Password 输入用户密码(最多 255 个字符)。
HTTP authentication 设置为 Basic、NTLM、Kerberos 或 Digest 时,此字段可用。支持用户宏和低级别发现宏。
SSL verify peer 勾选此复选框以验证 Web 服务器的 SSL 证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。您可以使用 Zabbix 服务器或 proxy 配置参数 SSLCALocation 覆盖 CA 文件的位置。
这将设置 CURLOPT_SSL_VERIFYPEER cURL 选项。
SSL verify host 勾选此复选框以验证 Web 服务器证书中的 Common Name 字段或 Subject Alternate Name 字段是否匹配。
这将设置 CURLOPT_SSL_VERIFYHOST cURL 选项。
SSL certificate file 用于客户端认证的 SSL 证书文件名称。证书文件必须为 PEM1 格式。如果证书文件中同时包含私钥,请将 SSL key file 字段留空。如果密钥已加密,请在 SSL key password 字段中指定密码。包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLCertLocation 指定。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_SSLCERT cURL 选项。
SSL key file 用于客户端认证的 SSL 私钥文件名称。私钥文件必须为 PEM1 格式。包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLKeyLocation 指定。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,低级别发现宏。
这将设置 CURLOPT_SSLKEY cURL 选项。
SSL key password SSL 私钥文件密码。
支持的宏:用户宏,低级别发现宏。
这将设置 CURLOPT_KEYPASSWD cURL 选项。
Timeout Zabbix 在处理该 URL 时花费的时间不会超过设定值(1-600 秒)。实际上,此参数定义了连接到该 URL 的最长时间以及执行 HTTP 请求的最长时间。因此,Zabbix 在一次检查中花费的时间不会超过 2 x Timeout 秒。
这将设置 CURLOPT_TIMEOUT cURL 选项。
有关 Timeout 参数的更多信息,请参见监控项通用属性
Enable trapping 勾选此复选框后,该监控项还将作为 trapper 监控项运行,并接受使用 Zabbix sender 工具或 Zabbix sender 协议 发送到 Zabbix 服务器或 proxy 的数据,或者接受使用 history.push API 方法发送到 Zabbix 服务器的数据。有关发送数据的更多信息,请参见:Trapper 监控项
Allowed hosts 仅当勾选 Enable trapping 复选框时可见。
以逗号分隔的 IP 地址列表,可选 CIDR 表示法,或 DNS 名称。
如果指定,则仅接受来自此处列出主机的传入连接。
如果启用了 IPv6 支持,则 '127.0.0.1'、'::127.0.0.1'、'::ffff:127.0.0.1' 被视为等同,且 '::/0' 将允许任何 IPv4 或 IPv6 地址。
'0.0.0.0/0' 可用于允许任何 IPv4 地址。
请注意,“IPv4-compatible IPv6 addresses”(0000::/96 前缀)受支持,但已被 RFC4291 弃用。
示例:127.0.0.1, 192.168.1.0/24, 192.168.3.1-255, 192.168.1-10.1-255, ::1,2001:db8::/32, mysqlserver1, zabbix.example.com, {HOST.HOST}
此字段中允许空格和用户宏
此字段中允许使用主机宏:{HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN}。

如果 HTTP proxy 字段留空,另一种 使用 HTTP proxy 的方式是设置与 proxy 相关的环境变量。

对于 HTTP —— 为 Zabbix 服务器用户设置 http_proxy 环境变量。例如:
http_proxy=http://proxy_ip:proxy_port

对于 HTTPS —— 设置 HTTPS_PROXY 环境变量。例如:
HTTPS_PROXY=http://proxy_ip:proxy_port。更多详细信息可通过 运行 shell 命令查看:# man curl

[1] Zabbix 仅支持 PEM 格式的证书和私钥 文件。如果您的证书和私钥数据位于 PKCS #12 格式文件中 (通常扩展名为 *.p12 或 *.pfx),您可以使用以下命令从中生成 PEM 文件:

openssl pkcs12 -in ssl-cert.p12 -clcerts -nokeys -out ssl-cert.pem
openssl pkcs12 -in ssl-cert.p12 -nocerts -nodes  -out ssl-cert.key

示例

示例 1

发送简单的 GET 请求以从服务如 Elasticsearch 中获取数据:

  • 创建一个 GET 类型的监控项,其 URL 设置为 localhost:9200/?pretty
  • 注意响应结果:
    {
      "name" : "YQ2VAY-",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "kH4CYqh5QfqgeTsjh2F9zg",
      "version" : {
        "number" : "6.1.3",
        "build_hash" : "af51318",
        "build_date" : "2018-01-26T18:22:55.523Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You know, for search"
    }
  • 现在可以使用JSONPath 预处理步骤获取版本号信息: $.version.number
示例 2

发送简单的 POST 请求以从服务如 Elasticsearch 中获取数据:

  • 创建一个 POST 类型的监控项,URL 设置为: http://localhost:9200/str/values/_search?scroll=10s
  • 设置以下 POST 请求正文来获取处理器的负载情况(每核的 1 分钟平均值)
    {
        "query": {
            "bool": {
                "must": [{
                    "match": {
                        "itemid": 28275
                    }
                }],
                "filter": [{
                    "range": {
                        "clock": {
                            "gt": 1517565836,
                            "lte": 1517566137
                        }
                    }
                }]
            }
        }
    }
  • 得到响应:
    {
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR",
        "took": 18,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 1,
            "max_score": 1.0,
            "hits": [{
                "_index": "dbl",
                "_type": "values",
                "_id": "dqX9VWEBV6sEKSMyk6sw",
                "_score": 1.0,
                "_source": {
                    "itemid": 28275,
                    "value": "0.138750",
                    "clock": 1517566136,
                    "ns": 25388713,
                    "ttl": 604800
                }
            }]
        }
    }
  • 现在可以使用 JSONPath 预处理步骤来获取监控项的值: $.hits.hits[0]._source.value
示例 3

检查Zabbix API是否可用,可以用apiinfo.version 这个接口

  • 监控项配置:

注意使用POST方法传输JSON数据,设定请求头并仅要求检索头信息:

  • 配置监控项值的预处理功能,使用正则表达式方法获取HTTP响应代码:

  • 最新数据 中检查最新获取的数据:

示例 4

通过连接到 Openweathermap 检索天气信息公共服务。

  • 配置主要监控项将大量数据收集到一个简单JSON对象:

注意在query的字段中使用宏。参考 Openweathermap API文档 来了解如何填写它们。

一个简单JSON对象会被返回给HTTPS agent:

{
    "body": {
        "coord": {
            "lon": 40.01,
            "lat": 56.11
        },
        "weather": [{
            "id": 801,
            "main": "Clouds",
            "description": "few clouds",
            "icon": "02n"
        }],
        "base": "stations",
        "main": {
            "temp": 15.14,
            "pressure": 1012.6,
            "humidity": 66,
            "temp_min": 15.14,
            "temp_max": 15.14,
            "sea_level": 1030.91,
            "grnd_level": 1012.6
        },
        "wind": {
            "speed": 1.86,
            "deg": 246.001
        },
        "clouds": {
            "all": 20
        },
        "dt": 1526509427,
        "sys": {
            "message": 0.0035,
            "country": "RU",
            "sunrise": 1526432608,
            "sunset": 1526491828
        },
        "id": 487837,
        "name": "Stavrovo",
        "cod": 200
    }
}

下一个任务是配置依赖监控项从这个JSON对象中导出必要的数据。

  • 配置一个简单的依赖监控项获取湿度数据:

其他天气指标,如“温度”,同理,以相同的方式添加。

  • 使用 JSONPath 进行监控项值的依赖监控项预处理:

  • 最新数据中查看天气数据的结果。

示例 5

连接到 Nginx 状态页面,并批量获取其指标。

  • 根据 官方指南配置 Nginx.
  • 为批量数据收集配置一个主监控项:

示例 Nginx 状态页面输出可能如下所示:

Active connections: 1 Active connections:
server accepts handled requests
 52 52 52 
Reading: 0 Writing: 1 Waiting: 0

接下来的任务是配置提取数据的依赖监控项。

  • 为每秒请求数配置一个示例依赖监控项:

  • 使用正则表达式进行示例依赖监控项值的预处理: server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+):

  • 最新数据中检查来自 stub 模块的完整结果