《深入剖析ngx》——模块综述
1. 模块机制
ngx模块大致分为:
- handlers: 协同完成客户端处理,产生数据。
- filters : 对handlers产生的数据进行各种过滤处理(增,删,改)。
- upstream : 如果存在真实后端服务器,ngx可用upstream模块充当反向代理。
- 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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?