点击上方“武培轩”,选择“设为星标”

技术文章第一时间送达!

之前我们讲解 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进程?相关推荐

  1. vmx进程已提前退出_如何优雅地停止Java进程

    目录 理解停止Java进程的本质 应该如何正确地停止Java进程如何注册关闭钩子使用关闭钩子的注意事项信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境,即: ...

  2. java 结束程序_如何优雅地停止Java进程

    目录 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM. 因此,所谓停止Java进程,本质上就是关闭JVM. 那么,哪些情况会 ...

  3. python守护进程_让Python脚本成为守护进程

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python daemonizer 类 这是一个Python类,会使你的Python脚本成为守护进程,以使 ...

  4. java如何关闭线程池_如何优雅的关闭Java线程池

    ⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...

  5. java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池

    每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池. 一. ExecutorService中关闭线程池的方法 1. shutdown() 停止接收新任务,原来 ...

  6. java 僵尸进程_神奇的Java僵尸(defunct)进程问题排查过程

    现象描述 大概1个月多以前 在启动脚本中增加了tail -f 用来启动后追踪日志判断是否启动成功 后发现无法执行shutdown.sh(卡住 利用curl) 然后无奈使用kill -9 但通过ps - ...

  7. mysql 查看僵死的进程_如何查看并杀死僵死进程

    这些进程已经死亡,但没有释放系统资源,包括内存和一些一些系统表等,如果这样的进程很多,会引发系统问题.用ps -el看出的进程状态如果是Z,就是僵尸进程. ps -ef|grep defunc可以找出 ...

  8. adb ps shell 查看进程_深入理解Android中查看进程(ps)命令

    By Long Luo 注: 这篇文章是2013年发表在个人CSDN Blog上解析ANDROID ps命令执行后各项参数的含义,今天将其移到个人独立博客站上. 如何查看Android进程信息呢? 可 ...

  9. linux 守护进程_网络工程师之linux守护进程

    Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...

最新文章

  1. sense chrome扩展工具安装问题
  2. Spring-Boot项目部署到单独tomcat运行
  3. 索尼笔记本bios如何设置VT-x/AMD-V兼容
  4. Linux epoll的用法
  5. C语言判断m数为素数,判断数m是否为素数 c语言求素数的代码
  6. 表情识别相关论文摘要
  7. 【清华大学】操作系统 陈渝——Part5 虚拟存储概念
  8. R语言之几大常见概率分布
  9. RDT 协议 (可靠数据传输协议)
  10. eclipse出现Package jdk.internal.jimage.decompressor in both module java.base and module jrt.fs错误解决办法
  11. SONET和SDH技术简介
  12. Dancing Line、网易蜗牛读书——创新性分析
  13. docker启动Tomcat卡住不动
  14. Javascript 判断一个数是否为素数的三种解法
  15. html/css/javascript-编辑器
  16. 打开带参数的exe方法
  17. 【总结】本地springboot连接腾讯云Redis
  18. 爬取的是最好大学网软科中国最好大学排名2019
  19. 第 4-2 课:开发一个 Flutter TV 应用
  20. hdu 1114Piggy-Bank(完全背包)

热门文章

  1. 通向成功的23个方法
  2. 一些linux知识和http知识
  3. spring mvc拦截器HandlerInterceptor
  4. php --魔术常量 /魔术方法
  5. Java反射机制的使用方法
  6. 记“debug alipay”一事
  7. Java中内存中的Heap、Stack与程序运行的关系
  8. 六种方法,做一名更好的开发者
  9. 1008: University
  10. ubuntu 网卡突然无法连接