当前位置: 首页 > news >正文

ngx_http_init_phases

1 定义

ngx_http_init_phases 函数 定义在 ./nginx-1.24.0/src/http/ngx_http.c
staticngx_int_tngx_http_init_phases(ngx_conf_t*cf,ngx_http_core_main_conf_t*cmcf){if(ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,cf->pool,2,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers,cf->pool,2,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,cf->pool,4,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}if(ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}returnNGX_OK;}
ngx_http_init_phases 函数的作用是 初始化 HTTP 请求处理各个阶段(Phases)的处理函数数组。

2 详解

1 函数签名

static ngx_int_t ngx_http_init_phases(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
返回值 NGX_OK (0):初始化成功。 NGX_ERROR (-1):初始化失败
参数 ngx_conf_t *cf 指向当前配置解析上下文 ngx_http_core_main_conf_t *cmcf HTTP 核心模块的主配置结构体指针。 它存储了 HTTP 核心层面的配置信息,其中 cmcf->phases 是存储所有处理阶段信息的数组。

2 逻辑流程

1 初始化 NGX_HTTP_POST_READ_PHASE 请求处理阶段的处理函数数组 2 初始化 NGX_HTTP_SERVER_REWRITE_PHASE 请求处理阶段的处理函数数组 3 初始化 NGX_HTTP_REWRITE_PHASE 请求处理阶段的处理函数数组 4 初始化 NGX_HTTP_PREACCESS_PHASE 请求处理阶段的处理函数数组 5 初始化 NGX_HTTP_ACCESS_PHASE 请求处理阶段的处理函数数组 6 初始化 NGX_HTTP_PRECONTENT_PHASE 请求处理阶段的处理函数数组 7 初始化 NGX_HTTP_CONTENT_PHASE 请求处理阶段的处理函数数组 8 初始化 NGX_HTTP_LOG_PHASE 请求处理阶段的处理函数数组 9 返回成功

1 初始化 NGX_HTTP_POST_READ_PHASE 请求处理阶段的处理函数数组
{if(ngx_array_init(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
cmcf:指向 ngx_http_core_main_conf_t 结构体, 这是 HTTP 核心模块的主配置,存储了所有全局性的 HTTP 配置信息。 phases:是 cmcf 中的一个数组,包含了 HTTP 请求处理的所有阶段(共 11 个阶段)。 NGX_HTTP_POST_READ_PHASE: 这是一个枚举常量(通常值为 0),代表 “读取请求头之后” 的阶段。 这是请求处理流水线的第一个可干预阶段。 .handlers:每个阶段结构体中都有一个 handlers 成员,类型是 ngx_array_t(动态数组)。 这个数组用来存储该阶段所有已注册的回调函数指针。 cmcf->phases 是一个结构体数组,数组元素代表请求处理阶段。 每个阶段结构体内部包含一个动态数组 (ngx_array_t),用来存储该阶段需要执行的处理函数指针。 当前代码正在初始化第一个阶段 (NGX_HTTP_POST_READ_PHASE) 的这个动态数组, 预分配了 1 个元素的空间,每个元素的大小是 ngx_http_handler_pt(函数指针)。

2 初始化 NGX_HTTP_SERVER_REWRITE_PHASE请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
第二个请求处理阶段 NGX_HTTP_SERVER_REWRITE_PHASE 的处理函数数组的初始化 NGX_HTTP_POST_READ_PHASE 代表 刚读完请求头,还没做任何处理 NGX_HTTP_SERVER_REWRITE_PHASE 代表 在后读取之后,匹配 location 之前 主要用于在 server 级别对请求 URI 进行重写(例如通过 rewrite 指令)

3 初始化 NGX_HTTP_REWRITE_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
第4个请求处理阶段 NGX_HTTP_REWRITE_PHASE 的处理函数数组的初始化
NGX_HTTP_REWRITE_PHASE 代表的是 HTTP 请求处理流程中的"Location 级别重写阶段 执行时机:在 Location 匹配之后 这是它与 SERVER_REWRITE_PHASE 最大的区别
虽然在这段初始化代码中它是第 3 个, 但在 Nginx 定义的所有枚举阶段中,它实际上是第 4 个 枚举顺序: 1. `NGX_HTTP_POST_READ_PHASE` (索引 0) 2. `NGX_HTTP_SERVER_REWRITE_PHASE` (索引 1) 3. `NGX_HTTP_FIND_CONFIG_PHASE` (索引 2) 👈 **注意这里** 4. `NGX_HTTP_REWRITE_PHASE` (索引 3) 为什么代码里跳过了 `FIND_CONFIG_PHASE`? `NGX_HTTP_FIND_CONFIG_PHASE` 是一个内部控制阶段 它的核心任务是根据 URI 查找匹配的 `location` 配置。 这个过程由 Nginx 核心代码直接硬编码处理,不允许第三方模块注册处理函数(handlers) 因此,在 `ngx_http_init_phases` 函数中,没有为它初始化 `handlers` 数组。

4 初始化 NGX_HTTP_PREACCESS_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
请求处理阶段 NGX_HTTP_PREACCESS_PHASE 的处理函数数组的初始化 NGX_HTTP_PREACCESS_PHASE 是 Nginx HTTP 请求处理流程中的预访问阶段, 它的主要作用是: 进行访问控制前的检查: 在该阶段,模块可以对请求进行一些与访问控制相关但又不属于严格认证/授权的预处理, 例如: - 限制并发连接数(`limit_conn` 模块) - 限制请求速率(`limit_req` 模块) - 其他需要提前拦截的检查,通常这些检查不涉及用户身份认证,而是基于 IP、连接数或请求频率等条件。 - 与 ACCESS 阶段的区别: - `PREACCESS` 阶段通常用于资源层面的限流, - 检查是否超过连接数或请求速率,如果超出则直接拒绝请求(返回 503 等)。 - `ACCESS` 阶段则用于用户身份认证和授权(如 `auth_basic`、`auth_request` 以及 `allow/deny`),返回 401/403 等。 - 执行顺序:`PREACCESS` 先于 `ACCESS` 执行,这样可以在认证之前就拦截掉明显超限的请求,减轻后端认证模块的压力。 该阶段允许 Nginx 通过模块机制灵活扩展,实现各种前置限流和安全检查。

5 初始化 NGX_HTTP_ACCESS_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers,cf->pool,2,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
NGX_HTTP_ACCESS_PHASE 阶段的核心作用是 “访问控制与权限验证”。 它是 Nginx 请求处理流水线中的 “保安” 阶段,负责决定请求是否有权限访问资源 执行时机:预访问之后,内容生成之前 在预访问之后:确保限流等保护措施已经执行,恶意请求已被拦截。 在内容生成之前:确保在消耗资源生成响应内容之前,先确认用户有权限访问。

6 初始化 NGX_HTTP_PRECONTENT_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers,cf->pool,2,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
NGX_HTTP_PRECONTENT_PHASE 阶段的核心作用是 “内容生成前的预处理和准备”。 确定最终处理的内容: 在该阶段,Nginx 根据配置决定实际要处理的资源或动作,但尚未开始生成响应体。 典型应用: ngx_http_try_files_module:实现 try_files 指令,依次检查文件是否存在, 并选择对应的处理方式(如返回文件、内部重定向等)。 其他需要“预备”内容处理逻辑的模块。 与 CONTENT_PHASE 的区别: PRECONTENT 阶段关注“用什么内容”(例如是静态文件还是内部 URI),但不生成响应。 CONTENT 阶段负责实际生成响应体(如输出文件、调用代理、返回 CGI 等)。 执行特点:该阶段的处理器通常不会直接发送响应, 而是修改请求的配置(如设置 content_handler 或进行内部重定向), 让后续的 CONTENT 阶段执行具体工作。 执行时机:访问控制之后,内容生成之前 在访问控制之后:确保用户已有权限访问,才值得为内容生成做准备。 在内容生成之前:确保在真正消耗资源生成内容之前,完成所有必要的准备工作。 为什么要单独设这个阶段? 逻辑分离 将"准备内容"和"生成内容"分离,职责更清晰

7 初始化 NGX_HTTP_CONTENT_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers,cf->pool,4,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
NGX_HTTP_CONTENT_PHASE 阶段的核心作用是 “实际生成响应内容”。

8 初始化 NGX_HTTP_LOG_PHASE 请求处理阶段的处理函数数组
if(ngx_array_init(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers,cf->pool,1,sizeof(ngx_http_handler_pt))!=NGX_OK){returnNGX_ERROR;}
NGX_HTTP_LOG_PHASE 阶段的核心作用是 “记录访问日志”

9 返回成功
returnNGX_OK;}

请求处理阶段的定义
typedefenum{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_PRECONTENT_PHASE,NGX_HTTP_CONTENT_PHASE,NGX_HTTP_LOG_PHASE}ngx_http_phases;
不初始化的 3 个阶段: NGX_HTTP_FIND_CONFIG_PHASE (索引 2) NGX_HTTP_POST_REWRITE_PHASE (索引 4) NGX_HTTP_POST_ACCESS_PHASE (索引 7) 原因: 这 3 个阶段是 Nginx 核心内部控制阶段。 它们的逻辑由 Nginx 核心代码硬编码实现,不允许第三方模块注册处理函数。 因此不需要 handlers 数组来存储模块回调函数。 FIND_CONFIG 根据 URI 查找匹配的 location 这是路由核心逻辑,必须由核心统一处理 POST_REWRITE 处理 rewrite last 后的内部跳转 跳转逻辑由核心控制,模块不应干预 POST_ACCESS 访问检查后的汇总处理 需要统一判断所有 access handler 的结果
HTTP 请求处理完整流程图 请求到达 │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 1. NGX_HTTP_POST_READ_PHASE │ │ (读取请求头后,模块可干预) │ │ ✅ handlers 可注册 (如:set_real_ip) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 2. NGX_HTTP_SERVER_REWRITE_PHASE │ │ (server 级别 URL 重写) │ │ ✅ handlers 可注册 (如:server 块 rewrite) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 3. NGX_HTTP_FIND_CONFIG_PHASE │ │ (查找匹配的 location) │ │ ❌ 核心内部处理,不可注册 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 4. NGX_HTTP_REWRITE_PHASE │ │ (location 级别 URL 重写) │ │ ✅ handlers 可注册 (如:location 块 rewrite) │ │ ⚠️ 使用 last 标志会跳回 FIND_CONFIG 重新匹配 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 5. NGX_HTTP_POST_REWRITE_PHASE │ │ (重写后处理,内部跳转) │ │ ❌ 核心内部处理,不可注册 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 6. NGX_HTTP_PREACCESS_PHASE │ │ (访问控制前,如限流) │ │ ✅ handlers 可注册 (如:limit_req, limit_conn) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 7. NGX_HTTP_ACCESS_PHASE │ │ (权限验证) │ │ ✅ handlers 可注册 (如:auth_basic, allow/deny) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 8. NGX_HTTP_POST_ACCESS_PHASE │ │ (访问检查后汇总) │ │ ❌ 核心内部处理,不可注册 │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 9. NGX_HTTP_PRECONTENT_PHASE │ │ (内容生成前预处理) │ │ ✅ handlers 可注册 (如:try_files) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 10. NGX_HTTP_CONTENT_PHASE │ │ (生成响应内容) │ │ ✅ handlers 可注册 (如:static, proxy, fastcgi) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 11. NGX_HTTP_LOG_PHASE │ │ (记录访问日志) │ │ ✅ handlers 可注册 (如:access_log) │ └─────────────────────────────────────────────────────────────┘ │ ▼ 请求结束
http://www.jsqmd.com/news/571418/

相关文章:

  • PyTorch 2.8镜像作品分享:使用预装FFmpeg+OpenCV完成端到端视频后处理效果
  • 为什么选择PixiJS小程序适配方案:3大商业价值解析
  • UniApp真机调试避坑大全:从安卓USB调试权限到iOS个人免费证书的完整踩坑记录
  • Llama3微调实战:24G显存跑8B模型的避坑指南(附完整参数配置)
  • 3步实现高效转换:让专业排版效率提升80%的开源解决方案
  • GLM-4.1V-9B-Base效果展示:低光照、模糊、裁剪图等挑战性图像理解表现
  • 智能化时代的数据集成技术革新
  • 轻流无代码供应链协同:让管理变得如此简单
  • 中文停用词表优化与应用实战指南
  • 账单获取
  • Qwen3-Embedding-4B入门指南:为什么4B参数比7B更适合Embedding任务?
  • QT多媒体框架深度整合:QMediaPlayer与GStreamer Pipeline的实战对接
  • 5步掌握Python自动化交易:从手动操作到智能策略的转型指南
  • 解密网页资源批量下载:ResourcesSaverExt实战配置指南
  • 鼎峰团队(Apex Team) - 速递信息
  • 告别灰模!手把手教你用Blender给Gazebo模型“穿衣服”(附完整UV贴图流程)
  • 无需付费的AI编程助手:Cursor Pro功能完整解锁方案
  • CAD图纸转PDF的4种方法,简单易懂,新手也能轻松学会!
  • 使用快马平台基于OpenSpec一键生成可运行API原型,加速接口设计验证
  • 2026油品储存加注系统公司精准推荐:助力想找专业靠谱企业的采购商精准抉择 - GrowthUME
  • Termux快速部署Ubuntu系统并实现开机自启动完整指南
  • 终极中文语义理解指南:text2vec-base-chinese如何让AI真正读懂中文
  • DeepSeek-OCR-2参数详解:视觉因果流技术的调优秘籍
  • Jar Analyzer:提升Java开发效率的全方位JAR分析工具
  • 2026年3月31日 AI前沿资讯
  • 第14章 博弈论基础(《C++编程与信息学竞赛数学基础》)
  • NMN品牌怎么选?2026最新NMN排行榜|选购攻略 + 避坑指南,全面测评推荐 - 速递信息
  • ReadCat免费开源小说阅读器:3分钟快速上手指南,打造纯净阅读空间
  • 温州婚宴酒店深度测评:2026年包厢与婚礼堂如何选? - 2026年企业推荐榜
  • PlugY:重新定义暗黑破坏神2单机体验的终极生存套件