Zabbix で PHP-FPM: Ping (php-fpm.ping) が Down のままで Up にならない

## 症状

テンプレート「Template App PHP-FPM by Zabbix agent」を利用してPHP-FPMサービスを監視していて、curlでもpingに対して正しくpongが返っているにもかかわらず最新データを見るとDownのままでUpにならない。

## 動作環境

Zabbix Sever バージョン: 5.0.14
Zabbix Agent2 バージョン: 5.4.3 など
テンプレート: Template App PHP-FPM by Zabbix agent
アイテム: PHP-FPM: Ping


php-pfmの設定は完了していて、curlでも`pong`がレスポンスとして返ってくるところまでは確認できているものとする。

```
$ curl localhost/ping
pong
```

## 方法

結論から先にいうと、nginxの場合は`chunked_transfer_encoding off`、Apacheの場合は`SetEnv downgrade-1.0`を設定すればよい。

### nginxの設定例
```
location ~ ^/(status|ping)$ {
    chunked_transfer_encoding off;
    <PHPの設定>
    access_log  off;
    allow 127.0.0.1;
    allow ::1;
    deny  all;
}
```

### Apacheの設定例
```
<LocationMatch "^/(status|ping)$">
    SetEnv downgrade-1.0
    <PHPの設定>
    Require ip ::1
    Require ip 127.0.0.1
</LocationMatch>
```

## 以下詳細

curlでは問題ないようにみえるが、zabbix_getコマンドを使ってzabbixサーバホストから`web.page.get`でpingの結果を見てみると、`Transfer-Encoding: chunked`のヘッダを伴ってレスポンスが返っていることがわかる。

```
$ zabbix_get -s <ターゲットホスト> -k 'web.page.get["localhost","ping","80"]'
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Type: text/plain
Date: Fri, 23 Jul 2021 08:26:09 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Server: nginx

4
pong
0
```

どうも、web.page.getが`Transfer-Encoding: chunked`に対応していないのか、PHP-FPMがDownしていると判定されてしまう。
(レスポンスが正しくても内部的に`ping`と正確に一致していないことになる?)

ちなみに、ホストマクロの`{$PHP_FPM.PING.REPLY}`に`4 pong 0`の部分を入力することも試してみたがうまく動作しなかった。(改行が入力できない?)

`Transfer-Encoding`はHTML1.1の機能なので、`Transfer-Encoding`自体を無効にするか、HTML1.0を使えば症状は回避できることがわかった。

niginxの場合は、`chunked_transfer_encoding off`で`Transfer-Encoding`ヘッダを無効にできる。Apacheでは同様な設定は見当たらなかった。

http://nginx.org/en/docs/http/ngx_http_core_module.html#chunked_transfer_encoding
>Allows disabling chunked transfer encoding in HTTP/1.1. It may come in handy when using a software failing to support chunked encoding despite the standard’s requirement.

```
$ zabbix_get -s <ターゲットホスト> -k 'web.page.get["localhost","ping","80"]'
HTTP/1.1 200 OK
Connection: close
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Type: text/plain
Date: Fri, 23 Jul 2021 08:31:01 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Server: nginx

pong
```

`web.page.get`でHTML1.0を指定できればよいが、ドキュメントを見る限りはそのようなオプションはないようだ。

https://www.zabbix.com/documentation/current/manual/config/items/itemtypes/zabbix_agent

そこで、Apacheでは、サーバ側で環境変数`downgrade-1.0`を設定することで、HTML1.0にダウングレードすることで対応した。

https://httpd.apache.org/docs/current/env.html#page-header

>downgrade-1.0
>This forces the request to be treated as a HTTP/1.0 request even if it was in a later dialect.

```
$ zabbix_get -s <ターゲットホスト> -k 'web.page.get["localhost","ping","80"]'
HTTP/1.1 200 OK
Connection: close
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Type: text/plain
Date: Fri, 23 Jul 2021 08:41:00 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Server: Apache
Vary: Accept-Encoding

pong
```

`HTTP/1.1 200 OK`と表示されているが、レスポンスは設定通りHTML1.0で返すようになったようだ。

## 最後に

後のバージョンにおいて `web.page.get` の改善によって、将来的には問題ではなくなる気もするが、現時点でのサーバが対応方法として記録しておく。

参考URL:

https://www.zabbix.com/forum/zabbix-help/416476-php-fpm-php-fpm_ping-wrong-value-always-down#post416487