FPM三度

つか何回目かわからぬ( ´ω`)

以下の状況でab実施すると無反応になるのに気がついたのでやったことメモ。

  • Apache2.4.23(ビルド)
  • nghttp2 1.15.0(ビルド)
  • mod_http2 1.7.1(ビルド)
  • mod_brotli 0.3.0(ビルド)
  • PHP7.0.11(ビルド)
  • Mariadb 5.5.50(RPM版)
  • WordPress 4.6.1(素)

mod_proxy_fcgi で php-fpm につないでいます。
socketでもTCPでも無反応になります。

[proxy_fcgi:error] [pid 9645:tid 140231782143744] (70007)The timeout specified has expired

です。

  • ab -c1 -n1 でもダメ
  • http でも https でもダメ
  • h2 でも HTTP1.1 でもダメ
  • nghttp2を色々入れ替えてもダメ
  • mod_http2を色々入れ替えてもダメ
  • ApacheHTTPDを色々入れ替えてもダメ

まあひどい(´・ω・`)
だんだん面倒になってきたのでバージョンの入れ替えは途中でやめました。

ちなみに、比較した動く環境は

  • CentOS7
  • Apache2.4.6(RPM版)
  • PHP7.0.11(ビルド)/5.6.14(RPM版)

です。http2はありません。

色々試したところ、必要条件は

  • Apache2.4がhttp2 enableである

ではなかろうかと言うところまで来ました。

  • Apache2.4.23 –disable-http2付き

で、症状出なくなりました。
mod_http2を外せばよかろうと思って外したのですがそれではダメで
–disable-http2をつけてビルドしたものは大丈夫でした。
勿論、http2は使えなくなり、結果動く環境と似た感じになりました。

・・・が。
しばらくするとまた無反応(´・ω・`)ぐぬぬ
モジュール外してもダメな状況と合いますし、やっぱ原因は違うねと。

ソケットでつなぐ方をやりたかったので
netstat でソケット状況を見ていますとなぜか減らない。

pm = static
pm.max_children = 2
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 2
pm.max_requests = 10000

なので、あっても2個なのではなかろうかと(実際はプロセスが2個、ソケットはLISNINGが1個になる)。
12個ぐらいから減らないのですね。状態は CONNECTED。
この状態でab実行しても無反応なわけです。
CONNECTEDってことはつながりっぱなしってことですから、

<Proxy "fcgi://localhost/" disablereuse=off max=2>

ここかなあと。接続使い回し設定です。

disablereuse=on に(検証用に古い書き方しています)して使い回さないようにします。

果たして上手くいきましたヽ(´▽`)ノ
HTTP2も関係無かったので使えるように戻しました。

さて、この設定は動いているものからコピってきたものです。
では動いているものはなぜ動いていたのでしょうか。
動いている方でソケットの数をwatchしていくと、負荷終了後はしっかり減っていっています。
どうも設定を無視しているようです(´・ω・`)がふ

とまれPHP-FPMには使ったらあかんてことですね。