nginx重新整理——————nginx 的设计模型[八]
前言
简单介绍一下nginx的设计模型,对我们设计程序还是有一定帮助的。
正文
这里先列一下模型哈,后面有深入篇,介绍的比较清楚。
nginx 的处理模型:
nginx 进程模型:
可以看到下面列出了进程:
这里的worker 进程只有一个哈。
同样可以看到他们的关系,父进程是master process nginx。
然后我们看一下nginx -s reload 重新加载配置做了什么,前文提及到一个东西,那就是这个是让worker 优雅的退出。
执行完后再看一下:
上面那两个进程不见了,取而代之的是后面那两个进程。
有时候我们执行nginx -s reload 不生效,这是为什么呢,因为是优雅退出,老的还在处理,所以可以观察一下进程。
同样这个命令其实也是和kill -HUB pid一样的。
同样nginx -s quit,也是有对应的命令的,kill -SIGTERM pid 效果其实是一样的。
对worker pid 执行:kill -SIGTERM pid,那么workder 会优雅推出。但是父进程检测到和其期望的不相符合,那么会再创建一个。
对父进程执行kill -SIGTERM pid 其实和nginx -s quit 一样的。
那么还有那些信号量可以管理nginx的进程呢?
master 进程:
监控worker 进程: CHLD(当子进程结束的时候要向父进程发送CHLD信号)
管理worker 进程
接收信号:
term,int(立即停止)
quit(优雅停止)
hub(重载配置文件)
usr1(重新打开日志文件)
usr2(只能通过kill 发送, 热部署)
winch(只能通过kill发送,停止worker)
worker 进程:
term,int(立即停止)
quit(优雅停止)
usr1(重新打开日志文件)
winch(只能通过kill发送,停止worker)
nignx命令行:
reload :HUP
reopen:USR1
stop:TERM
quit:QUIT
reload 执行流程:
-
向master 进程发送hub 信号(reload 命令)
-
master 进程校验配置语法是否正确
-
master 进程重新打开新的监听端口
-
master 进程用新配置启动新的worker 自进程
-
master 进程向老wokrer 进程发送quit信号
-
老worker 进程关闭监听句柄,处理完当前连接后结束进程
可以看到只有到这个关闭监听句柄了,才真的老的worker才不做处理了。
然后quit之后,master 会有一个定时器,如果worker 还没有退出,那么master 会强制杀死worker进程。
热升级流程:
-
将旧的nginx 换成新的nginx 文件
-
向master 进程发送usr2信号
-
master 进程修改pid 文件名,加后缀.oldbin
-
master进程用新的nginx 文件启动新的master 进程
-
向老的master 进程发送winch信号,关闭老的worker
-
回滚:向老的master 发送hup,想新的master 发送quit。
优雅退出worker 过程:
-
设置定时器 worker_shutdown_timeout
-
关闭监听句柄
-
关闭空闲链接
-
在循环中等待全部连接关闭
-
退出进程
这个循环中等待全部连接关闭,可能很长时间,如果到达了worker_shutdown_timeout设置的时间,那么也会被强制关闭。
结
下一届介绍nginx的网络模型。