nginx对于处理http的11个阶段

nginx将一个HTTP请求分为11个处理阶段,这样做让每个HTTP模块可以仅仅专注于完成一个独立,简单的功能。而一个请求的完整处理过程可以由多个HTTP模块共同合作完成。可以极大的提高多个模块合作的协同性,可测试性,可扩展性。换言之,nginx在处理每一个http请求,和配置文件上的顺序没有关系。

先来从一个示意图中看 一个请求是怎样在Nginx中被处理的:

1. Read Request Headers:解析请求头

2. Identify Configuration Block:识别由哪⼀个 location进⾏处理,匹配 URL
3. Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者
QPS 太⾼。
4. Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做⼀些防盗链的
设置,或者验证⽤⼾的权限
5. Generate Content:⽣成返回给⽤⼾的响应。为了⽣成这个响应,做反向代理的时候可能会和上
游服务(UpstreamServices)进⾏通信,然后这个过程中还可能会有些⼦请求或者重定向,那
么还会⾛⼀下这个过程(Internal redirects and subrequests)。

TTP请求在Nginx内部的抽象化处理流程:

6. Response Filters:过滤返回给⽤⼾的响应。⽐如压缩响应,或者对图⽚进⾏处理。
7. Log:记录⽇志。
---------------------------------------------------------------------------------------------------------------------

当一个请求进入到图中黄色的框 也就是Nginx之中时,先进行 Read Request Headers,即读取到请求的头部,并且决定使用哪一个server块的配置去处理这个请求;

随后进入 Indentify Configuration Block 中寻找哪一个 location 的配置生效了;

在 Apply Rate Limits 中去决定是否要对其执行 限速(例如连接数太多了超出了限制,或者每秒发送的速率太高了,需要进行限速);

在 Perform Authentication 中进行权限验证;

在 Generate Content 中生成HTTP响应,为了生成响应,有时候当Nginx作为反向代理时可能需要跟上游的服务器进行交互,这时就需要进入 Upstream Services 中执行,将上游服务器转发给Nginx的内容作为响应内容;

在向用户返回请求的时候,需要经过 Response Filters 过滤模块,比如通过gzip对还没有压缩的文件进行压缩;

当发送给用户的时候,还会进入 Log 中记录一条 access日志;

在上面的流程中有时可能会产生自请求或者重定向,这时就需要进入 Internal redirects and subrequests 这个黄色模块中。

---------------------------------------------------------------------------------------------------------

11个阶段


 

 

  1. POST_READ:在Read到HTTP请求的头部之后的阶段,由 realip模块 负责本阶段的处理,它的作用是在 刚刚读入HTTP头部、没有做任何加工之前,来获取一些原始的数据(例如获取浏览器客户端的IP地址和端口号等)下面这四个阶段是由HTTP框架来执行,其他第三方模块没有机会在这里执行:
  2. SERVER_REWRITE: 由 rewrite模块 负责处理;3. FIND_CONFIG:负责做 location{ } 的匹配;(注:location{} 配置块可以出现在 server配置块和 location配置块 中,即location配置块可以嵌套;

  3. 而 server{} 配置块只能出现在 http配置块内,不能嵌套。)
    (location 的匹配顺序:“=” 完全匹配;“^~” 匹配上后则不再进行正则表达式匹配;“@” 用于内部跳转。)

  4.  REWRITE:同样由 rewrite模块 来负责处理;

  5. POST_WRITE:在 REWRITE阶段后的阶段,目前没有模块处理这个阶段(包括官方模块);

    接下来是与ACCESS 相关的三个阶段:(用来确认访问权限)

  6.  PREACCESS:在ACCCESS之前的访问权限的确认,主要由 limit_conn模块 和 limit_req 模块负责处理:
    limit_conn :判断是否已经达到了最大连接数的限制;(ngx_http_limit_conn_module:限制同一客户端的并发连接数)
    limit_req :判断是否已经达到了每秒最大请求数,此时要限制访问速度,并不是客户端就不能访问了;(ngx_http_limit_req_module:把突发的流量限制为恒定的每秒限制多少个请求)

  7. ACCESS:用于判断浏览器“能不能访问”它所请求的资源,由以下几个模块负责处理:

  8. access :
    根据 用户访问的IP 判断访问权限;(模块:ngx_http_access_module;指令:access – 允许某个address访问、deny – 禁止某个address访问)
    auto_basic :
    根据 用户名和密码 判断访问权限;(模块:ngx_http_auth_basic_module)
    auth_request :
    根据一个第三方的服务来判断访问权限(一般是上传到应用服务器上去进行用户名密码验证);(模块:ngx_http_auth_request_module)

  9.  POST_ACCESS:在ACCESS之后的处理阶段,在第三部分中没有模块会涉及到这一阶

  10. PRECONTENT:在CONTENT之前的阶段,如 try_files 模块;

  11. CONTENT:包括 index模块、autoindex模块、concat模块;

执行顺序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值