0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-07-23

症状

テンプレート「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 offTransfer-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:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?