当我们更改了nginx.conf配置文件以后,向master父进程发送SIGHUP信号或者执行nginx -s reload,master父进程会用新的配置文件启动新的worker子进程,此时新的worker子进程与旧的worker子进程是并存的,旧的worker子进程在正常的情况下在处理完老的请求连接以后会关闭这个连接和旧的worker子进程。对于异常或者长链接,达到了worker_shutdown_timeout时间定时器也会退出。
具体流程:
第一步会设置一个定时器,在nginx.conf中可以配置一个worker_shutdown_timeout,配置完 worker_shutdown_timeout 之后,会加一个标志位,表示进入优雅关闭流程了(默认是没有该配置,只要连接在worker进程就一直在)。
第二步会先关闭监听句柄,要保证所在的 worker 进程不会再去处理新的连接。
接下来会先去看连接池,因为 Nginx 为了保证对资源的利用是最大化的,经常会保存一些空闲的连接,但是没有断开,这时候会首先关闭空闲连接。
第四步是可能非常耗时的一步,因为 Nginx 不是主动的立刻关闭,是通过第一步添加的标志位,然后在循环中每当发现一个请求处理完毕,就会把这个请求使用的连接关掉,所以在循环中等待关闭所有的时间可能会很长。当设置了 worker_shutdown_timeout 的时候,即使请求还没处理完,当时间到了之后这些请求都会被强制关闭,也就是说优雅地关闭只完成了一半,有一部分连接是立即停止的。
因此在以下两个条件:当所有循环中连接被优雅地关闭,或者达到了 worker_shutdown_timeout 时间定时器以后,worker 进程都会立即退出。
标签:shutdown,timeout,reload,worker,Nginx,关闭,Linux,进程,连接 From: https://www.cnblogs.com/ayf-devops/p/18099101