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, PUT 或 HEAD |
请求体的类型 | 选择请求体的类型: 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 模块的完整结果