如何优雅地关闭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 请求。