nginx没有worker进程_如何优雅地关闭worker进程?
点击上方“武培轩”,选择“设为星标”
技术文章第一时间送达!
之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx -s quit
和 nginx -s stop
,其中 stop 是指立即停止 Nginx,而 quit 是指优雅的关闭 Nginx,对应的信号也是同样的,还有我们之前提到的 reload 和热升级这样的过程中都涉及到了优雅的停止 Nginx。
那所谓的优雅的停止 Nginx 究竟是怎样一个过程呢,接下来让我一起来学习下吧。
何为优雅的关闭?
所谓的优雅的关闭,是针对 worker 进程而言的,因为只有 worker 进程 才会处理请求。如果我们在处理一个连接的时候,不管连接此时对于请求是怎样一个作用,直接去关闭链接会导致用户收到错误,所以优雅地关闭就是指 Nginx 的 worker 进程 可以识别出当前连接没有正在处理请求,这个时候再把连接进行关闭。
对于某些请求 Nginx 无法做到优雅地关闭 worker 进程,比如当 Nginx 代理 websocket 协议的时候,在 websocket 后面进行通讯的 frame 桢里面,Nginx 是不解析他的桢的;Nginx 做 TCP 层或者 UDP 层反向代理的时候,也没有办法识别一个请求需要经历多少报文才算是结束;但是对于 HTTP 请求,Nginx 可以做到,所以优雅地关闭主要针对的是 HTTP 请求。
接下来我们去看一下优雅地关闭 worker 进程都有哪些流程。
优雅的关闭流程
首先第一步会设置一个定时器,在 nginx.conf 中可以配置一个 worker_shutdown_timeout,配置完 worker_shutdown_timeout 之后,会加一个标志位,表示进入优雅关闭流程了。
第二步会先关闭监听句柄,要保证所在的 worker 进程不会再去处理新的连接。
接下来会先去看连接池,因为 Nginx 为了保证对资源的利用是最大化的,经常会保存一些空闲的连接,但是没有断开,这时候会首先关闭空闲连接。
第四步是可能非常耗时的一步,因为 Nginx 不是主动的立刻关闭,是通过第一步添加的标志位,然后在循环中每当发现一个请求处理完毕,就会把这个请求使用的连接关掉,所以在循环中等待关闭所有的时间可能会很长。当设置了 worker_shutdown_timeout 的时候,即使请求还没处理完,当时间到了之后这些请求都会被强制关闭,也就是说优雅地关闭只完成了一半,有一部分连接是立即停止的。
因此在以下两个条件:当所有循环中连接被优雅地关闭,或者达到了 worker_shutdown_timeout 时间定时器以后,worker 进程都会立即退出。
总结
这篇文章主要讲解了 worker 进程优雅关闭的一个过程,很多时候我们都会用到 Nginx 优雅关闭这样一个特性,那么在这一个特性失效的时候,我们需要考虑 Nginx 有没有能力去判定一个连接此时应当被正确的关掉;或者说如果出现了错误、有些模块或者有些客户端不能正常的处理请求时,Nginx 需要有一些例外的措施,比如 worker_shutdown_timeout 来保证 Nginx 老的 worker 进程可以正常的退出掉。
完
●Nginx 了解一下?●Nginx 热部署和日志切割,你学会了吗?●Nginx热升级流程,看这篇就够了●探究 Nginx 中 reload 流程的真相●使用 Nginx 搭建静态资源 web 服务器●Nginx 的请求处理流程,你了解吗?
nginx没有worker进程_如何优雅地关闭worker进程?相关推荐
- vmx进程已提前退出_如何优雅地停止Java进程
目录 理解停止Java进程的本质 应该如何正确地停止Java进程如何注册关闭钩子使用关闭钩子的注意事项信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境,即: ...
- java 结束程序_如何优雅地停止Java进程
目录 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM. 因此,所谓停止Java进程,本质上就是关闭JVM. 那么,哪些情况会 ...
- python守护进程_让Python脚本成为守护进程
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python daemonizer 类 这是一个Python类,会使你的Python脚本成为守护进程,以使 ...
- java如何关闭线程池_如何优雅的关闭Java线程池
⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...
- java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池
每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池. 一. ExecutorService中关闭线程池的方法 1. shutdown() 停止接收新任务,原来 ...
- java 僵尸进程_神奇的Java僵尸(defunct)进程问题排查过程
现象描述 大概1个月多以前 在启动脚本中增加了tail -f 用来启动后追踪日志判断是否启动成功 后发现无法执行shutdown.sh(卡住 利用curl) 然后无奈使用kill -9 但通过ps - ...
- mysql 查看僵死的进程_如何查看并杀死僵死进程
这些进程已经死亡,但没有释放系统资源,包括内存和一些一些系统表等,如果这样的进程很多,会引发系统问题.用ps -el看出的进程状态如果是Z,就是僵尸进程. ps -ef|grep defunc可以找出 ...
- adb ps shell 查看进程_深入理解Android中查看进程(ps)命令
By Long Luo 注: 这篇文章是2013年发表在个人CSDN Blog上解析ANDROID ps命令执行后各项参数的含义,今天将其移到个人独立博客站上. 如何查看Android进程信息呢? 可 ...
- linux 守护进程_网络工程师之linux守护进程
Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...
最新文章
- sense chrome扩展工具安装问题
- Spring-Boot项目部署到单独tomcat运行
- 索尼笔记本bios如何设置VT-x/AMD-V兼容
- Linux epoll的用法
- C语言判断m数为素数,判断数m是否为素数 c语言求素数的代码
- 表情识别相关论文摘要
- 【清华大学】操作系统 陈渝——Part5 虚拟存储概念
- R语言之几大常见概率分布
- RDT 协议 (可靠数据传输协议)
- eclipse出现Package jdk.internal.jimage.decompressor in both module java.base and module jrt.fs错误解决办法
- SONET和SDH技术简介
- Dancing Line、网易蜗牛读书——创新性分析
- docker启动Tomcat卡住不动
- Javascript 判断一个数是否为素数的三种解法
- html/css/javascript-编辑器
- 打开带参数的exe方法
- 【总结】本地springboot连接腾讯云Redis
- 爬取的是最好大学网软科中国最好大学排名2019
- 第 4-2 课:开发一个 Flutter TV 应用
- hdu 1114Piggy-Bank(完全背包)