nginx 工作流程
NGINX 把http请求处理流程划分为11个阶段,逻辑细分,以模块为单位进行处理。各个阶段可以包含多个http模块,每个阶段以流水线的形式处理请求。这样的分层处理模式与计算机网络的7层模式类似,每个模块以正交的方式处理请求,带来了低耦合,模块之间的低耦合带来灵活性。
1. NGX_HTTP_POST_READ
接受到完整HTTP头部后的处理阶段,位于URI重写之前;
2. NGX_HTTP_SERVER_REWRITE
URI与location匹配之前,修改URL的阶段,用于重定向,也就是该阶段执行处于server块内,location块外的重写指令。在读取请求头的过程中,NGNIX会根据host和端口找到对应的虚拟主机配置。
3, NGX_HTTP_FIND_CONFIG
根据URI寻找匹配的location块配置阶段,该阶段使用重写后之后的URI来查找对应的location,该阶段可能被执行多次,可能有location级别的重写指令。
4. NGX_HTTP_REWITR
上一阶段找到location块后,再修改URI,location级别的URI重写阶段,该阶段执行location基本重写指令,也可能会被执行多次。
5. NGX_HTTP_POST_REWRITE
为了防止重写URI后导致死循环,location级别重写的后一阶段,用来检查上阶段是否有URI重写,并根据结果跳转到合适的阶段。
6. NGX_HTTP_PERACCESS
访问权限控制的前一阶段,该阶段在访问权限控制之前,一般也用于访问控制,比如限制访问的频率、连接数等。
7. NGX_HTTP_ACCESS
访问权限控制阶段,让HTTP模块判断是否允许这个请求进入NGNIX服务器,比如基于黑名单的权限控制,基于用户密码的权限控制等。
8. NGX_HTTP_POST_ACCESS
访问权限控制的后一阶段,该阶段根据权限控制阶段的执行结果进行相应的处理,向用户发送拒绝服务的错误码,用来相应上一阶段的拒绝。
9. NGX_HTTP_TRY_FILES
为访问静态资源而设置,try_files指令的处理阶段,如果没有配置try_files指令,则该阶段被跳过。
10. NGX_HTTP_CONTENT
处理HTTP请求内容的阶段,大部分HTTP模块进入这个阶段--相应内容生成阶段,该阶段产生相应,并发送到客户端。
11. NGX_HTTP_LOG
处理完请求后的日志记录阶段,该阶段记录访问日志。