nginx平滑重启和FPM平滑重启是什么
发布时间 - 2023-05-23 00:00:00 点击率:次平滑重启
gr是graceful restart(平滑重启)的简称,是一种在协议重启时保证转发业务不中断的机制。
gr机制的核心在于:当某设备进行协议重启时,能够通知其周边设备在一定时间内将到该设备的邻居关系和路由保持稳定。在协议重启完毕后,周边设备协助其进行信息(包括支持gr的路由/mpls相关协议所维护的各种拓扑、路由和会话信息)同步,在尽量短的时间内使该设备恢复到重启前的状态。在整个协议重启过程中不会产生路由振荡,报文转发路径也没有任何改变,整个系统可以不间断地转发数据。这个过程即称为平滑重启。
nginx平滑重启
Nginx进程可以划分为主进程和工作进程两种,它的平滑重启是通过信号HUB进行控制的。
注:在POSIX兼容的平台上,SIGUSR1和SIGUSR2是发送给一个进程的信号,它表示了用户定义的情况。
为了详细分析nginx的平滑重启过程,我们持续监控nginx进程变化。
发送HUP信号
kill -HUP `cat /home/git/nginx/logs/nginx.pid`
通过观察,可以分析出大致的平滑重启过程为:
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`
观察到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`
3、向旧master发送QUIT信号,旧nginx进程完全退出,至此平滑升级完成。
kill -QUIT `cat /home/git/nginx/logs/nginx.pid.oldbin`
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`
通过持续观察fpm进程可以看到,FPM平滑重启,需要等子进程完全退出后,才会启动新的master及子进程,随后旧master退出。
使用strace进一步分析
发现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已经不会再出现。
# nginx # php # bug # 重启 # 加载 # 也有 # 是一种 # 成了 # 也没 # 在此 # 才会 # 两种 # 时间内
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: Android使用GridView实现日历的简单功能 Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】 Laravel怎么实现微信登录_Laravel Socialite第三方登录集成 三星、SK海力士获美批准:可向中国出口芯片制造设备 JS弹性运动实现方法分析 Laravel怎么在Blade中安全地输出原始HTML内容 详解CentOS6.5 安装 MySQL5.1.71的方法 再谈Python中的字符串与字符编码(推荐) 如何用狗爹虚拟主机快速搭建网站? Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解 香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南 魔毅自助建站系统:模板定制与SEO优化一键生成指南 JS实现鼠标移上去显示图片或微信二维码 如何用PHP工具快速搭建高效网站? 装修招标网站设计制作流程,装修招标流程? js代码实现下拉菜单【推荐】 大型企业网站制作流程,做网站需要注册公司吗? 实现点击下箭头变上箭头来回切换的两种方法【推荐】 怎么用AI帮你为初创公司进行市场定位分析? C++用Dijkstra(迪杰斯特拉)算法求最短路径 武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的? Firefox Developer Edition开发者版本入口 Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】 Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转 详解Android图表 MPAndroidChart折线图 零服务器AI建站解决方案:快速部署与云端平台低成本实践 湖南网站制作公司,湖南上善若水科技有限公司做什么的? Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】 关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework) Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】 Linux后台任务运行方法_nohup与&使用技巧【技巧】 Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧 laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法 如何快速启动建站代理加盟业务? 零基础网站服务器架设实战:轻量应用与域名解析配置指南 JavaScript如何实现音频处理_Web Audio API如何工作? Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置 如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框 js实现获取鼠标当前的位置 laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法 Laravel怎么清理缓存_Laravel optimize clear命令详解 Laravel如何实现API版本控制_Laravel API版本化路由设计策略 网页制作模板网站推荐,网页设计海报之类的素材哪里好? 如何为不同团队 ID 动态生成多个“认领值班”按钮 浅述节点的创建及常见功能的实现 HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】 如何在阿里云部署织梦网站? 西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站? Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】 如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?


cgi://127.0.0.1:9001", host: "localhost"