ZBLOG

nginx里面是责任链模式么,总共11个阶段形成一个数组,每一个数组下面挂着一个链表么

是的,你的理解基本正确。Nginx 的 HTTP 请求处理过程采用了类似责任链模式的设计,其核心通过 11 个阶段(Phases) 组织处理流程,每个阶段对应一个挂载点(挂钩点),允许模块通过回调函数插入处理逻辑。以下是详细说明:


1. Nginx 的 11 个处理阶段

Nginx 将 HTTP 请求处理划分为以下 11 个阶段(按顺序执行):

  1. NGX_HTTP_POST_READ_PHASE

    • 读取请求头后的最早阶段,常用于全局预处理(如真实客户端 IP 提取)。
  2. NGX_HTTP_SERVER_REWRITE_PHASE

    • Server 级别的 URI 重写(在 server 块内定义的 rewrite 规则)。
  3. NGX_HTTP_FIND_CONFIG_PHASE

    • 特殊阶段:Nginx 内部使用,用于根据 URI 匹配 location(不可注入模块逻辑)。
  4. NGX_HTTP_REWRITE_PHASE

    • Location 级别的 URI 重写(在 location 块内定义的 rewrite 规则)。
  5. NGX_HTTP_POST_REWRITE_PHASE

    • 特殊阶段:重写后的收尾工作(如检查是否需要重新跳转回 FIND_CONFIG,不可注入模块逻辑)。
  6. NGX_HTTP_PREACCESS_PHASE

    • 访问控制前的预处理(如连接限流、权限预处理)。
  7. NGX_HTTP_ACCESS_PHASE

    • 访问控制(如 IP 黑白名单、身份认证)。
  8. NGX_HTTP_POST_ACCESS_PHASE

    • 特殊阶段:访问控制后的收尾(如处理拒绝请求的响应,不可注入模块逻辑)。
  9. NGX_HTTP_PRECONTENT_PHASE

    • 生成内容前的最后处理(如 try_files 指令)。
  10. NGX_HTTP_CONTENT_PHASE

    • 核心内容生成阶段(代理转发、静态文件处理、FastCGI等)。
  11. NGX_HTTP_LOG_PHASE

    • 请求结束后的日志记录。

✅ “数组 +链表”结构

  • Nginx 确实通过一个数组(长度为11)来管理这些阶段,每个数组元素对应一个阶段(例如 phases[NGX_HTTP_POST_READ_PHASE])。

  • 每个数组元素是一个链表头,链表中挂载了该阶段需要执行的所有回调函数(即模块注册的处理句柄)。例如:

    // nginx/src/http/ngx_http_core_module.h
    typedef struct ngx_http_phase_handler_s {
        ngx_int_t (*checker)(ngx_request_t *r, ngx_int_t rc); //检查函数
        ngx_int_t (*handler)(ngx_request_t *r);               //实际处理的回调函数
        ...
    } ngx_handler_t;
    
    
    // phases数组管理所有阶段的处理器链表
    ngx_array_t phases[NGX_NUM_OF_STAGES]; 
    

    -当请求到达时,Nginx会按顺序遍历每个阶段的链表,执行其中注册的回调函数。


⚠️注意:并非所有阶段都允许模块注入

-上述11个阶段中,有3个是Nginx内部使用的特殊阶段(FIND_CONFIG,POST_REWRITE,POST ACCESS) ,不允许外部模块添加自定义逻辑。 -其他8个开放给第三方或内置模块注册自己的处理器。


🌰示例:模块如何挂载到责任链

例如,一个自定义模块想在 `PREACCESS PHASe’挂载自己的函数:

static ngx_int_t my_preaccess_handler(ngy_request t *r);

//在模块初始化时注册:
static ngx_int_t init(ngy_conf t *cf) {
    ngy http core main conf t *cmcf = ngy http conf get module main conf(cf, ngy http core module);
    
    //获取PREACCESS阶段的处理器链表
    ngy http phase handler t *ph = cmcf->phases[NGY HTTP PREACCESS PHASe].handlers;
    
    //将自定义函数添加到链表尾部
    return ngy array push(&ph->handlers, &my_preaccess handler);
}

总结:

  • Nginx通过11个阶段的数组+链表结构实现责任链模式。 -每个开放阶段允许多个模块注册处理器,按顺序执行。 -这种设计提供了高度的灵活性和可扩展性,是Nginx高性能和高并发的架构基础之一。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24264

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?