当更改nginx.conf文件之后,我们都需要使用./sbin/nginx -s reload重载配置文件,这个命令能够使nginx在不停止服务的情况下,将旧的nginx.conf文件替换成新的。
reload流程:
-
向master进程发送HUP信号。
-
master进程检查配置文件的语法是否正确,如果不正确,则会reload失败,不影响旧的worker进程,服务保持原状。所以我们不需要在reload之前使用nginx -t去检查配置文件是否存在语法错误。
-
master打开新的监听端口。当更改配置文件时,可能监听的端口被改变,比如从8080变为443,这时在使用reload重载时,master进程就需要打开443端口,此时虽然监听的端口被改变,但是8080端口上的没有处理完请求还是能够正常处理。子进程会继承父进程的端口。
-
master用新的配置文件启用一个worker进程。
-
master进程向旧的worker进程发送QIUT信号,也就是通知旧的worker进程优雅的关闭,当旧的worker进程上还有请求没有处理完,会等处理完之后关闭。
-
老的worker进程关闭监听句柄,处理完当前连接后关闭进程。新的连接会使用新的worker进程。
所以在使用reload重载配置文件后,有一段时间中,新的worker进程和旧的worker进程是同时存在的。有些请求处理时间非常长,导致旧的worker进程一直得不到关闭,针对这种情况,我们可以在nginx.conf文件中配置worker_shutdown_timeout,指定过期时间,过期强制关闭worker。
worker_shut_down的启动时间是在新的worker进程被创建的时候。
新的worker进程和旧的worker进程之间相互不影响。