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监控项:

  • 进入: ConfigurationHosts
  • 在主机的那行点击 Items
  • 点击 Create item
  • 在表格中输入监控项的参数
  • 16 HTTP 代理 - 图1

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

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

Type此处选择 HTTP代理
Key输入用于识别监控项唯一性的键.
URL连接和检索数据的URL. 例如:
https://www.example.com
http://www.example.com/download
可以用Unicode字符指定域名。 在执行web场景步骤时,它们将自动转换为ASCII。Parse 可以使用Parse按钮将可选查询字段(比如?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选项
Query fieldsURL的变量 (参见上文).
指定为属性和值对。
值是自动的URL编码。
从宏中解析值,然后自动编码url 支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级别自动发现宏.
设置cURL选项 CURLOPT_URL
Request type选择请求的类型:GET, POST, PUTHEAD
TimeoutZabbix不会花超过设定的时间来处理URL (1~60秒)。实际上,这个参数定义了连接URL的最大时间和执行HTTP请求的最大时间。 因此,Zabbix不会在一次检查中花费超过2倍的超时时间。
支持时间后缀, 例如 30s, 1m
支持的宏: 用户宏, 低级别发现宏。
设置cURL选项 CURLOPT_TIMEOUT
Request body type设定请求体的类型
Raw data - 自定义HTTP请求体,替换宏,但不执行编码。
JSON data - HTTP请求体是JSON格式的, 宏可以用作字符串、数字、真和假;用作字符串的宏必须包含在双引号中。从宏中解析值,然后自动转义。 如果没有指定header,那么服务器将把默认的header值设置为”Content-Type: application/json”
XML data - HTTP请求体的XML格式。 宏可以用作文本节点、属性或CDATA部分。 从宏中解析值,然后在文本节点和属性中自动转义。 如果没有指定header “Content-Type” 的值,那么服务器将把默认的header值设置为 “Content-Type: application/xml”
注意 选择 XML data , 需要libxml2的支持。
Request body输入请求体
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级别自动发现宏。
Headers执行请求时将发送的自定义HTTP头。
指定为属性和值对。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {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头文件作为属性和值对保存在”header” 键下。
如果遇到 ‘Content-Type: application/json’ 主体被保存为对象,否则它被存储为string, 例如:
16 HTTP 代理 - 图2
HTTP proxy可以使用格式[protocol://][username[:password]@]proxy.mycompany.com[:port]指定要使用的HTTP代理。
其中 protocol:// 部分作为协议前缀可以用于指定代理协议 (例如 https, socks4, socks5; 查看 文档; 协议前缀的支持被添加于cURL 7.21.7)。
如果不指定代理协议,将会视为使用HTTP代理。 如果您指定了错误的协议,那么连接将失败且监控项将不受支持。 由于没有指定协议,代理将被视为HTTP代理。
默认将使用1080端口。
如果指定本参数,代理信息将覆盖与代理相关的环境变量,如h 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 authentication验证类型:
None - 不使用身份验证。
Basic authentication - 使用基本身份验证。
NTLM authentication - 使用NTLM (Windows NT LAN Manager) 验证。
Kerberos - 使用Kerberos验证。详见 为Zabbix配置Kerberos
Digest - 使用Digest验证。
选择身份验证方法后,展示输入用户名和密码提供两个额外字段的输入框,这里支持使用用户宏和低级别自动发现宏。
设置 CURLOPT_HTTPAUTH cURL 选项。
SSL verify peer勾选复选框以开启配置需要验证web服务器的ssl证书。
服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。 可以使用Zabbix服务器或代理配置参数SSLCALocation重写CA文件的位置。
这设置的是cURL 选项 CURLOPT_SSL_VERIFYPEER
SSL verify host勾选复选框以开启验证web服务器证书的通用名称字段或主题备用名称字段是否匹配。
这设置的是cURL 选项CURLOPT_SSL_VERIFYHOST
SSL certificate file*用于客户端认证的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 key file用于客户端认证的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 key passwordSSL私钥文件密码。
支持的宏: 用户宏,低级别自动发现宏。
这配置的是cURL 选项 CURLOPT_KEYPASSWD
Enable trapping勾选此复选框,此监控项也可以被作为trapper监控项 ,也就是可以接受数据从Zabbix sender工具发送或使用Zabbix sender协议上报的数据。
Allowed hosts仅在勾选Enable 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 proxy 字段留空,环境变量中设定的其他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格式文件:

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

示例

示例 1

发送一个简单GET请求,以从其他服务获取数据。案例为Elasticsearch:

  • 创建一个从URL localhost:9200/?pretty GET 的监控项
  • 注意获得的相应内容:
  1. {
  2. "name" : "YQ2VAY-",
  3. "cluster_name" : "elasticsearch",
  4. "cluster_uuid" : "kH4CYqh5QfqgeTsjh2F9zg",
  5. "version" : {
  6. "number" : "6.1.3",
  7. "build_hash" : "af51318",
  8. "build_date" : "2018-01-26T18:22:55.523Z",
  9. "build_snapshot" : false,
  10. "lucene_version" : "7.1.0",
  11. "minimum_wire_compatibility_version" : "5.6.0",
  12. "minimum_index_compatibility_version" : "5.0.0"
  13. },
  14. "tagline" : "You know, for search"
  15. }
  • 现在可以使用JSONPath 预处理步骤获取版本号信息: $.version.number
示例 2

发送一个简单POST请求,从其他服务抓取数据。以Elasticsearch为例:

  • 创建一个POST监控项使用此URL: http://localhost:9200/str/values/_search?scroll=10s
  • 配置以下的POST请求体获取处理器负载(1分钟平均值/核心)
  1. {
  2. "query": {
  3. "bool": {
  4. "must": [{
  5. "match": {
  6. "itemid": 28275
  7. }
  8. }],
  9. "filter": [{
  10. "range": {
  11. "clock": {
  12. "gt": 1517565836,
  13. "lte": 1517566137
  14. }
  15. }
  16. }]
  17. }
  18. }
  19. }
  • 得到响应:
  1. {
  2. "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR",
  3. "took": 18,
  4. "timed_out": false,
  5. "_shards": {
  6. "total": 5,
  7. "successful": 5,
  8. "skipped": 0,
  9. "failed": 0
  10. },
  11. "hits": {
  12. "total": 1,
  13. "max_score": 1.0,
  14. "hits": [{
  15. "_index": "dbl",
  16. "_type": "values",
  17. "_id": "dqX9VWEBV6sEKSMyk6sw",
  18. "_score": 1.0,
  19. "_source": {
  20. "itemid": 28275,
  21. "value": "0.138750",
  22. "clock": 1517566136,
  23. "ns": 25388713,
  24. "ttl": 604800
  25. }
  26. }]
  27. }
  28. }
  • 现在可以使用JSONPath 预处理步骤获取监控项的值: $.hits.hits[0]._source.value
示例 3

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

  • 监控项配置:

16 HTTP 代理 - 图3

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

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

16 HTTP 代理 - 图4

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

16 HTTP 代理 - 图5

示例 4

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

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

16 HTTP 代理 - 图6

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

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

  1. {
  2. "body": {
  3. "coord": {
  4. "lon": 40.01,
  5. "lat": 56.11
  6. },
  7. "weather": [{
  8. "id": 801,
  9. "main": "Clouds",
  10. "description": "few clouds",
  11. "icon": "02n"
  12. }],
  13. "base": "stations",
  14. "main": {
  15. "temp": 15.14,
  16. "pressure": 1012.6,
  17. "humidity": 66,
  18. "temp_min": 15.14,
  19. "temp_max": 15.14,
  20. "sea_level": 1030.91,
  21. "grnd_level": 1012.6
  22. },
  23. "wind": {
  24. "speed": 1.86,
  25. "deg": 246.001
  26. },
  27. "clouds": {
  28. "all": 20
  29. },
  30. "dt": 1526509427,
  31. "sys": {
  32. "message": 0.0035,
  33. "country": "RU",
  34. "sunrise": 1526432608,
  35. "sunset": 1526491828
  36. },
  37. "id": 487837,
  38. "name": "Stavrovo",
  39. "cod": 200
  40. }
  41. }

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

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

16 HTTP 代理 - 图7

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

  • 使用JSONPath来配置简单的从属监控项的值预处理步骤:

16 HTTP 代理 - 图8

  • 最新数据 中检查天气数据的结果:

16 HTTP 代理 - 图9

示例 5

链接Nginx状态页面,批量获取它的指标。

  • 根据 官方指南配置NGINX。

  • 配置一个主要监控项批量收集数据:

16 HTTP 代理 - 图10

简单的Nginx状态也输出如下:

  1. Active connections: 1 Active connections:
  2. server accepts handled requests
  3. 52 52 52
  4. Reading: 0 Writing: 1 Waiting: 0

下一个任务是任务是配置从属监控项提取数据。

  • 配置简单从属监控项名以采集每秒请求数数据:

16 HTTP 代理 - 图11

  • 这个简单从属监控项,需要配置正则表达式预处理步骤 server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+):

16 HTTP 代理 - 图12

  • 对所有数据都配置好了从属监控项后,在 最新数据 中,可以查看到来自stub模块的完整结果

16 HTTP 代理 - 图13