16 HTTP 代理

概览

此监控项类型允许使用HTTP/HTTPS协议进行数据轮询。 也可以使用Zabbix sender工具或Zabbix发送器protocol(用于向Zabbix server或proxy发送数据),或使用{CODE_19368bdd}API方法(用于向Zabbix server发送数据)进行陷阱捕获。

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

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

HTTPagent同时支持HTTP和HTTPS。Zabbix将可选地跟随重定向(参见下面的跟随重定向选项)。重定向的最大数量被硬编码为10(使用cURL选项CURLOPT_MAXREDIRS)。

Zabbix server/proxy最初必须配置有cURL(libcurl)支持。

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

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

异步HTTPagent轮询器的数量由StartHTTPAgentPollers参数定义。

自Zabbix 7.0起,HTTPagent检查中添加了cURL的持久连接功能。

配置

要配置一个HTTP 监控项:

  • 请导航至:数据收集主机
  • 点击主机行中的 监控项
  • 点击 创建 监控项
  • 在表单中输入 监控项 的参数

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

需要为HTTP 监控项 提供特定信息的字段为:

参数 描述
Type 在这里选择 HTTP agent
Key 输入一个唯一的 监控项 键。
URL 要连接并检索数据的URL。例如:
https://www.example.com
http://www.example.com/download
可以使用Unicode字符指定域名。在执行HTTP检查时,域名会自动转换为punycode编码的ASCII字符。
可以使用 解析 按钮从URL中分离出可选的 query 字段(如 ?name=Admin&password=mypassword),将属性和值移动到 query 字段 以进行自动URL编码。
限制为2048个字符。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
这设置了 CURLOPT_URL cURL选项。
Query fields URL的变量(参见上方)。
指定为属性和值对。
值会自动进行URL编码。宏中的值会先解析,然后自动进行URL编码。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
这设置了 CURLOPT_URL cURL选项。
Request type 选择请求方法类型:GET, POST, PUTHEAD
Request body type 选择请求体类型:
原始数据 - 自定义HTTP请求体,宏会被替换,但不会进行编码
JSON数据 - JSON格式的HTTP请求体。宏可以用作 string, 数字,true和false;作为字符串使用的宏必须用双引号括起来。宏中的值会先解析,然后自动进行转义。如果"Content-Type"未在头部指定,则默认为 "Content-Type: application/json"
XML数据 - XML格式的HTTP请求体。宏可以用作文本节点,属性或CDATA部分。宏中的值会先解析,然后在文本节点和属性中自动进行转义。如果"Content-Type"未在头部指定,则默认为 "Content-Type: application/xml"
注意 选择 XML数据 需要libxml2。
Request body 输入请求体。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
Headers 执行请求时将发送的自定义HTTP头部。
指定为属性和值对。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.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 选择要检索的响应部分:
正文 - 仅正文
头部 - 仅头部
正文和头部 - 正文和头部
Convert to JSON 头部作为属性和值对保存在 "header" 键下。
如果遇到 'Content-Type: application/json',则将正文保存为一个 object,否则保存为 string,例如:
HTTP proxy 您可以指定一个 HTTP proxy 来使用,使用格式 [protocol://][username[:password]@]proxy.example.com[:port]
可选的 protocol:// 前缀可用于指定替代的 proxy 协议(例如https, socks4, socks5;参见 documentation;协议前缀支持是在cURL 7.21.7中添加的)。如果没有指定协议,proxy 将被视为一个 HTTP proxy。如果您指定了错误的协议,连接将失败,监控项 将变为不受支持。
默认情况下,将使用1080端口。
如果指定了,proxy 将覆盖与 proxy 相关的环境变量,如http_proxy, HTTPS_PROXY。如果没有指定,proxy 将不会覆盖与 proxy 相关的环境变量。输入的值将“原样”传递,不会进行合理性检查。
注意 HTTP proxy 只支持简单的身份验证。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
这设置了 CURLOPT_PROXY cURL选项。
HTTP authentication 选择身份验证选项:
- 不使用身份验证;
基本 - 使用基本身份验证;
NTLM - 使用NTLM (Windows NT LAN Manager) 身份验证;
Kerberos - 使用Kerberos身份验证(参见:Configuring Kerberos with Zabbix);
摘要 - 使用摘要身份验证。
这设置了 CURLOPT_HTTPAUTH cURL选项。
User name 输入用户名(最多255个字符)。
如果 HTTP身份验证 设置为基本,NTLM,Kerberos或摘要,则此字段可用。支持用户宏和低级发现宏。
Password 输入用户密码(最多255个字符)。
如果 HTTP身份验证 设置为基本,NTLM,Kerberos或摘要,则此字段可用。支持用户宏和低级发现宏。
SSL verify peer 选中复选框以验证Web服务器的SSL证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。您可以使用 Zabbix server 或 proxy 配置参数SSLCALocation覆盖CA文件的位置。
这设置了 CURLOPT_SSL_VERIFYPEER cURL选项。
SSL verify host 选中复选框以验证Web服务器证书的通用名称字段或主题备用名称字段是否匹配。
这设置了 CURLOPT_SSL_VERIFYHOST cURL选项。
SSL certificate file 用于客户端身份验证的SSL证书文件名称。证书文件必须为PEM1格式。如果证书文件中还包含私钥,请留空SSL密钥文件字段。如果密钥已加密,请在SSL密钥密码字段中指定密码。包含此文件的目录由 Zabbix server 或 proxy 配置参数SSLCertLocation指定。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
这设置了 CURLOPT_SSLCERT cURL选项。
SSL key file 用于客户端身份验证的SSL私钥文件名称。私钥文件必须为PEM1格式。包含此文件的目录由 Zabbix server 或 proxy 配置参数SSLKeyLocation指定。
支持的宏:{HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {监控项.ID}, {监控项.KEY}, {监控项.KEY.ORIG}, 用户宏,低级发现宏。
这设置了 CURLOPT_SSLKEY cURL选项。
SSL key password SSL私钥文件密码。
支持的宏:用户宏,低级发现宏。
这设置了 CURLOPT_KEYPASSWD cURL选项。
Timeout Zabbix在处理URL上花费的时间不会超过设定的时间(1-600秒)。实际上,此参数定义了与URL建立连接的最大时间和执行HTTP请求的最大时间。因此,Zabbix在一次检查上花费的时间不会超过2 x 超时时间 秒。
这设置了 CURLOPT_TIMEOUT cURL选项。
有关 超时时间 参数的更多信息,请参见 general item attributes
Enable trapping 如果选中此复选框,监控项 也将作为陷阱 监控项,并接受发送到 Zabbix server 或 proxy 的数据,使用 Zabbix sender 实用程序或Zabbix发送器 protocol,或接受发送到 Zabbix server 的数据,使用 {CODE_19368bdd} API方法。有关发送数据的更多信息,请参见:Trapper items
Allowed hosts 仅在选中 启用陷阱 复选框时可见。
逗号分隔的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兼容IPv6地址”(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}
此字段中允许使用空格和 user macros
主机宏:{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 模块的完整结果