Nginx处理HTTP请求的11个阶段

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

Nginx 处理一个 HTTP 请求的全过程

这张图是Nginx处理HTTP请求的示意图

  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 个阶段

 

  1. POST_READ:在 read 完请求的头部之后,在没有对头部做任何处理之前,想要获取到一些原始的值,就应该在这个阶段进行处理。这里面会涉及到一个 realip 模块。
  2. SERVER_REWRITE:和下面的 REWRITE 阶段一样,都只有一个模块叫 rewrite 模块,一般没有第三方模块会处理这个阶段。
  3. FIND_CONFIG:做 location 的匹配,暂时没有模块会用到。
  4. REWRITE:对 URL 做一些处理。
  5. POST_WRITE:处于 REWRITE 之后,也是暂时没有模块会在这个阶段出现。

接下来是确认用户访问权限的三个模块:

  1. PREACCESS:是在 ACCESS 之前要做一些工作,例如并发连接和 QPS 需要进行限制,涉及到两个模块:limt_conn 和 limit_req
  2. ACCESS:核心要解决的是用户能不能访问的问题,例如 auth_basic 是用户名和密码,access 是用户访问 IP,auth_request 根据第三方服务返回是否可以去访问。
  3. POST_ACCESS:是在 ACCESS 之后会做一些事情,同样暂时没有模块会用到。

最后的三个阶段处理响应和日志:

  1. PRECONTENT:在处理 CONTENT 之前会做一些事情,例如会把子请求发送给第三方的服务去处理,try_files 模块也是在这个阶段中。
  2. CONTENT:这个阶段涉及到的模块就非常多了,例如 index, autoindex, concat 等都是在这个阶段生效的。
  3. LOG:记录日志 access_log 模块。

 各个阶段的处理

POST_READ:

在Read到HTTP请求的头部之后的阶段,由 realip模块 负责本阶段的处理,它的作用是在 刚刚读入HTTP头部、没有做任何加工之前,来获取一些原始的数据(例如获取浏览器客户端的IP地址和端口号等);

下面这四个阶段是由HTTP框架来执行,其他第三方模块没有机会在这里执行:

SERVER_REWRITE:

由 rewrite模块 负责处理;

FIND_CONFIG:

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

REWRITE:

同样由 rewrite模块 来负责处理;

POST_WRITE:

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

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

PREACCESS:

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

ACCESS:

用于判断浏览器“能不能访问”它所请求的资源,由以下几个模块负责处理:
access :
根据 用户访问的IP 判断访问权限;(模块:ngx_http_access_module;指令:access – 允许某个address访问、deny – 禁止某个address访问)
auto_basic :
根据 用户名和密码 判断访问权限;(模块:ngx_http_auth_basic_module)
auth_request :
根据一个第三方的服务来判断访问权限(一般是上传到应用服务器上去进行用户名密码验证);(模块:ngx_http_auth_request_module)

POST_ACCESS:

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

PRECONTENT:

在CONTENT之前的阶段,如 try_files 模块;

CONTENT:

包括 index模块、autoindex模块、concat模块;

LOG:

这一用于打印access日志,由 access_log模块 处理。

整个11个阶段所涉及到的模块和先后顺序如下图所示
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值