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将请求返回给用户,之后的所有模块将都得不到处理。