我们知道,nginx 请求分为下面几个阶段:
typedef enum {
NGX_HTTP_POST_READ_PHASE = 0, //读取请求
NGX_HTTP_SERVER_REWRITE_PHASE, //server重写
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;
下面对这些过程详细介绍:
一 NGX_HTTP_POST_READ_PHASE
do nothing
二 NGX_HTTP_SERVER_REWRITE_PHASE
do nothing
三 NGX_HTTP_FIND_CONFIG_PHASE
根据请求的位置,去查找对应的 loc_conf ,具体过程可以 模块定位 中介绍。
四 NGX_HTTP_REWRITE_PHASE
五 NGX_HTTP_POST_REWRITE_PHASE,
六 NGX_HTTP_PREACCESS_PHASE,
七 NGX_HTTP_ACCESS_PHASE,
./src/http/modules/ngx_http_auth_basic_module.c: h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
./src/http/modules/ngx_http_access_module.c: h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
这个阶段有两个handler
八 NGX_HTTP_POST_ACCESS_PHASE,
直接调用 ngx_http_core_post_access_phase函数 (ngx_http_core_module.c)。现在基本没有干什么事情
九 NGX_HTTP_TRY_FILES_PHASE,
十 NGX_HTTP_CONTENT_PHASE,
直接调用 ngx_http_core_content_phase()来生成内容
默认的情况下,这个包含三个handler:
ngx_http_index_module.c : 如果是目录,那么在index后面的文件中选择一个进行跳转
ngx_http_autoindex_module.c
ngx_http_static_module.c 处理静态的文件
十一 NGX_HTTP_LOG_PHASE