White Box技術部

WEB開発のあれこれ(と何か)

php-fpmはgraceful restartしません(回避策あり)

php-fpmはgraceful restart. そう思っていた頃が私にもありました

以下の公式ドキュメントに「緩やかな (graceful) 停止/起動 機能を含む高度なプロセス管理」と記載があるので、 何の疑いもなくservice php-fpm reloadを叩いたらプロセスが落ちました。。

PHP: FastCGI Process Manager (FPM) - Manual

reloadもrestartも終了処理は同じ

もちろんこれはreloadだからというわけではありません。 reloadもrestartも、実行するkillコマンドにUSR2オプションは付いています。

付いているのですが、これが期待する動作(プロセスの処理が終了したらkill)になりません。

ググるとすぐ出てくるのですが

以下のバグとして上がっていますが、ずっと放置されているようです。

PHP :: Bug #60961 :: Graceful Restart (USR2) isn't very graceful

対策

php-fpmのprocess_control_timeoutを、デフォルトの0からコネクションタイムアウトの設定値と同程度の値に変えると、 プロセスの終了を待って再起動するようになります。(reloadも同様)

おそらくこうすることで、親プロセスが子プロセスの状態を知ることができるようになるからだとは思いますが・・・推測です。 性能影響も図れていないので、これが正しい対策なのかはなんとも言えません。 ただこうするとgracefulにはなったので、課金のような途中で殺すとまずいAPIなどは、設定すると幸せになれるかもしれません。

後は、世のPHPマスターに期待するだけの人生を送ろうと思います。