HTTP请求处理时的11个阶段

249 阅读2分钟

1、HTTP请求处理的11个阶段

当nginx接收到请求的头部,并且匹配到具体的server模块之后,所以此时我们已经知道了改server模块中的规则,location模块还没有确定,然后就可以进入11个阶段了。

                                                                  图1

  • POST_READ:刚接收完请求头,还没有做任何的加工处理时,可以在这里获取到一个请求的原始值。
  • SERVER_REWRITE:和REWRITE只有一个模块,rewrite模块。
  • FIND_CONFIG:只有nginx框架处理的阶段,该阶段没有任何的HTTP模块被处理,做location的匹配。
  • PREACCESS:该阶段和ACCESS、POST_ACCESS用于确认访问权限。在该阶段可以限制每秒的并发数,或者访问速率等。
  • ACCESS:决定用户能不能访问上游服务器。auth_basic是根据AB权限,access是根据IP,auth_request是根据第三方服务。

以上所有阶段必须是一个阶段一个阶段依次执行的。

2、处理顺序

当一个请求进入HTTP处理流程时,每一个阶段可能有一个或者多个模块来处理这个请求,所以当某一个模块不再向下传递请求时,后面的模块是得不到执行的。

当某一个阶段有多个模块时,并不是每一个模块都会被执行到。

                                                                图2

图中灰色部分是nginx框架执行的。

当我们添加了多个模块,但是不知道它们的执行顺序时,可以查看objs/ngx_modules.c文件,该文件中存储了使用的模块以及模块名。

                                                                   图3

                                                            图4

例如上图,它们处理请求的顺序是倒叙的,比如ngx_http_log_module在ngx_http_core_module之后,但是它却是先处理请求的。

一旦ngx_http_log_module将请求返回给用户,之后的所有模块将都得不到处理。