0

0

聊聊nginx平滑重启和FPM平滑重启

青灯夜游

青灯夜游

发布时间:2022-03-10 11:30:12

|

7222人浏览过

|

来源于huaweicloud

转载

本篇文章带大家了解一下平滑重启,详细介绍一下nginx平滑重启和fpm平滑重启,希望能够给大家提供帮助!

平滑重启

GR是Graceful Restart(平滑重启)的简称,是一种在协议重启时保证转发业务不中断的机制。
GR机制的核心在于:当某设备进行协议重启时,能够通知其周边设备在一定时间内将到该设备的邻居关系和路由保持稳定。在协议重启完毕后,周边设备协助其进行信息(包括支持GR的路由/MPLS相关协议所维护的各种拓扑、路由和会话信息)同步,在尽量短的时间内使该设备恢复到重启前的状态。在整个协议重启过程中不会产生路由振荡,报文转发路径也没有任何改变,整个系统可以不间断地转发数据。这个过程即称为平滑重启。

nginx平滑重启

nginx进程分为master主进程和worker工作进程,nginx的平滑重启通过信号HUB控制。

0ad5774570f0acecd781efd944017ea.jpg

注:在POSIX兼容的平台上,SIGUSR1和SIGUSR2是发送给一个进程的信号,它表示了用户定义的情况。

为了详细分析nginx的平滑重启过程,我们持续监控nginx进程变化。
发送HUP信号

kill -HUP `cat /home/git/nginx/logs/nginx.pid`

32de880788b49e2bab09de71b97759b.jpg

95b2574132403d0d7e33a32b70194ae.jpg

7f0b2c2e657ae0be2ac0d7c634a8d71.jpg

通过观察,可以分析出大致的平滑重启过程为:
1. master使用新配置 fork出n-1个worker及新master
2. 新worker处理新情求,旧worker执行完退出
3. master重新加载配置,期间使用新master接管服务
4. master加载配置完毕,新master切换为worker工作模式
平滑重启完,master进程号并不会发生变化。

nginx平滑升级

HUP仅用于平滑重启,加载配置等,如果要平滑升级nginx版本,重新加载编译的二进制文件,需要借助于USR2信号。

1. 发送USR2信号

kill -USR2 `cat /home/git/nginx/logs/nginx.pid`

0f75284aede5d90d307458b071b4174.jpg

210c1db1969213752333832cd71c05b.jpg

观察到nginx进程,fork出新master及worker,此时nginx.pid内容已经发生变化,并且在logs目录下生成了nginx.pid.oldbin文件,记录旧master pid.

2. 向旧master发送WINCH信号,nginx woker会优雅地停止服务,即:停止接收新的请求,但是不会终止已经在处理的请求。一段时间后,旧nginx的所有worker进程全部退出,只剩下master进程,而用户请求全部都由新的nginx进程处理。

kill -WINCH `cat /home/git/nginx/logs/nginx.pid.oldbin`

eb088238bc325e794efda24b678e844.jpg

3、向旧master发送QUIT信号,旧nginx进程完全退出,至此平滑升级完成。

Munch
Munch

AI营销分析工具,长视频中提取出最具吸引力的短片

下载
kill -QUIT `cat /home/git/nginx/logs/nginx.pid.oldbin`

627f567cac1d81d2088256adb485538.jpg

FPM平滑重启

FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,php5.3.3之后已经集成FPM,在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

FPM的平滑重启需要通过USR2信号控制,不过与nginx的平滑重启过程有较大的不同。

kill -USR2 `cat /home/git/php/var/run/php-fpm.pid`

1c3133d36598e0555cd900d9af20106.jpg

通过持续观察fpm进程可以看到,FPM平滑重启,需要等子进程完全退出后,才会启动新的master及子进程,随后旧master退出。
使用strace进一步分析

f494282ba6d4d3feebffcb1fae8eedd.jpg

发现master通知所有子进程退出,包含正在处理请求的子进程。

为了进一步验证这个结论,编写一个服务端sleep脚本

用浏览器请求这个地址,并在此期间平滑重启fpm,请求直接502了。
nginx错误日志:

[error] 29841#0: *1646 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "localhost"

php bug#60961,也有对fpm无法优雅的实现平滑重启的说明。
难道FPM这么low?答案当时是no,实际上通过 process_control_timeout 参数可以实现我们的目标。

process_control_timeout

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

 原则上,php-fpm会选择空闲的fastcgi进程去处理请求,在处理之前,php-fpm会给fastcgi发送信号,用来让fastcgi进程准备好接受请求处理。但是fastcgi进程并不总是能够处理请求,也就是不能总是响应该信号(比如出现假死的情况),这时候就需要设定php-fpm留给fastcgi进程响应信号的时间,如果超时了,php-fpm会想其他办法(例如选择其他fastcgi进程),这个就是process_control_timeout参数的作用。

 这个参数缺省是 0,也就是不生效,修改为10,重新验证,502已经不会再出现。

 结论:缺省情况下,PHP-FPM 无法保证平滑的执行 reload 操作,必须设置一个合理的 process_control_timeout 才行,同时需要注意的是其值不能设置的过大,否则系统可能出现严重的请求堵塞问题。

推荐学习:《PHP视频教程

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2488

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1584

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1481

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1414

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1305

2023.11.13

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号