症状
テンプレート「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では同様な設定は見当たらなかった。
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を指定できればよいが、ドキュメントを見る限りはそのようなオプションはないようだ。
そこで、Apacheでは、サーバ側で環境変数downgrade-1.0
を設定することで、HTML1.0にダウングレードすることで対応した。
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: