nginx 源代码分析 (五)

2021-06-20  本文已影响0人  RonZheng2010

1. phases

nginx将数据处理过程划分为几个阶段(phase)。

2. ngx_http_phase_handler_pt 与 ngx_http_handler_pt

每个阶段可以挂接若干处理函数,ngx_http_core_run_phase() 按阶段调用这些函数。不管是Nginx自身的nginx_module,还是使用者的ngx_module,都可以挂接自己的处理函数。这个处理函数的原型定义是ngx_http_handler_pt。

typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);

挂接的位置是ngx_http_core_main_conf_t.phases[]数组,保存ngx_http_phase_t结构。Ngx_http_phase_t.handlers[]是一个ngx_http_phase_t数组,每个phase一个元素。Ngx_http_phase_t的成员handlers也是一个数组,该阶段的处理函数ngx_http_handler_pt都注册在这里。

实际上处理http请求时,并不是使用ngx_http_core_main_conf_t.phases[],而是ngx_http_core_main_conf_t.phase_engine。Ngx_http_phase_engint_t.handlers是一个ngx_http_phase_handler_t。

ngx_http_handler_pt只是ngx_module挂接的处理函数。Ngx_http_phase_handler_pt则是每个phase指定的校验函数。如果校验通过,校验函数才会调用处理函数。

typedef ngx_int_t (*ngx_http_phase_handler_pt)(ngx_http_request_t *r, 
ngx_http_phase_handler_t *ph);

ngx_http_phase_handler_t包括了校验函数和处理函数。

3. ngx_http_init_phases()

ngx_http_init_phases() 初始化ngx_http_core_main_conf.phases[]中的处理函数数组。

4. ngx_http_module_t::postconfiguration()

在ngx_http_module_t::postconfiguration()中,nginx模块向ngx_http_core_main_conf_t.phases中,加入自己的的处理函数。对于ngx_http_auth_basic_module模块,就是ngx_http_auth_basic_init()。

5. ngx_http_init_phase_handlers()

ngx_http_init_phase_handlers()初始化ngx_core_main_conf_t.phase_engine.handlers[]。

这个过程的大致情形如下图。

6. ngx_http_block()

在ngx_http_block()中调用以上函数。

如下是缺省情况(不定制或拓展nginx的功能)下,最后ngx_http_core_main_conf_t.phase_engine.handlers[]的布局。

7. ngx_http_core_run_phases()

ngx_http_core_run_phases() 在一个循环中访问ngx_http_core_main_conf_t.phase_engine.handlers[],调用其中的校验函数和处理函数。

访问位置由ngx_http_request_t.phase_handler指定,这个值一开始为0,后来校验函数会改变它,所以ngx_http_core_run_phase()会在ngx_http_core_main_conf_t.phase_engine.handlers[]中跳转。

校验函数和处理函数的一个例子是ngx_http_core_access_phase()和ngx_http_auth_basic_handler()。

7.1 ngx_http_phase_handler_t::handler()

在ngx_http_auth_basic_handler()中,

7.2 ngx_http_phase_handler_t::checker()

在ngx_http_core_access_phase()中,

上一篇下一篇

猜你喜欢

热点阅读