Nginx 请求流程
Nginx 进程结构
Nginx 有两种进程结构, 一种是单进程(可以用于测试), 一种是多进程(用于生产, 默认)
Nginx 会按需同时运行多个进程: 一个主进程 (master) 和几个工作进程 (worker), 配置了缓存时还会有缓存加载器进程(cache loader) 和缓存管理器进程 (cache manager) 等. Nginx 主要通过 "共享内存" 的机制实现进程间通信. worker 进程数, 一般会设置成机器 CPU 核数. 因为更多的 worker 数, 只会导致进程相互竞争 CPU, 从而带来不必要的上下文切换.
请求的缓存处理还是由 work 进程来执行的. CM: 缓存的管理, CL: 缓存的载入.
进程结构测试
,ps -ef | grep nginx: 可以查看到所有的 work 进程和 cache 进程
,../sbin/nginx -s reload: 重新加载配置
,ps -ef | grep nginx: 可以查看到之前所有的 work 进程和 cache 进程全部退出, 重新生成新的 work 进程和 cache 进程
,kill -SIGHUP 9170: 向 master 进程发送 hub 信号, 结果和 reload 一样
,ps -ef | grep nginx: 可以查看到之前所有的 work 进程和 cache 进程全部退出, 重新生成新的 work 进程和 cache 进程
,kill -SIGTERM 16982: 向 work 进程发送退出信号
,ps -ef | grep nginx:16982 进程退出, 会重新生成一个 work 进程
Nginx 采用多进程而不是多线程, 目的?
Nginx 的进程就是线程, 即每个进程里只有一个线程, 但这一个线程可以服务多个客户端.
Nginx 需要保证高可用和高可靠性, 多线程线程之间共享某一快地址空间, 如果某一个第三方某块引发了一个地址空间导致的断错误时, 在地址越界出现时, 会导致整个 Nginx 整个进程挂掉.
nginx 采用多进程的方式, 既可以避免因某个线程故障导致整个服务不可用的问题, 也可以实现配置热加载, 不停服升级版本.
Nginx 实现高并发原理?
参考:
多进程之间通讯
多进程通讯可以使用共享内存, 信号等, Nginx 做进程管理通常只使用信号
Master 进程可以监控 wrok 进程是否像 master 发送 CHLD 信号, 因为子进程终止的时候回向父进程发送 CHLD 信号, 如果 work 由于意外发生终止(认为输入命令终止, 但是我们一般不这么做, 我们通过发送命令给 master, 让 master 来终止 work 进程), 此时 master 进程就会知道.
reload 详解
, 向 master 进程发送 HUP 信号(reload 命令)
,master 进程校验配置语法是否正确
,master 进程打开新的监听端口(配置文件可能添加了新的端口)
,master 进程用新配置启动新的 worker 子进程
,master 进程向老 worker 子进程发送 QUIT 信号
, 老 worker 进程关闭监听句柄, 处理完当前连接后结束进程
热升级流程详解
, 将旧 Nginx 文件换成新 Nginx 文件(注意备份)
, 向 master 进程发送 USR2 信号
,master 进程修改 pid 文件名, 加后缀. oldbin
,master 进程用新 Nginx 文件启动新 master 进程
, 向老 master 进程发送 QUIT 信号, 关闭老 master 进程
, 回滚: 向老 master 发送 HUP, 向新 master 发送 QUIT
如果优雅的关闭 work 进程(缓慢的关闭)
如果当前的 work 已经在处理请求, 立刻关闭连接, 就会造成用户接受错误消息
, 设置定时器: worker shutdown timeout
, 关闭监听句柄
, 关闭空闲连接
, 在循环中等待全部连接关闭
, 退出进程
来源: http://www.bubuko.com/infodetail-3206757.html