ngx_http_core_run_phases

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)
cmcfngx_http_core_main_conf_t 类型)存储了 HTTP 核心模块的全局配置信息,包括:

  • 服务器 (server) 和位置块 (location) 的配置。
  • 监听端口、服务器名称、请求阶段处理器 (phase_engine) 等关键数据。
  • HTTP 协议相关的默认参数(如 keepalive_timeoutclient_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]:当前阶段处理器的地址(含 checkerhandlernext)。
  • 返回值 rc
    处理结果(如 NGX_OKNGX_DECLINEDNGX_ERROR 等)。
checker 的职责
  1. 调用 handler
    执行当前阶段的实际处理逻辑(如重写 URI、检查权限、生成响应等)。
  2. 控制流程
    • 返回 NGX_OK:请求处理完成(如已发送响应),终止循环。
    • 返回 NGX_DECLINED:继续执行下一阶段。
    • 修改 r->phase_handler:直接跳转到指定阶段(如重定向时跳过后续阶段)。

3. 终止条件:rc == NGX_OK
if (rc == NGX_OK) {
    return;
}
  • NGX_OK 的含义
    表示当前阶段已完整处理请求(如代理模块已返回后端响应,或访问控制模块拒绝了请求)。
  • 直接返回
    终止 ngx_http_core_run_phases(),不再执行后续阶段。

handlers 数组的赋值


第 1 个

第 2 个

第 3 个

  • ngx_http_core_rewrite_phase

第 4 个

第 5 个

第 6 个

第 7 个

第 8 个

第 9 个

第 10 个

第 11 个

第 12 个

第 13 个

第 14 个

第 15 个


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值