typedef struct ngx_http_phase_handlers ngx_http_phase_handler_t;
typedef ngx_int_t (*ngx_http_phase_handler_pt) (ngx_http_request_t *r, ngx_http_phase_handler_t *ph);
typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
struct ngx_http_phase_handler_s {
ngx_http_phase_handler_pt checker;
ngx_http_handler_pt handler;
ngx_uint_t next;
};
- 一个http阶段,包括check检查方法和handler处理方法,其中check检查方法只能由HTTP框架(ngx_http_core_module模块)实现,以此来控制请求的流程
- next的设计使得处理阶段不必按照顺序依次执行
typedef struct {
ngx_http_phase_handler_t *handlers;
ngx_uint_t server_rewrite_index;
ngx_uint_t location_rewrite_index;
} ngx_http_phase_engine_t;
- handlers是由ngx_http_phase_handler_t组成的数组,它表示一个请求可能经历的所有ngx_http_phase_handler_t处理方法
- server_rewrite_index表示NGX_HTTP_SERVER_REWRITE_PHASE阶段第一个ngx_http_phase_handler_t处理方法在handlers数组里的序号,便于从任何一个阶段快速跳转到NGX_HTTP_SERVER_REWRITE_PHASE阶段
- location_rewrite_index表示NGX_HTTP_REWRITE_PHASE阶段的第一个ngx_http_phase_handler_t处理方法在handlers数组里的序号,便于从任何一个阶段快速跳转到NGX_HTTP_REWRITE_PHASE阶段
- 可以看出,ngx_http_phase_engine_t保存了当前配置下,一个用户请求可能经历的所有ngx_http_phase_handler_t方法,ngx_http_phase_engine_t结构体是保存在全局的ngx_http_core_main_conf_t结构体中
typedef struct {
ngx_array_t handlers;
}ngx_http_phase_t;
typedef struct {
……
ngx_http_phase_engine_t phase_engine;
ngx_http_phase_t phases[NGX_HTTP_LOG_PHASE + 1];
……
} ngx_http_core_main_t;
- phase_engine 控制着运行过程中一个HTTP请求所要经过的HTTP处理阶段,它将配合ngx_http_request_t结构体中的phase_handler成员使用(phase_handler指定了当前请求应当执行哪一个HTTP阶段); 而phases数组更想一个临时变量,它实际上只会在Nginx启动过程中用到,它的唯一使命是按照11个阶段的概念初始化phase_engine中的handlers数组
网友评论