php-fpm和nginx平滑重启

1.php-fpm 平滑重启

保留主进程,杀死子进程。给php-fpm发送重启信号kill -USR2 pid  这个pid既可以是master进程的pid,也可以是worker进程的pid,如果是master进程的pid就会吧所有worker进程重启,如果是worker进程的pid就是只重启当个worker进程,

如果在php-fpm.conf文件配置的process_control_timeout时间内子进程没有退出,那么master进程会升级SIGQUIT为SIGTERM,SIGTERM为SIGKILL,并注册1s的定时事件。SIGKILL就直接终止worker进程了,SIGTERM还能再给worker进程1s的时间。

发送重启信号是会通知master,master获取event然后给worker进程发送退出的信号SIGQUIT,worker进程接收信号后交给对应的信号处理函数处理,信号函数就是将in_shutdown变量置为1,这样worker进程 在调用fcgi_accept_request进程下一个进程处理时就不接收直接退出了,(注意这里也会有处理时间过长问题),如果进程还没有执行结束也会退出,这样就会出现代码逻辑执行一半的情况,所以要特别注意。从这里可以看出来php-fpm的重启逻辑简单粗暴,(在规定时间内处理完请求,完成不了就不管了),由于php-fpm一个worker进程每次只能处理一个请求,所以不需要计数器之类的,这样就更简单了。

命令:#kill -SIGUSR2 31158  或者  #service php-fpm reload
2.nginx平滑重启

当 nginx reload 的时候 master 进程ID是没有变化的,worker 进程ID是有变化的。而nginx restart 的时候 master,worker的进程ID都有变化

reload 时,旧的worker进程和新的worker进程是共存的,旧的worker进程在处理完请求后会被杀掉。而 restart 时,不会存在新旧共存的情况(master,worker 都是)。如果有请求未完成时。旧的master,worker 会有一段时间处理请求(超时时间)。然后被杀掉,创建新的master,worker 进程。所以 restart 的时候nginx 会有卡顿的现象

命令:#systemctl reload nginx.service 或者 #service nginx reload

发表评论