16 HTTP 代理

概述

这种监控项类型允许通过 HTTP/HTTPS 协议来轮询数据。 还可以利用 Zabbix sender 工具或 Zabbix sender protocol (用于向 Zabbix server 或proxy 发送数据),或者使用 history.push API 方法(用于向 Zabbix 服务器发送数据)来进行数据捕获(trapping)。

监控项检查由Zabbix server执行,然而,当主机由Zabbix proxy监控时,HTTP监控项检查由proxy执行。

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

HTTP代理支持HTTP和HTTPS。Zabbix将根据需要可选地跟随重定向(见下面的跟随重定向选项)。重定向的最大数量硬编码为10(使用cURL选项CURLOPT_MAXREDIRS)。

Zabbix server/proxy在初始配置时必须支持 cURL(libcurl)。

HTTP检查是异步执行的 - 在开始其他检查之前,不需要接收到一个请求的响应。DNS解析也是异步的。

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

异步HTTP代理轮询器的数量由StartHTTPAgentPollers 参数定义。

自Zabbix 7.0版本起,HTTP代理检查增加了cURL的持久连接特性。

配置

配置HTTP监控项:

  • 进入: 配置主机
  • 在主机的那行点击 监控项
  • 点击 创建监控项
  • 在表格中输入监控项的参数

所有标有红色星号的为必填字段。

需要的HTTP监控项特定信息的字段是:

参数 描述
类型 此处选择 HTTP代理
键值 输入用于识别监控项唯一性的键。
URL地址 连接和检索数据的URL。 例如:
https://www.example.com
http://www.example.com/download
域名可以指定为 Unicode 字符。在执行 HTTP 检查时,它们会自动转换成 Punycode 编码的 ASCII 字符。
解析按钮可以用来把 URL 中的可选查询字段(例如 ?name=Admin&password=mypassword)分离出来,并将这些属性和值转移到 查询字段 中,以便自动进行 URL 编码。
限制在 2048 个字符以内。
支持的宏: {HOST.IP}、 {HOST.CONN}、 {HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏, 低级别发现宏。
这配置了 cURL 的 CURLOPT_URL 选项。
查询字段 URL 的变量(参见上文)。
指定为属性和值对。
值会自动进行 URL 编码。来自宏的值会在解析之后自动进行 URL 编码。
支持的宏: {HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
这配置了 cURL 的CURLOPT_URL 选项。
请求方式类型 选择请求方法类型:GET, POST, PUTHEAD
请求体的类型 选择请求体的类型:
Raw data - 自定义 HTTP 请求体,将会替换宏,但不会进行编码处理。
JSON data - HTTP 请求体使用 JSON 格式。宏可以用作字符串、数字、真和假;用作字符串的宏必须用双引号包围。来自宏的值将自动解析并转义。如果在头部没有指定 "Content-Type",则默认设置为 "Content-Type: application/json"。
XML data - HTTP 请求体使用 XML 格式。宏可以作为文本节点、属性或者 CDATA 节使用。来自宏的值会在文本节点和属性中自动解析并进行转义处理。如果在头部没有指定 "Content-Type",则默认设置为 "Content-Type: application/xml"。
注意 选择 XML 数据 选项需要 libxml2 支持。
请求体 输入请求体。
支持的宏: {HOST.IP}、 {HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、 {ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏, 低级别发现宏。
头部信息 执行请求时将发送的自定义 HTTP 头信息。
指定为属性和值对。
支持的宏: {HOST.IP}、{HOST.CONN}、 {HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏
这配置了 cURL 的CURLOPT_HTTPHEADER 选项。
请求状态代码 预期的 HTTP 状态代码列表。如果 Zabbix 收到的代码不在列表中,该监控项将变为不支持。如果为空,则不执行检查。
例如: 200,201,210-299
列表中支持的宏:用户宏,低级别发现宏
这配置了 cURL 的 CURLINFO_RESPONSE_CODE 选项。
跟随重定向 选中该复选框以启用 HTTP 重定向跟踪。
这配置了 cURL 的 CURLOPT_FOLLOWLOCATION 选项。
检索模式 选择必须检索的响应部分:
Body - 仅正文。
Headers - 仅获取头部信息。
Body and headers - 正文以及头部信息。
转换为 JSON 格式 头部信息作为属性和值对的形式存储,在 "header" 键下面。
如果遇到 'Content-Type: application/json',则正文被保存为对象;否则,它被存储为字符串,例如:
HTTP proxy 您可以指定一个 HTTP 代理来使用,格式为[protocol://][username[:password]@]proxy.example.com[:port].
可选的 protocol:// 前缀可用于指定其他代理协议 (例如: https、socks4、socks5; 参见文档; 协议前缀支持是在 cURL 7.21.7 中添加的). 如果没有指定协议,代理将被视为 HTTP 代理。如果您指定了错误的协议,连接将失败,并且监控项将变为不支持。
默认情况下,将使用 1080 端口。
如果指定了代理,它将覆盖http_proxy, HTTPS_PROXY等与代理相关的环境变量。如果没有指定,代理将不会覆盖与代理相关的环境变量。输入的值将"as is"传递,不会进行任何健全性检查。
注意 仅支持 HTTP 代理的简单认证。
支持的宏: {HOST.IP}、 {HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
这配置了 cURL 的 CURLOPT_PROXY 选项。
HTTP认证 选择认证方式:
- 不使用认证;
基础 - 使用基本认证;
NTLM -使用 NTLM(Windows NT LAN Manager) 认证;
Kerberos - 使用 Kerberos 认证(参见:Configuring Kerberos with Zabbix);
Digest - 使用Digest认证。
这配置了 cURL 的CURLOPT_HTTPAUTH 选项。
用户名 输入用户名(最多 255 个字符)。
如果将HTTP 认证设置为基本、NTLM、Kerberos 或Digest,此字段可用。支持用户宏和低级别发现宏。
密码 输入用户密码(最多 255 个字符)。
如果将 HTTP 认证 设置为基本、NTLM、Kerberos 或Digest,此字段可用。支持用户宏和低级发现宏。
SSL验证对等 勾选复选框以验证 Web 服务器的 SSL 证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。您可以使用 Zabbix server 或proxy 配置参数 SSLCALocation 覆盖 CA 文件的位置。
这将设置 cURL 选项 CURLOPT_SSL_VERIFYPEER
SSL验证主机 勾选复选框以验证 Web 服务器证书中的通用名称字段或主题备用名称字段是否匹配。
这将设置 cURL 选项 CURLOPT_SSL_VERIFYHOST
SSL证书文件 用于客户端认证的 SSL 证书文件的名称。证书文件必须为 PEM1 格式。如果证书文件还包含私钥,请将 SSL 密钥文件字段留空。如果密钥被加密,请在 SSL 密钥密码字段中指定密码。包含此文件的目录由 Zabbix server 或proxy 配置参数 SSLCertLocation 指定。
支持的宏: {HOST.IP}、{HOST.CONN}、 {HOST.DNS}、{HOST.HOST}、{HOST.NAME}、 {ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏, 低级别发现宏.
这将设置 cURLCURLOPT_SSLCERT 选项。
SSL密钥文件 用于客户端认证的 SSL 私钥文件的名称。私钥文件必须为 PEM1 格式。包含此文件的目录由 Zabbix server 或proxy 配置参数 SSLKeyLocation 指定。
支持的宏: {HOST.IP}、 {HOST.CONN}、{HOST.DNS}、{HOST.HOST}、 {HOST.NAME}、{ITEM.ID}、{ITEM.KEY}、 {ITEM.KEY.ORIG}、用户宏、低级别发现宏。
这将设置 cURLCURLOPT_SSLKEY 选项。
SSL密钥密码 SSL 私钥文件密码。
支持的宏: 用户宏、低级别发现宏
这将设置 cURLCURLOPT_KEYPASSWD 选项。
超时 Zabbix 在处理 URL 上不会花费超过设定时间(1-600 秒)。实际上,此参数定义了与 URL 建立连接的最大时间以及执行 HTTP 请求的最大时间。因此,Zabbix 在一个检查上不会花费超过 2 x 超时 秒。
这将设置 cURL CURLOPT_TIMEOUT 选项。
有关 超时参数的更多信息,请参见general item attributes.
启用trapping 如果勾选此复选框,监控项将用于trap监控项,并将接受发送到 Zabbix server 或 proxy的数据,使用 Zabbix sender 实用程序或 Zabbix sender 协议,或将接受发送到 Zabbix 服务器的数据,使用history.push API 方法。有关发送数据的更多信息,请参见:Trapper items.
允许的主机 仅在勾选启用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 地址。
请注意,支持但已由 RFC4291弃用的 "与 IPv4 兼容的 IPv6 地址"(0000::/96 前缀)。
示例: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}
此字段允许使用空格和user macros
此字段允许使用主机宏: {HOST.HOST}、{HOST.NAME}、 {HOST.IP}、{HOST.DNS}、{HOST.CONN} 。

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

对于 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 模块的完整结果