admin管理员组

文章数量:1577555

一、关于php-fpm中的两项参数emergency_restart_threshold/interval

php-fpm默认安装后以下三个参数都是关闭的:

#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果
#超过emergency_restart_threshold个php-fpm就会优雅重启。这两个选项一般保持默认值。

emergency_restart_threshold = 60
emergency_restart_interval = 60s

#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

process_control_timeout = 0

    关于process_control_timeout未打开会导致重启php502错误的详细内容请查看本文章第二部分。而另外的两项控制:emergency_restart_threshold和emergency_restart_interval 出于优化php的目的,建议也打开。按配置的意义,这两项配置即是php-fpm的一个异常自启功能,什么异常呢?php-cgi进程出现SIGSEGV或者SIGBUS错误。

    关于SIGSEGV信号,在POSIX兼容的平台上,SIGSEGV是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。SIGSEGV的符号常量在头文件signal.h中定义。因为在不同平台上,信号数字可能变化,因此符号信号名被使用。通常,它是信号#11。而SIGBUS信号则是硬件故障或是在执行内存分配malloc时的异常。

一句话概括区分如下:
SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。
SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

    做WEB开发估计对这些信号了解地都较少,可以考虑打开php的这项功能进行异常检测自启。建议配置如下:

二、重启php-fpm时请求发生502错误的原因及解决:process_control_timeout

    (publish:October 10, 2017 -Tuesday)我们在进行平台上线时,使用的是第三方部署工具jenkins, 方法是在部署好新代码之后,将link链接指向新的代码目录,然后重启php,但发现每次重启php,都会出现少量的502报错日志。重启php-fpm的过程中出现报错,这是php-fpm配置的问题,php-fpm.conf配置文件中有一项:process_control_timeout

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
process_control_timeout = 20
#emergency_restart_threshold = 0 ; 默认值为0
#子进程等待master进程对信号的回应(默认单位:s秒),可选s秒,m分,h时,d天

     关于process_control_timeout项配置的由来及详细介绍,依靠CGI接口,Nginx把收到的请求转给PHP,并从PHP获得返回数据,但CGI实现逻辑是一次请求建立一个PHP进程,处理结束的同时关闭php进程,而php进程的每次启动销毁都很耗资源,于是出现了FastCGI的方式,一个fastcgi进程可以处理多个请求再关闭,但FastCGI依然有缺点,因为fastcgi是单个进程串行,即同一时刻只能处理一个请求,于是php-fpm就出现了,它的作用就是可以管理多个fastcgi。从而实现同时处理多个请求。php-fpm就和nginx的主进程一样,而每一个处理请求的php进程就像是nginx里的多个执行线程。这就是php进程的复用。

    php-fpm作为一个调度员,会自动让空闲的FastCGI进程去处理请求,但是在分配请求给php进程前,PHP-FPM需要发送一个进程复用信号给FastCGI,以让FastCGI准备请求处理。但是FastCGI进程并不总是能够处理请求,也就是不能够响应进程复用信号,这个参数就表示了PHP-FPM留给FastCGI进程多久时间去响应进程复用信号,如果超时PHP-FPM会选择其他的fastcgi去处理。这段也是从网上找到的,以我的理解进行了一些修改。从英文注释来看,这个配置是子进程等待主进程的超时时间。可能和上面的描述有细微的出入,但也不妨对功能进行理解。

    默认设置为0我想即是不考虑这些响应,即是主进程不考虑子进程是否能响应请求,只要进程存在就直接转发请求。可见在重启php-fpm后,有的子进程已经不能处理请求了。

    在线上服务器变更php-fpm配置并重启后,重启出现502的问题就解决了。

本文标签: 重启两项时请错误参数