这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.
2022 Zabbix中国峰会
2022 Zabbix中国峰会

16 HTTP 代理

概述

此监控项类型允许使用HTTP/HTTPS协议进行数据轮询。使用Zabbix sender或Zabbix sender协议也可以进行捕获。

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

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

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

了解何时使用HTTPS协议,另请参阅已知问题

Zabbix server/proxy必须首先配置cURL(libcurl)支持。

配置

配置HTTP监控项:

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

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

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

参数 描述
类型 此处选择 HTTP代理
键值 输入用于识别监控项唯一性的键.
URL 连接和检索数据的URL. 例如:
https://www.example.com
http://www.example.com/download
可以用Unicode字符指定域名。 在执行web场景步骤时,它们将自动转换为ASCII。分析 可以使用分析按钮将可选查询字段(比如?name=Admin&password=mypassword)与URL分离,将属性和值移动到查询字段中,以便自动URL编码. 限制在2048个字符。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 底层自动发现宏
这是设置CURLOPT_URL cURL选项
查询字段 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
超时 Zabbix不会花超过设定的时间来处理URL (1~60秒)。实际上,这个参数定义了连接URL的最大时间和执行HTTP请求的最大时间。 因此,Zabbix不会在一次检查中花费超过2倍的超时时间。
支持时间后缀, 例如 30s, 1m
支持的宏: 用户宏, 底层自动发现宏。
设置cURL选项 CURLOPT_TIMEOUT
请求体类型 设定请求体的类型
原始数据 - 自定义HTTP请求体,替换宏,但不执行编码。
JSON 数据 - HTTP请求体是JSON格式的, 宏可以用作字符串、数字、真和假;用作字符串的宏必须包含在双引号中。从宏中解析值,然后自动转义。 如果没有指定header,那么服务器将把默认的header值设置为"Content-Type: application/json"
XML 数据 - HTTP请求体的XML格式。 宏可以用作文本节点、属性或CDATA部分。 从宏中解析值,然后在文本节点和属性中自动转义。 如果没有指定header "Content-Type" 的值,那么服务器将把默认的header值设置为 "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}, 用户宏, 底层自动发现宏。
设置 CURLOPT_HTTPHEADER cURL 选项.
期望的状态码 期望的HTTP状态码的列表。 如果Zabbix得到不在列表中的代码,那么这个监控项将变为不受支持状态。如果为空,则不执行检查。
例如: 200,201,210-299
列表里支持的宏: 用户宏, 底层自动发现宏。
这使用了 CURLINFO_RESPONSE_CODE cURL选项。
跟随跳转 标记单选框使监控项跟随HTTP重定向。
这使用了 CURLOPT_FOLLOWLOCATION cURL选项。
恢复模式 选择响应中必须检索的部分:
Body - 仅主体
Headers - 仅头部
Body and headers - 主体和头部
转换为JSON 头文件作为属性和值对保存在"header" 键下。
如果遇到 'Content-Type: application/json' 主体被保存为对象,否则它被存储为string, 例如:
HTTP 代理 可以使用格式[protocol://][username[:password]@]proxy.mycompany.com[:port]指定要使用的HTTP代理。
其中 protocol:// 部分作为协议前缀可以用于指定代理协议 (例如 https, socks4, socks5; 查看 文档; 协议前缀的支持被添加于cURL 7.21.7)。
如果不指定代理协议,将会视为使用HTTP代理。 如果您指定了错误的协议,那么连接将失败且监控项将不受支持。 由于没有指定协议,代理将被视为HTTP代理。
默认将使用1080端口。
如果指定本参数,代理信息将覆盖与代理相关的环境变量,如 http_proxy, HTTPS_PROXY等。
如果本参数未指定,代理信息将不会覆盖与代理相关的环境变量。相关的值将会以“原样”传入,不会做健全性检查。
注意 HTTP代理只支持简单的身份验证。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 底层自动发现宏。
设置 CURLOPT_PROXY cURL 选项。
HTTP 认证 验证类型:
None - 不使用身份验证。
Basic authentication - 使用基本身份验证。
NTLM authentication - 使用NTLM (Windows NT LAN Manager) 验证。
Kerberos - 使用Kerberos验证。详见 为Zabbix配置Kerberos
Digest - 使用Digest验证。
选择身份验证方法后,展示输入用户名和密码提供两个额外字段的输入框,这里支持使用用户宏和底层自动发现宏。
设置 CURLOPT_HTTPAUTH cURL 选项。
SSL验证对端 勾选复选框以开启配置需要验证web服务器的ssl证书。
服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。 可以使用Zabbix服务器或代理配置参数SSLCALocation重写CA文件的位置。
这设置的是cURL 选项 CURLOPT_SSL_VERIFYPEER
SSL验证主机 勾选复选框以开启验证web服务器证书的通用名称字段或主体备用名称字段是否匹配。
这设置的是cURL 选项CURLOPT_SSL_VERIFYHOST
*SSL证书文件** 用于客户端认证的SSL证书文件名称。这个证书文件必须是PEM1格式的。
如果证书文件内包含私钥,则SSL key file 字段请留空。如果密钥是加密的,需要设置SSL key password 字段配置加密密钥的密码。检索文件的目录,需要在Zabbix Server或Zabbix Proxy的配置文件中指定SSLCertLocation参数。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,底层自动发现宏。
这配置的是cURL 选项CURLOPT_SSLCERT
SSL密钥文件 用于客户端认证的SSL私钥文件名称。这个证书文件必须是PEM1格式的。检索文件的目录,需要在Zabbix Server或Zabbix Proxy的配置文件中指定SSLCertLocation参数。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏,底层自动发现宏。
这配置的是cURL 选项 CURLOPT_SSLKEY
SSL密钥密码 SSL私钥文件密码。
支持的宏: 用户宏,底层自动发现宏。
这配置的是cURL 选项 CURLOPT_KEYPASSWD
启用trapping 勾选此复选框,此监控项也可以被作为trapper监控项 ,也就是可以接受数据从Zabbix sender工具发送或使用Zabbix sender协议上报的数据。
允许的主机 仅在勾选启用trapping 复选框后可见。
以逗号分隔的IP地址列表,也可使用CIDR表示法或主机名
如果本字段被指定,只有来自被列出的主机的入站连接才会被接受。
如果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 prefix) 根据RFC4291已经被废弃。
示例:
Server=127.0.0.1, 192.168.1.0/24, 192.168.3.1-255, 192.168.1-10.1-255, ::1,2001:db8::/32, zabbix.domain
空格和用户宏在此字段可以使用。
下列主机宏可以用于此字段: {HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN} 。

如果 HTTP代理 字段留空,环境变量中设定的其他HTTP代理相关设置将被应用

对于HTTP访问 - 为Zabbix server 进程用户设定 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:

  • 创建一个从URL localhost:9200/?pretty GET 的监控项
  • 注意获得的相应内容:
{
         "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状态也输出如下:

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