php fpm平滑重启失败 - youngperson/study-100 GitHub Wiki

问题描述

php-fpm平滑重启失败,报错信息:recv() failed (104: Connection reset by peer) while reading response header from upstream

问题复现

找一台测试机器
利用压测工具ab对服务器进行压测,模拟线上的访问请求。在压测期间内  去平滑重启php-fpm  能复现
代码中写sleep,然后去平滑重启 能复现

请求的流程

浏览器输入URL->Nginx(从配置文件中加载nginx的fast-cgi模块)->php-fpm(fastcgi的进程管理器)
先到php-fpm的master进程(负责监听端口,接收Nginx的请求,据子进程的状态将请求分配给子进程去处理)->worker进程负责处理请求

php-fpm进程说明

worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

master 进程做的事情是 PHP环境初始化、事件监听(重启/重载、关闭、分发请求)、子进程状态

理解下php-fpm不能平滑重启

理论上php-fpm会去选择空闲的worker进程去处理请求,处理之前php-fpm会给fascgi发送信号,用来让fastcgi进程准备好接受请求处理。
这个时候由于大量的请求或者代码中有长时间的sleep,导致fastcgi不能及时的做出想要该信号。这个时候就需要设定php-fpm留给fastcgi进程响应信号的时间,如果超时了,php-fpm会想其他办法(可能选择其他fastcgi进程/直接重启该进程)

process_control_timeout

解释:设置子进程接受主进程复用信号的超时时间(对master进程的信号无响应)
该参数默认是0,表示关闭此功能
合理的设置这个参数的值