
Nginx:一种高性能的提供http服务,邮件服务等功能的反向代理服务器
Nginx主要是用于Http服务器,反向代理服务器,邮件服务器
Nginx由多个模块组成,每个请求的完成都是由一个或多个模块共同完成的。
Nginx 默认采用守护模式启动,守护模式让master进程启动后在后台运行。在Nginx运行期间主要由一个master主进程和多个worker进程(数目一般与cpu数目相同)
Nginx默认以守护进程daemon方式启动,默认采用多进程方式。Nginx包括两种类型的进程:- Master 进程,数量只有一个,管理Nginx本身和Worker进程- Worker 进程,数量一般和CPU核数相等,Nginx的所有请求处理,均是在Worker进程中完成

Nginx master进程
Master主进程主要是管理worker进程,对网络事件进行收集和分发:
接收来自外界的信号
向各worker进程发送信号
监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程
master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
Nginx master初始化流程如下:

Nginx Worker进程
nginx用一个独立的worker进程来处理一个请求,一个worker进程可以处理多个请求:
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处:
节省锁带来的开销。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多
独立进程,减少风险。
采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。
在一次请求里无需进程切换

Nginx worker初始化流程如下:

Nginx请求处理流程

整体过程:
Read Request Headers:解析请求头。
Identify Configuration Block:识别由哪一个 location 进行处理,匹配 URL。
Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。
Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做一些防盗链的设置,或者验证用户的权限。
Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务(Upstream Services)进行通信,然后这个过程中还可能会有些子请求或者重定向,那么还会走一下这个过程(Internal redirects and subrequests)。
Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理。
Log:记录日志
nginx实际把http请求处理流程划分为了11个阶段
nginx实际把http请求处理流程划分为了11个阶段,这样划分的原因是将请求的执行逻辑细分,以模块为单位进行处理,各个阶段可以包含任意多个HTTP模块并以流水线的方式处理请求。这样做的好处是使处理过程更加灵活、降低耦合度。这11个HTTP阶段如下所示:
1)NGX_HTTP_POST_READ_PHASE:
接收到完整的HTTP头部后处理的阶段,它位于uri重写之前,实际上很少有模块会注册在该阶段,默认的情况下,该阶段被跳过。
2)NGX_HTTP_SERVER_REWRITE_PHASE:
URI与location匹配前,修改URI的阶段,用于重定向,也就是该阶段执行处于server块内,location块外的重写指令,在读取请求头的过程中nginx会根据host及端口找到对应的虚拟主机配置。
3)NGX_HTTP_FIND_CONFIG_PHASE:
根据URI寻找匹配的location块配置项阶段,该阶段使用重写之后的uri来查找对应的location,值得注意的是该阶段可能会被执行多次,因为也可能有location级别的重写指令。
4)NGX_HTTP_REWRITE_PHASE:
上一阶段找到location块后再修改URI,location级别的uri重写阶段,该阶段执行location基本的重写指令,也可能会被执行多次。
5)NGX_HTTP_POST_REWRITE_PHASE:
防止重写URL后导致的死循环,location级别重写的后一阶段,用来检查上阶段是否有uri重写,并根据结果跳转到合适的阶段。
6)NGX_HTTP_PREACCESS_PHASE:
下一阶段之前的准备,访问权限控制的前一阶段,该阶段在权限控制阶段之前,一般也用于访问控制,比如限制访问频率,链接数等。
7)NGX_HTTP_ACCESS_PHASE:
让HTTP模块判断是否允许这个请求进入Nginx服务器,访问权限控制阶段,比如基于ip黑白名单的权限控制,基于用户名密码的权限控制等。
8)NGX_HTTP_POST_ACCESS_PHASE:
访问权限控制的后一阶段,该阶段根据权限控制阶段的执行结果进行相应处理,向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝。
9)NGX_HTTP_TRY_FILES_PHASE:
为访问静态文件资源而设置,try_files指令的处理阶段,如果没有配置try_files指令,则该阶段被跳过。
10)NGX_HTTP_CONTENT_PHASE:
处理HTTP请求内容的阶段,大部分HTTP模块介入这个阶段,内容生成阶段,该阶段产生响应,并发送到客户端。
11)NGX_HTTP_LOG_PHASE:
处理完请求后的日志记录阶段,该阶段记录访问日志。
参考文章:
nginx源码分析之启动流程
https://cxybb.com/article/qq_26312651/89790083
Nginx 处理 HTTP 请求的 11 个阶段
https://iziyang.github.io/2020/04/12/5-nginx/




