src\http\ngx_http_core_module.c
void
ngx_http_core_run_phases(ngx_http_request_t *r)
{
ngx_int_t rc;
ngx_http_phase_handler_t *ph;
ngx_http_core_main_conf_t *cmcf;
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
ph = cmcf->phase_engine.handlers;
while (ph[r->phase_handler].checker) {
rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);
if (rc == NGX_OK) {
return;
}
}
}
void
ngx_http_core_run_phases(ngx_http_request_t *r)
{
函数作用
ngx_http_core_run_phases()
是 Nginx HTTP 请求处理的核心调度函数,负责按照 多阶段处理模型(Multi-phase Processing Model) 执行请求的生命周期。它遍历 Nginx 预先定义的多个阶段(如 URI 重写、访问控制、内容生成等),并调用每个阶段注册的处理函数(phase handlers
),直到请求处理完成或提前终止。
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
从当前 HTTP 请求 (r
) 中获取 Nginx HTTP 核心模块 (ngx_http_core_module
) 的全局主配置 (cmcf
)。
cmcf
(ngx_http_core_main_conf_t
类型)存储了 HTTP 核心模块的全局配置信息,包括:
- 服务器 (
server
) 和位置块 (location
) 的配置。 - 监听端口、服务器名称、请求阶段处理器 (
phase_engine
) 等关键数据。 - HTTP 协议相关的默认参数(如
keepalive_timeout
、client_max_body_size
)。
ph = cmcf->phase_engine.handlers;
从 HTTP 核心模块的全局主配置 (cmcf
) 中获取请求阶段处理器数组 (handlers
)。
handlers
是一个数组,存储了 Nginx 所有 HTTP 请求处理阶段的回调函数(如 URI 重写、权限检查、内容生成等),ngx_http_core_run_phases()
会遍历这个数组,按顺序执行每个阶段的逻辑。
while (ph[r->phase_handler].checker) {
rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);
if (rc == NGX_OK) {
return;
}
}
1. 循环条件:ph[r->phase_handler].checker
ph
:指向阶段处理器数组的指针(ngx_http_phase_handler_t
数组)。r->phase_handler
:当前请求的阶段索引(初始值为 0,表示从第一个阶段开始)。.checker
:当前阶段处理器的检查函数(若为NULL
,表示所有阶段已执行完毕)。
作用:
检查当前阶段是否存在有效的 checker
函数。若存在,则进入循环体;否则终止循环(请求处理完成)。
2. 循环体:执行 checker
函数
rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);
- 参数:
r
:当前请求的上下文(ngx_http_request_t
)。&ph[r->phase_handler]
:当前阶段处理器的地址(含checker
、handler
、next
)。
- 返回值
rc
:
处理结果(如NGX_OK
、NGX_DECLINED
、NGX_ERROR
等)。
checker
的职责
- 调用
handler
:
执行当前阶段的实际处理逻辑(如重写 URI、检查权限、生成响应等)。 - 控制流程:
- 返回
NGX_OK
:请求处理完成(如已发送响应),终止循环。 - 返回
NGX_DECLINED
:继续执行下一阶段。 - 修改
r->phase_handler
:直接跳转到指定阶段(如重定向时跳过后续阶段)。
- 返回
3. 终止条件:rc == NGX_OK
if (rc == NGX_OK) {
return;
}
NGX_OK
的含义:
表示当前阶段已完整处理请求(如代理模块已返回后端响应,或访问控制模块拒绝了请求)。- 直接返回:
终止ngx_http_core_run_phases()
,不再执行后续阶段。
第 1 个
第 2 个
第 3 个
- ngx_http_core_rewrite_phase
第 4 个
第 5 个
第 6 个
第 7 个
第 8 个
第 9 个
第 10 个
第 11 个
第 12 个
第 13 个
第 14 个
第 15 个