背景

今天发布了一个统计功能,发现线上机器没有mongo模块,于是使用phpize编译了mongo模块,再用kill -HUP 进程号重启进程。

于是乎,以前都没有问题的操作,导致了php-fpm进程全部挂掉了。

现象

1、执行操作

执行重启操作

kill -HUP 20749

这里没有输出任何东西, 再查看,发现进程挂了

于是试着重启

[root@gameyeah_my ~]# /usr/local/php/sbin/php-fpm

ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)

ERROR: FPM initialization failed

发现端口已经被使用,但是明明 fast-cgi没有运行了啊。

于是netstat -nalt|grep 9000,得出一个OA进程占有,这个就很奇怪了。

暂时不明。

2、解决

把OA进程kill掉后,重启发现报错

[root@gameyeah_my ~]# /etc/init.d/php-fpm restart

Gracefully shutting down php-fpm /etc/init.d/php-fpm: line 82: kill: (20749) - No such process

.........

查看php-fpm的pid文件,还存在。 这个是异常关闭进程导致的,需要手动删除,再重启 -> OK了.

3、再次出现问题

环境一样,我再次使用kill -HUP 进程号 再次出现php-fpm master进程挂掉,但是子进程都还存在

没办法,只好pkill php-fpm再使用/usr/local/php/sbin/php-fpm重启, 好, 又正常了。

研究

参考线上朋友的说明:

用HUP信号使Nginx加载新的配置文件 当Nginx接收到HUP信号的时候,它会尝试着去解析并应用这个配置文件,如果没有问题,那么它会创建新的worker进程,并发送信号给旧的 worker进程,让其优雅的退出。接收到信号的旧的worker进程会关闭监听socket,但是还会处理当前的请求,处理完请求之后,旧的 worker进程退出。

查看使用yum安装的php-fpm的reload控制脚本

reload () {

echo -n $"Reloading $prog: "

if ! /usr/sbin/php-fpm --test ; then

RETVAL=6

echo $"not reloading due to configuration syntax error"

failure $"not reloading $prog due to configuration syntax error"

else

killproc -p ${pidfile} php-fpm -USR2

## 或者 kill -USR2 `cat $php_fpm_PID`

RETVAL=$?

fi

echo

}

发现官方是使用-USR2 平滑reload的

网上这位朋友说明如下:

当你想升级Nginx到一个新的版本,增加或减少module的时候 发送USR2信号给master进程。master进程会把自己的.pid文件重命名为.oldbin(例 如,/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的二进制文件,从而启动一个新的master进程和新的worker进程.

为了验证-HUP与-USR2的区别,做实验(回狗窝后自己机器):

1、php.ini添加上mongo.so, 使用-HUP重启,发现master进程真挂了

只好重启

[root@gameyeah_my mongo-php-driver-legacy]# pkill php-fpm ; /usr/local/php/sbin/php-fpm

2、php.ini添加上mongo.so, 使用-USR2重启, 发现一切正常进程号更新; 使用phpinfo()查看mongo模块正常使用.

3、修改php.ini, 不添加mongo.so,使用 -HUP重启 --- master进程一样关闭了,只留下子进程

4、重置,不添加mongo.so,使用 -USR2重启 --- 一切正常

5、我重新以不修改php.ini的方式分别以-HUP/-USR2尝试重启,现象与上面一样

1) 使用kill -HUP pid ,master进程关闭,没有成功启动新的master进程

2) 使用kill -USR2 pid, 旧master进程关闭,新的master进程成功启动

6、是不是php-fpm的特有性质呢??于是改试nginx进程

1) 使用-HUP重启, 发现修改的配置生效了,但是进程号未修改

2) 使用-USR2重启,发现新的master进程起来了,旧的master进程还存在;再使用-QUIT关闭旧进程(-WINCH一样没有见关闭),过一段时间发现旧进程真没了.

真心查看nginx官方提供的reload方法是使用-HUP

reload() {

echo -n $"Reloading $prog: "

killproc -p ${pidfile} ${prog} -HUP

RETVAL=$?

echo

}

结论

php-fpm与nginx的使用-USR2/-HUP意义不一样!

Master进程能够接收并处理如下的信号:

TERM, INT(快速退出,当前的请求不执行完成就退出)

QUIT (优雅退出,执行完当前的请求后退出)

HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程, 用于nginx的加载新配置,不能用于php-fpm加载新配置)

USR1 (重新打开日志文件)

USR2 (平滑的升级nginx二进制文件/平滑加载php-fpm新配置)

WINCH (优雅的关闭worker进程)

于是 可以自己写php-fpm控制脚本

关闭

kill -QUIT `cat $php_fpm_PID`

平滑重载配置

kill -USR2 `cat $php_fpm_PID`

强制关闭

kill -TERM `cat $php_fpm_PID`

可以自己写nginx控制脚本

关闭

kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`

平滑重载配置

kill -HUP `cat /usr/local/nginx/logs/nginx.pid`

平滑升级nginx,即升级新编译的nginx

复制代码

OldPid=`cat /usr/local/nginx/logs/nginx.pid`

kill -USR2 $OldPid

kill -QUIT $OldPid

--------------------------------------------

upgrade() {

oldbinpidfile=${pidfile}.oldbin

configtest -q || return

echo -n $"Starting new master $prog: "

killproc -p ${pidfile} ${prog} -USR2

echo

for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do

/bin/usleep $SLEEPMSEC

if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then

echo -n $"Graceful shutdown of old $prog: "

killproc -p ${oldbinpidfile} ${prog} -QUIT

RETVAL=$?

echo

return

fi

done

echo $"Upgrade failed!"

RETVAL=1

}

php 重载进程,关于php-fpm与nginx进程重载相关推荐

  1. nginx进程模型,事件模型

    众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧. nginx在启动后,在unix系统中会以daemon的方式 ...

  2. 运行中的Nginx进程间的关系

    第2章 Nginx的配置 Nginx拥有大量官方发布的模块和第三方模块,这些已有的模块可以帮助我们实现Web服务器上很多的功能.使用这些模块时,仅仅需要增加.修改一些配置项即可.因此,本章的目的是熟悉 ...

  3. 写了个Python脚本监控nginx进程

    写了个Python脚本监控nginx进程 « Xiaoxia[PG] 写了个Python脚本监控nginx进程 接上一文用iptables让SSH服务对陌生人说不.还是有点担心这个学期内,nginx可 ...

  4. linux 关闭nginx进程,Linux环境下启动、停止、重启nginx

    启动 启动代码格式:nginx安装目录地址 -c nginx配置文件地址 例如: [root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /us ...

  5. nginx进程管理之worker进程

    主要分析一下worker进程的情况.首先找到worker进程的入口-ngx_worker_process_cycle.这个函数不仅是worker进程的入口函数,而且是worker进程 循环工作的主要函 ...

  6. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

     1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...

  7. NGINX 进程通信机制

    nginx的进程通信分为三种类别:linux 系统与nginx 通信, master 进程与worker进程通信, worker进程间通信. master进程管理worker进程,本文将追溯nginx ...

  8. Nginx学习之九-负载均衡(客户端请求与Nginx进程间负载均衡)

    本文介绍的负载均衡是针对的客户端请求在多个Nginx进程之间的均衡.注意与客户端请求在多个后端服务器之间的均衡相区别. 负载均衡问题的产生 在nginx中,建立连接的时候,会设计负载均衡问题.在多个子 ...

  9. NGINX进程的基本操作和基础知识

    在运行时控制NGINX进程 本节描述了NGINX在运行时启动的过程以及如何控制它们. 主程序和工作程序 NGINX具有一个主进程和一个或多个工作进程.如果缓存被启用,缓存加载器和缓存管理器进程也启动时 ...

最新文章

  1. WEB打印大全(转)
  2. C# 串口编程 — MVVM MVVM Light 实例
  3. 想聊天?自己搭建个聊天机器人吧!
  4. c#求三角形面积周长公式_C#源代码—三角形面积、圆的面积
  5. iptables学习笔记:同一端口号同时支持tcp和udp的转发
  6. 动态规划____编辑距离
  7. 柯尼卡美能达c353改语言,柯尼卡美能达bizhub c353c253c203维修手册中文部分2.pdf
  8. linux怎么用jconsole_linux中jconsole
  9. 事务控制语言(DTL)
  10. OneNote for Windows10 闪退 的解决办法
  11. 等比缩放公式_等比缩放算法
  12. 汉诺塔详解(超详细)
  13. mysql的column是什么意思_column意思 数据库中的column是什么意思
  14. 今天给大家介绍一下关于锂离子电池的负极材料选择
  15. Software Engineering at Google翻译-III-11-Testing overview(测试概述)
  16. 骁龙695和天玑900处理器哪个好
  17. tplogin服务器未响应,TP-Link路由器的管理页面打不开怎么办?
  18. cmakelist的作用及使用
  19. 初学PLC的相关建议
  20. 从0-1搭建一个天气预报网站

热门文章

  1. 【Elasticsearch】Elasticsearch的IndexSorting:一种查询性能优化利器
  2. 【ElasticSearch】Es 源码之 ClusterService 源码解读
  3. 【IDEA】idea es 报错 Cause: invalid type code: 2D
  4. 50-10-010-配置-整体配置
  5. 【高并发】JUC底层工具类Unsafe
  6. 95-280-035-源码-资源管理-计算资源管理-TaskSlot
  7. 13-12-X-Pack的配置与检查
  8. Java中Comparable和Comparator接口的区别
  9. 强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!
  10. oracle明文传输http,oracle密码在网络传输中的安全问题