1. HTTP请求11个处理阶段介绍
Nginx将一个HTTP
请求分成多个阶段,以模块为单位进行处理,其将HTTP
请求的处理过程分成了11个阶段,每个阶段可以包含任意多个HTTP
的模块,并以流水线的方式处理请求,其HTTP
阶段如下:
typedef enum {
NGX_HTTP_POST_READ_PHASE = 0,
NGX_HTTP_SERVER_REWRITE_PHASE,
NGX_HTTP_FIND_CONFIG_PHASE,
NGX_HTTP_REWRITE_PHASE,
NGX_HTTP_POST_REWRITE_PHASE,
NGX_HTTP_PREACCESS_PHASE,
NGX_HTTP_ACCESS_PHASE,
NGX_HTTP_POST_ACCESS_PHASE,
NGX_HTTP_TRY_FILES_PHASE,
NGX_HTTP_CONTENT_PHASE,
NGX_HTTP_LOG_PHASE
} ngx_http_phases;
网上图片,将这十一个阶段非常清晰的进行了描述。
1.1 POST_READ
POST_READ 阶段是 Nginx 接收到 Http 请求完整头部后的处理阶段,这里主要使用的是 realip 模块获取用户的真实地址,方便后续对该 IP 进行限速或者过滤其请求等。
1.2 SERVER_REWRITE 和 REWRITE 阶段
SERVER_REWRITE 和后面的 REWRITE 阶段一般是使用 rewrite 模块修改 Http请求的 uri,实现请求的控制。
1.3 FIND_CONFIG 阶段
FIND_CONFIG 阶段只是做 location 的匹配项。
1.4 PREACCESS、ACCESS 和 POST_ACCESS 阶段
PREACCESS、ACCESS 和 POST_ACCESS 是和 Http 请求访问权限相关的阶段。PREACCESS 阶段是在连接之前要做的访问控制, 这个阶段有 limit_conn 和 limit_req 等模块工作。ACCESS 阶段是解决用户能不能访问,比如根据用户名、密码限制用户访问(auth_basic 模块)、根据 ip 限制用户访问(access 模块)以及第三方模块认证限制用户的访问(auth_request模块)。POST_ACCESS 是在 ACCESS 之后要做的一些工作。
1.5 TRY_FILES 阶段
TRY_FILES 阶段为访问静态文件资源而设置的。有时候又称之为 PRECONTENT 阶段,即在 CONTENT 阶段之前做的事情。主要是 try_files 模块在此阶段工作。
1.6 CONTENT
最重要的 CONTENT 是处理 Http 请求内容的阶段,大部分 HTTP 模块介入这个阶段,比如 index、autoindex、concat 以及反向代理的模块都是在这里生效的。
1.7 LOG 阶段
LOG 是处理完请求后的日志记录阶段,如 access_log 模块。
备注
所有的HTTP请求都必须从上到下,一个接一个阶段进行。