暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nginx原理简介

五分钟学SRE 2021-11-27
667


   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进程,对网络事件进行收集和分发:

  1. 接收来自外界的信号

  2. 向各worker进程发送信号

  3. 监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程

master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

Nginx master初始化流程如下:

Nginx Worker进程

  •   nginx用一个独立的worker进程来处理一个请求,一个worker进程可以处理多个请求:

  •    当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。

  •   一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。采用这种方式的好处:

  •  节省锁带来的开销。对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查上时,也会方便很多

  •  独立进程,减少风险。

  •   采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。

  •   在一次请求里无需进程切换


Nginx worker初始化流程如下:


Nginx请求处理流程

整体过程:

  1. Read Request Headers:解析请求头。

  2. Identify Configuration     Block:识别由哪一个 location 进行处理,匹配 URL。

  3. Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。

  4. Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做一些防盗链的设置,或者验证用户的权限。

  5. Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务(Upstream Services)进行通信,然后这个过程中还可能会有些子请求或者重定向,那么还会走一下这个过程(Internal redirects and subrequests)。

  6. Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理。

  7. 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/


文章转载自五分钟学SRE,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论