# 17 HTTP代理

#### 概述

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

HTTP代理同时支持HTTP和HTTPS。Zabbix可以选择跟随重定向（参考下文*Follow
redirects*的选项）

了解何时使用HTTPS协议，另请参阅[已知问题](/manual/installation/known_issues#https_checks)

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

#### 配置

配置HTTP监控项：

-   进入: *Configuration* → *Hosts*
-   在主机的那行点击 *Items*
-   点击 *Create item*
-   在表格中输入监控项的参数

|<|
|-|

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

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

|   |   |
|---|---|
|*Type*|在这里选择**HTTP agent**|
|*Key*|输入一个唯一的监控项键值|
|*URL*|连接和检索数据的URL. 例如:<br>https://www.google.com<br>http://www.zabbix.com/download\\\\可以用Unicode字符指定域名。 在执行web场景步骤时，它们将自动转换为ASCII。<br>*Parse* 可以使用Parse按钮将可选查询字段(比如?name=Admin&password=mypassword)与URL分离，将属性和值移动到查询字段中，以便自动URL编码.<br>限制在2048个字符。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级发现宏<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}, 用户宏, 低级自动发现宏.<br>设置cURL选项 [CURLOPT\_URL](https://curl.haxx.se/libcurl/c/CURLOPT_URL.html).|
|*Request type*|选择请求方法类型: *GET*, *POST*, *PUT* or *HEAD*|
|*Timeout*|Zabbix不会花超过设定的时间来处理URL (最大1分钟)。实际上，这个参数定义了连接URL的最大时间和执行HTTP请求的最大时间。 因此，Zabbix不会在一次检查中花费超过2倍的超时时间。<br>支持时间后缀, 例如 30s, 1m.<br>支持的宏: 用户宏, 低级发现宏。<br>设置cURL选项 [CURLOPT\_TIMEOUT](https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html)|
|*Request body type*|选择请求体类型:<br>**Raw data** - 自定义HTTP请求体，替换宏，但不执行编码。<br>**JSON data** - HTTP请求体是JSON格式的， 宏可以用作字符串、数字、真和假;用作字符串的宏必须包含在双引号中。从宏中解析值，然后自动转义。 如果没有指定header，那么服务器将把默认的header值设置为"Content-Type: application/json"<br>**XML data** - HTTP请求体的XML格式。 宏可以用作文本节点、属性或CDATA部分。 从宏中解析值，然后在文本节点和属性中自动转义。 如果没有指定header，那么服务器将把默认的header值设置为 "Content-Type: application/xml"<br>*注意*选择 *XML data*， 需要libxml2的支持。|
|*Request body*|输入请求体<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级自动发现宏。|
|*Headers*|执行请求时将发送的自定义HTTP头。<br>指定为属性和值对。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级自动发现宏。<br>设置 [CURLOPT\_HTTPHEADER](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPHEADER.html) cURL option.|
|*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 option.|
|*Follow redirects*|标记复选框以跟随HTTP重定向。<br>设置 [CURLOPT\_FOLLOWLOCATION](https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) cURL option.|
|*Retrieve mode*|选择必须检索的响应部分:<br>**Body** - 仅主体<br>**Headers** - 仅头部<br>**Body and headers** - 主体和头部|
|*Convert to JSON*|头文件作为属性和值对保存在"header" 键下.<br>如果遇到 'Content-Type: application/json' 主体被保存为对象，否则它被存储为string, 例如:<br>![](../../../../../assets/en/manual/config/items/itemtypes/http_conv_json.png)|
|*HTTP proxy*|可以使用格式`http://[username[:password]@]proxy.mycompany.com[:port]`指定要使用的HTTP代理。<br>默认将使用1080端口.<br>如果指定，代理将覆盖与代理相关的环境变量，如http\_proxy、HTTPS\_PROXY. 如果没有指定，代理将不会覆盖与代理相关的环境变量。 输入的值将被传递 "as is", 没有进行健全检查。<br>您还可以输入SOCKS代理地址。 如果您指定了错误的协议，那么连接将失败，监控项将不受支持。 由于没有指定协议，代理将被视为HTTP代理。<br>*注意* HTTP代理只支持简单的身份验证。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级自动发现宏。<br>设置 [CURLOPT\_PROXY](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) cURL option.|
|*HTTP authentication*|验证类型:<br>**None** - 不使用身份验证.<br>**Basic authentication** - 使用脚本身份验证.<br>**NTLM authentication** - 使用NTLM ([Windows NT LAN Manager)](http://en.wikipedia.org/wiki/NTLM) 验证。<br>选择身份验证方法将为输入用户名和密码提供两个额外的字段，其中支持用户宏和低级发现宏。<br>设置 [CURLOPT\_HTTPAUTH](https://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) cURL option.|
|*SSL verify peer*|标记复选框以验证web服务器的SSL证书。 服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。 可以使用Zabbix服务器或代理配置参数SSLCALocation重写CA文件的位置。<br>设置 [CURLOPT\_SSL\_VERIFYPEER](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html) cURL option.|
|*SSL verify host*|标记复选框以验证web服务器证书的通用名称字段或主题备用名称字段是否匹配.<br>设置 [CURLOPT\_SSL\_VERIFYHOST](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html) cURL option.|
|*SSL certificate file*|用于客户端身份验证的SSL证书文件的名称。 证书文件必须是PEM^1^ 格式. 如果证书文件也包含私钥，则将SSL密钥文件字段保留为空。 如果密钥已加密，请在SSL密钥密码字段中指定密码。 包含此文件的目录由Zabbix server或zabbix proxy配置参数SSLCertLocation指定。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级自动发现宏。<br>设置 [CURLOPT\_SSLCERT](http://curl.haxx.se/libcurl/c/CURLOPT_SSLCERT.html) cURL option.|
|*SSL key file*|用于客户端身份验证的SSL私钥文件的名称。 私钥文件必须是PEM^1^格式。 包含此文件的目录由Zabbix server或zabbix proxy配置参数SSLKeyLocation指定。<br>支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, 用户宏, 低级自动发现宏。<br>设置 [CURLOPT\_SSLKEY](http://curl.haxx.se/libcurl/c/CURLOPT_SSLKEY.html) cURL option.|
|*SSL key password*|SSL私钥文件密码。<br>支持的宏: 用户宏, 低级自动发现宏<br>设置 [CURLOPT\_KEYPASSWD](http://curl.haxx.se/libcurl/c/CURLOPT_KEYPASSWD.html) cURL option.|
|*Enable trapping*|选中此复选框后，该项目也将作为 [trapper监控项](/manual/config/items/itemtypes/trapper)项发挥作用，并将接受Zabbix sender或使用Zabbix sender协议发送给该监控项的数据.|
|*Allowed hosts*|只有勾选了 *Enable trapping*复选框才可见。<br>由逗号分隔的IP地址列表，可选地使用CIDR符号或主机名。\\\\如果指定，传入连接将仅从这里列出的主机接受。<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 prefix) 能够被支持，但 [RFC4291](https://tools.ietf.org/html/rfc4291#section-2.5.5)不推荐使用。<br>示例: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.domain<br>在这个字段，空格和 [用户宏](/manual/config/macros/usermacros)是被允许的。|

<note
tip>如果*HTTP代理*字段为空，则使用HTTP代理的另一种方法是设置与代理相关的环境变量.

对于HTTP - 为Zabbix server用户设置“http\_proxy”环境变量。 例如:\
//http\_proxy=[http:%%//%%proxy\_ip:proxy\_port//](http:%%//%%proxy_ip:proxy_port//).

对于HTTPS - 设置“HTTPS\_PROXY”环境变量. 例如:\
//HTTPS\_PROXY=[http:%%//%%proxy\_ip:proxy\_port//](http:%%//%%proxy_ip:proxy_port//)。
可以通过运行shell命令获得更多细节: *\# man curl*.
:::

::: noteimportant
 \[1\] Zabbix只支持PEM格式的证书和私有密匙文件。
如果您的证书和私钥数据是PKCS \#12格式文件 (通常扩展名为 \*.p12 or
\*.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创建一个GET项: ''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`

##### Example 2

##### 示例 2

发送简单的POST请求来检索来自Elasticsearch等服务的数据：

-   使用URL创建一个POST项:
    `http://localhost:9200/str/values/_search?scroll=10s`
-   配置以下POST主体以获取处理器负载 (每核1分钟的平均值)

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

-   Received：
-   接收：

```{=html}
<!-- -->
```
    {
        "_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`
