如何用supervisor守护php-fpm主进程来实现php-fpm的自动重启

最近有同事有个针对PHP-fpm进程的监护需求,也即:如果php-fpm的master进程意外退出(可能是crash,也可能是被误kill),那么希望master进程能被自动拉起,以免中断服务。

我们知道,supervisor是一个非常强大的进程监控(monitor & control)工具,它理论上可以实现php-fpm master进程的守护需求。因此,我帮同事试验了如何用supervisor完成他的需求,结果表明,supervisor确实是神器,只需一个合理的配置文件,它就能解决问题。

下面是我在网上找资料最终实现php-fpm主进程守护功能的配置步骤,在此做个记录,也希望能帮助到别人。

1、安装supervisor

可参考:https://blog.zzstudio.net/system/article_1061.html

2、修改php-fpm.conf中的daemonize

编辑./etc/php-fpm.conf,设置daemonize = no,默认是yes

3、在supervisor配置中加入Php-fpm的配置

4、到supervisorctl中reload配置即可

 

在配置时有两个注意点:

1) command

它指定了supervisor要监控的进程的启动命令,可以看到,这里我们没有给php-fpm传入daemonize参数,其余参数只是展开了php安装包中php-fpm.sh中的shell变量而已。

大家已经注意到,command也不是直接调起php-fpm,而是通过bash -c执行了两个命令,而第一个命令是sleep 1。这是由于php-fpm在stop后,其占用的端口通常不能立即释放,此时,supervisor以极快的速度试图重新拉起进程时,可能会由于报如下错误而导致几次retry均失败:

而supervisor目前还不支持delay restart功能,因此,这里只能通过先sleep再启动的略显tricky的方法来解决问题,结果表明,疗效不错且无副作用。

2) autorestart

其文档描述如下:

其默认值是unexpected,表示若被监护进程的exit code异常时,supervisor才会重新拉起进程。这里设置为true,表明任何时候进程退出均会被再次拉起。

这样配置好后,运行如下命令即可完成supervisor对php-fpm master进程的监护:

然后,通过ps x | fgrep fpm可以看到,php-fpm主进程已经被拉起了。
然后,kill掉php-fpm主进程,再次ps x | fgrep fpm可以看到,一个新的php-fpm主进程会被supervisor创建出来。

至此,用supervisor守护php-fpm主进程以实现php-fpm的自动重启的需求已经解决了。

关于稚子

你们眼中的草根
此条目发表在应用工具软件, 操作系统相关分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注