《深入剖析ngx》——模块综述

1. 模块机制

ngx模块大致分为:

  1. handlers: 协同完成客户端处理,产生数据。
  2. filters : 对handlers产生的数据进行各种过滤处理(增,删,改)。
  3. upstream : 如果存在真实后端服务器,ngx可用upstream模块充当反向代理。
  4. load-balance : 当ngx当代理服务器时,后端服务器可能不止一个,用于负载均衡。

ngx模块定义如下:

type值的不同ctx类型

当type 为NGX_HTTP_MODULE,ctx为指向 ngx_http_module_t 的指针变量

这些属性是回调函数,如

2. handler 模块

对于客户端的http请求,ngx将其分为多个阶段处理,handler模块可以挂载在对应的阶段。
一共11个阶段

  • NGX_HTTP_POST_READ_PHASE : 读取并解析请求头后,调用本节点回调

  • NGX_HTTP_SERVER_REWRITE_PHASE : 用于server地址重写,ngx读取头信息后,解析得到server信息,找到 虚拟服务器,进入NGX_HTTP_SERVER_REWRITE_PHASE

  • NGX_HTTP_FIND_CONFIG_PHASE : 不挂载任何回调,用于ngx执行特定任务,即 location 定位

  • NGX_HTTP_REWRITE_PHASE : location地址重写

  • NGX_HTTP_POST_REWRITE_PHASE : 不挂载任何回调,执行ngx特定任务,即检查是否做了过多内部跳转(比如redirect)

  • NGX_HTTP_PREACCESS_PHASE : 做权限检查前期工作

  • NGX_HTTP_ACESS_PHASE : 做权限检查中期工作

  • NGX_HTTP_POST_ACCESS_PHASE : 做权限检查后期工作,不能挂载回调,即判断前面权限检查结果(r->access_code),如果当前请求没有访问权限,则直接返回403

  • NGX_HTTP_TRY_FILES_PHASE : 针对配置文件中 try_files 进行处理

  • NGX_HTTP_LOG_PHASE :

  • NGX_HTTP_CONTENT_PHASE : 大部分模块挂载此阶段,用于修改http响应数据

2.1 模块挂载

大多数模块会在配置解析完成后(postconfiguration),调用挂载 回调函数,

当各个模块挂载后,

ngx会将二维数组转成一维数组

可以看出,转换为一维数组的关键是加了属性 next,此外还加了 check

2.2 模块执行

ngx遍历所有的checker

checker可能执行 回调,如

handler的返回值,和checker决定 整个事务 的工作流程,handler的返回值的含义通常如下

ngx_http_init_phase_handlers 进行数组重组,可见 回调插入和执行顺序是 栈顺序。

   451 static ngx_int_t
   452 ngx_http_init_phase_handlers(ngx_conf_t *cf, ngx_http_core_main_conf_t *cmcf)
   453 {
   545        ...
   546         n += cmcf->phases[i].handlers.nelts;
   547
   548         for (j = cmcf->phases[i].handlers.nelts - 1; j >= 0; j--) {
   549             ph->checker = checker;
   550             ph->handler = h[j];
   551             ph->next = n;
   552             ph++;
   553         }
   554     }
   555
   556     return NGX_OK;
   557 }

3. filter模块

对于http请求处理handler产生的响应内容,在输出到客户端之前需要做过滤处理,由于响应数据有 响应头和响应体,所以 过滤函数有 头过滤和体过滤。

所有header过滤功能和body过滤功能会各自组成两条过滤链。

ngx_http.c 定义了两个链表的头

在每个filter模块内定义了 链表节点

链表加入首节点

加入其他节点

链表的首节点调用

其他filter模块在自己的filter函数最后,调用next 节点

由于http报文的特点,若 报文头部filter 报错,返回 NGX_ERROR,那么 报文体 就不需要执行 filter。

posted on 2022-03-15 09:47  开心种树  阅读(528)  评论(0编辑  收藏  举报