ITPub博客

首页 > > > handler- 模块的定义

handler- 模块的定义

作者:longmanma 时间:2019-12-13 17:57:42 0 删除 编辑

 模块的定义

对于开发一个模块来说,我们都需要定义一个ngx_module_t类型的变量来说明这个模块本身的信息,从某种意义上来说,这是这个模块最重要的一个信息,它告诉了nginx这个模块的一些信息,上面定义的配置信息,还有模块上下文信息,都是通过这个结构来告诉nginx系统的,也就是加载模块的上层代码,都需要通过定义的这个结构,来获取这些信息。

我们先来看下ngx_module_t的定义

typedefstructngx_module_sngx_module_t;structngx_module_s{ngx_uint_tctx_index;ngx_uint_tindex;ngx_uint_tspare0;ngx_uint_tspare1;ngx_uint_tabi_compatibility;ngx_uint_tmajor_version;ngx_uint_tminor_version;void*ctx;ngx_command_t*commands;ngx_uint_ttype;ngx_int_t(*init_master)(ngx_log_t*log);ngx_int_t(*init_module)(ngx_cycle_t*cycle);ngx_int_t(*init_process)(ngx_cycle_t*cycle);ngx_int_t(*init_thread)(ngx_cycle_t*cycle);void(*exit_thread)(ngx_cycle_t*cycle);void(*exit_process)(ngx_cycle_t*cycle);void(*exit_master)(ngx_cycle_t*cycle);uintptr_tspare_hook0;uintptr_tspare_hook1;uintptr_tspare_hook2;uintptr_tspare_hook3;uintptr_tspare_hook4;uintptr_tspare_hook5;uintptr_tspare_hook6;uintptr_tspare_hook7;};#define NGX_NUMBER_MAJOR 3

#define NGX_NUMBER_MINOR 1

#define NGX_MODULE_V1 0, 0, 0, 0, \

NGX_DSO_ABI_COMPATIBILITY, NGX_NUMBER_MAJOR, NGX_NUMBER_MINOR

#define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0

再看一下hello模块的模块定义。

ngx_module_t ngx_http_hello_module = {

NGX_MODULE_V1,

&ngx_http_hello_module_ctx, /* module context */

ngx_http_hello_commands, /* module directives */

NGX_HTTP_MODULE, /* module type */

NULL, /* init master */

NULL, /* init module */

NULL, /* init process */

NULL, /* init thread */

NULL, /* exit thread */

NULL, /* exit process */

NULL, /* exit master */

NGX_MODULE_V1_PADDING

};

模块可以提供一些回调函数给nginx,当nginx在创建进程线程或者结束进程线程时进行调用。但大多数模块在这些时刻并不需要做什么,所以都简单赋值为NULL。

handler模块的基本结构

除了上一节介绍的模块的基本结构以外,handler模块必须提供一个真正的处理函数,这个函数负责对来自客户端请求的真正处理。这个函数的处理,既可以选择自己直接生成内容,也可以选择拒绝处理,由后续的handler去进行处理,或者是选择丢给后续的filter进行处理。来看一下这个函数的原型申明。

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

r是http请求。里面包含请求所有的信息,这里不详细说明了,可以参考别的章节的介绍。 该函数处理成功返回NGX_OK,处理发生错误返回NGX_ERROR,拒绝处理(留给后续的handler进行处理)返回NGX_DECLINE。 返回NGX_OK也就代表给客户端的响应已经生成好了,否则返回NGX_ERROR就发生错误了。

handler模块的挂载

handler模块真正的处理函数通过两种方式挂载到处理过程中,一种方式就是按处理阶段挂载;另外一种挂载方式就是按需挂载。

按处理阶段挂载

为了更精细地控制对于客户端请求的处理过程,nginx把这个处理过程划分成了11个阶段。他们从前到后,依次列举如下:

NGX_HTTP_POST_READ_PHASE:

 读取请求内容阶段

NGX_HTTP_SERVER_REWRITE_PHASE:

 Server请求地址重写阶段

NGX_HTTP_FIND_CONFIG_PHASE:

 配置查找阶段:

NGX_HTTP_REWRITE_PHASE:

 Location请求地址重写阶段

NGX_HTTP_POST_REWRITE_PHASE:

 请求地址重写提交阶段

NGX_HTTP_PREACCESS_PHASE:

 访问权限检查准备阶段

NGX_HTTP_ACCESS_PHASE:

 访问权限检查阶段

NGX_HTTP_POST_ACCESS_PHASE:

 访问权限检查提交阶段

NGX_HTTP_TRY_FILES_PHASE:

 配置项try_files处理阶段

NGX_HTTP_CONTENT_PHASE:

 内容产生阶段

NGX_HTTP_LOG_PHASE:

 日志模块处理阶段

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2730/viewspace-3123762/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    12002