[comment]: # translation:outdated

[comment]: # ({eb22f00a-eb22f00a})
# 16 HTTP agent

[comment]: # ({/eb22f00a-eb22f00a})

[comment]: # ({6871ec1a-a236c83a})
#### 概述

该监控项类型支持通过HTTP/HTTPS协议进行数据轮询。
同时也可使用Zabbix sender或Zabbix sender协议实现陷阱捕获。

HTTP 监控项检查由Zabbix server执行。但当通过Zabbix proxy监控主机时，
HTTP 监控项检查将由proxy执行。

HTTP 监控项检查无需在被监控的一个主机上运行任何agent。

HTTP agent同时支持HTTP和HTTPS协议。Zabbix可选择性地跟随重定向（参见下文*Follow redirects*选项）。
最大重定向次数硬编码为10次（使用cURL选项CURLOPT\_MAXREDIRS）。

::: noteimportant
Zabbix server/proxy必须在初始配置时
启用cURL（libcurl）支持。

:::

[comment]: # ({/6871ec1a-a236c83a})

[comment]: # ({b3693e6e-11697b04})
#### 配置

配置HTTP 监控项的步骤:

-   前往: *配置* → *主机*
-   在主机行中点击*监控项*
-   点击*创建监控项*
-   在表单中输入监控项的参数

![](../../../../../assets/en/manual/config/items/itemtypes/http_item.png)

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

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

| 参数 | 描述 |
|--|--------|
| *Type* | 在此选择**HTTP agent**。 |
| *Key* | 输入唯一的监控项键。 |
| *URL* | 连接并获取数据的URL。例如:<br>https://www.example.com<br>http://www.example.com/download<br>域名可以用Unicode字符指定。执行HTTP检查时会自动转换为ASCII的punycode格式。<br>*解析*按钮可用于将可选的query字段(如?name=Admin&password=mypassword)从URL中分离出来，将属性和值移动到*query字段*进行自动URL编码。<br>限制为2048个字符。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_URL](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) cURL选项。 |
| *Query fields* | URL的变量(见上文)。<br>指定为属性和值对。<br>值会自动进行URL编码。宏的值会被解析后自动进行URL编码。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_URL](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html) cURL选项。 |
| *Request type* | 选择请求方法类型: *GET*, *POST*, *PUT* 或 *HEAD* |
| *Timeout* | Zabbix处理URL的时间不会超过设置的时间(1-60秒)。实际上，此参数定义了连接到URL的最大时间和执行HTTP请求的最大时间。因此，Zabbix在一个检查上花费的时间不会超过2 x 超时秒数。<br>支持时间后缀，例如30s, 1m。<br>支持的宏: 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_TIMEOUT](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html) cURL选项。 |
| *Request body type* | 选择请求体类型:<br>**原始数据** - 自定义HTTP请求体，宏会被替换但不进行编码<br>**JSON数据** - JSON格式的HTTP请求体。宏可以用作string, 数字, true和false; 用作字符串的宏必须用双引号括起来。宏的值会被解析后自动转义。如果未在头中指定"Content-Type"，则默认为"Content-Type: application/json"<br>**XML数据** - XML格式的HTTP请求体。宏可以用作文本节点、属性或CDATA部分。宏的值会被解析后自动在文本节点和属性中转义。如果未在头中指定"Content-Type"，则默认为"Content-Type: application/xml"<br>*注意* 选择*XML数据*需要libxml2。 |
| *Request body* | 输入请求体。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。 |
| *Headers* | 执行请求时发送的自定义HTTP头。<br>指定为属性和值对。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_HTTPHEADER](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) cURL选项。 |
| *Required status codes* | 预期的HTTP状态码列表。如果Zabbix收到的代码不在列表中，监控项将变为不支持。如果为空，则不进行检查。<br>例如: 200,201,210-299<br>列表中支持的宏: 用户宏, 低级发现宏。<br>这使用了[CURLINFO\_RESPONSE\_CODE](https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html) cURL选项。 |
| *Follow redirects* | 勾选复选框以跟随HTTP重定向。<br>这设置了[CURLOPT\_FOLLOWLOCATION](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) cURL选项。 |
| *Retrieve mode* | 选择必须检索的响应部分:<br>**正文** - 仅正文<br>**头** - 仅头<br>**正文和头** - 正文和头 |
| *Convert to JSON* | 头保存为"header"键下的属性和值对。<br>如果遇到'Content-Type: application/json'，则正文保存为object，否则存储为string，例如:<br>![](../../../../../assets/en/manual/config/items/itemtypes/http_conv_json.png) |
| *HTTP proxy* | 可以指定使用的HTTP proxy，格式为`[protocol://][username[:password]@]proxy.example.com[:port]`。<br>可选的前缀`protocol://`可用于指定替代的proxy协议(例如https, socks4, socks5; 参见[documentation](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html); 协议前缀支持在cURL 7.21.7中添加)。如果未指定协议，proxy将被视为HTTP proxy。如果指定了错误的协议，连接将失败，监控项将变为不支持。<br>默认使用1080端口。<br>如果指定，proxy将覆盖proxy相关的环境变量，如http\_proxy, HTTPS\_PROXY。如果未指定，proxy不会覆盖proxy相关的环境变量。输入的值按原样传递，不进行健全性检查。<br>*注意* 仅支持HTTP proxy的简单认证。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_PROXY](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) cURL选项。 |
| *HTTP authentication* | 认证类型:<br>**无** - 不使用认证。<br>**基本** - 使用基本认证。<br>**NTLM** - 使用NTLM([Windows NT LAN Manager)](http://en.wikipedia.org/wiki/NTLM)认证。<br>**Kerberos** - 使用Kerberos认证。另见: [Configuring Kerberos with Zabbix](/manual/appendix/items/kerberos).<br>**摘要** - 使用摘要认证。<br>选择认证方法将提供两个额外的字段用于输入用户名和密码，支持用户宏和低级发现宏。<br>这设置了[CURLOPT\_HTTPAUTH](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) cURL选项。 |
| *SSL verify peer* | 勾选复选框以验证Web服务器的SSL证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。可以使用Zabbix server或proxy配置参数SSLCALocation覆盖CA文件的位置。<br>这设置了[CURLOPT\_SSL\_VERIFYPEER](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) cURL选项。 |
| *SSL verify host* | 勾选复选框以验证Web服务器证书的Common Name字段或Subject Alternate Name字段是否匹配。<br>这设置了[CURLOPT\_SSL\_VERIFYHOST](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) cURL选项。 |
| *SSL certificate file* | 用于客户端认证的SSL证书file的名称。证书file必须是PEM^1^格式。如果证书file也包含私钥，请将SSL密钥file字段留空。如果密钥已加密，请在SSL密钥密码字段中指定密码。包含此file的目录由Zabbix server或proxy配置参数SSLCertLocation指定。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_SSLCERT](http://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) cURL选项。 |
| *SSL key file* | 用于客户端认证的SSL私钥file的名称。私钥file必须是PEM^1^格式。包含此file的目录由Zabbix server或proxy配置参数SSLKeyLocation指定。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_SSLKEY](http://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) cURL选项。 |
| *SSL key password* | SSL私钥file的密码。<br>支持的宏: 用户宏, 低级发现宏。<br>这设置了[CURLOPT\_KEYPASSWD](http://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) cURL选项。 |
| *Enable trapping* | 勾选此复选框后，监控项还将作为[trapper item](/manual/config/items/itemtypes/trapper)运行，并接受Zabbix发送器或使用Zabbix发送器协议发送到此监控项的数据。 |
| *Allowed hosts* | 仅在*启用捕获*复选框勾选时可见。<br>逗号分隔的IP地址列表，可选CIDR表示法或DNS名称。<br>如果指定，则仅接受来自此处列出的主机的传入连接。<br>如果启用了IPv6支持，则'127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1'被视为相同，'::/0'将允许任何IPv4或IPv6地址。<br>'0.0.0.0/0'可用于允许任何IPv4地址。<br>注意"IPv4兼容的IPv6地址"(0000::/96前缀)受支持但已被[RFC4291](https://tools.ietf.org/html/rfc4291#section-2.5.5)弃用。<br>示例: 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}<br>此字段中允许空格和[user macros](/manual/config/macros/user_macros)。<br>主机宏: {HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN}在此字段中允许。 |

::: notetip
如果*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*.

:::

::: noteimportant
 \[1\] Zabbix仅支持PEM格式的证书和私钥文件。如果您有PKCS \#12格式file(通常扩展名为\*.p12或\*.pfx)的证书和私钥数据，可以使用以下命令generate PEM file:

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

:::

[comment]: # ({/b3693e6e-11697b04})

[comment]: # ({4c860844-4c860844})
#### 示例

[comment]: # ({/4c860844-4c860844})

[comment]: # ({67d717da-67d717da})
##### 示例1

发送简单的GET请求以从服务中检索数据
Elasticsearch:

- 创建一个GET 监控项请求，URL为：`localhost:9200/?pretty`
-   注意响应：

```{=html}
<!-- -->
```
{
      "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" : "您知道的，专为搜索而生"
    }

- 现在通过JSONPath预处理步骤提取version数值:
    `$.version.number`

[comment]: # ({/67d717da-67d717da})

[comment]: # ({712fb81c-712fb81c})
##### 示例2

发送简单POST请求以从服务中检索数据
Elasticsearch:

- 创建一个POST 监控项请求，URL为：
    `http://localhost:9200/str/values/_search?scroll=10s`
- 配置以下POST请求体以获取处理器负载(1

    min average per core)

```{=html}
<!-- -->
```
{
        "query": {
            "bool": {
                "must": [{
                    "match": {
                        "itemid": 28275
                    }
                }],
                "filter": [{
                    "range": {
                        "clock": {
                            "gt": 1517565836,
                            "lte": 1517566137
                        }
                    }
                }]
            }
        }
    }

-   已接收:

```{=html}
<!-- -->
```
{
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR"
        "耗时": 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预处理步骤来get监控项值:
    `$.hits.hits[0]._source.value`

[comment]: # ({/712fb81c-712fb81c})

[comment]: # ({f480040f-f480040f})
##### 示例3

检查Zabbix API是否存活，使用
[apiinfo.version](/manual/api/reference/apiinfo/version).

-   监控项配置：

![](../../../../../assets/en/manual/config/items/itemtypes/example3_a.png)

注意使用POST方法携带JSON数据，设置请求头
并仅要求返回头部信息：

-   使用正则表达式对监控项值进行预处理以getHTTP状态码：

![](../../../../../assets/en/manual/config/items/itemtypes/example3_b.png)

-   在*最新数据*中检查结果：

![](../../../../../assets/en/manual/config/items/itemtypes/example3_c.png){width="600"}

[comment]: # ({/f480040f-f480040f})

[comment]: # ({466eee2b-466eee2b})
##### 示例4

通过连接Openweathermap公共服务获取天气信息。

-   配置主监控项以单次JSON批量收集数据：

![](../../../../../assets/en/manual/config/items/itemtypes/example4_a.png)

注意query字段中宏的使用。参考[Openweathermap
API](https://openweathermap.org/current)了解如何填充它们。

HTTPagent返回的示例JSON：

```{.json}
{
    "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提取数据的依赖监控项。

-   配置湿度指标的示例依赖监控项：

![](../../../../../assets/en/manual/config/items/itemtypes/example4_b.png)

其他天气指标如'温度'以相同方式添加。

-   使用JSONPath的示例依赖监控项值预处理：

![](../../../../../assets/en/manual/config/items/itemtypes/example4_c.png)

-   在*最新数据*中检查天气数据结果：

![](../../../../../assets/en/manual/config/items/itemtypes/example4_d.png){width="600"}

[comment]: # ({/466eee2b-466eee2b})

[comment]: # ({44596b14-44596b14})
##### 示例5

连接到nginx状态页面并批量获取其指标

-   按照[official

    guide](https://nginx.ru/en/docs/http/ngx_http_stub_status_module.html).

```{=html}
<!-- -->
```
-   Configure a master item for bulk data collection:

![](../../../../../assets/en/manual/config/items/itemtypes/example5_a.png)配置nginx

示例 nginx 存根状态输出:

    Active connections: 1 Active connections:
    server accepts handled requests
     52 52 52 
    Reading: 0 Writing: 1 Waiting: 0

下一个任务是配置用于提取数据的依赖监控项

-   配置一个示例依赖的监控项用于每秒请求数:

![](../../../../../assets/en/manual/config/items/itemtypes/example5_b.png)

-   基于正则表达式的样本依赖监控项值预处理

    `server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+)`:

`server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+)`:

![](../../../../../assets/en/manual/config/items/itemtypes/example5_c.png){width="600"}

-  在*最新数据*中检查存根模块的完整结果:

![](../../../../../assets/en/manual/config/items/itemtypes/example5_d.png){width="600"}

[comment]: # ({/44596b14-44596b14})
