ITPub博客

首页 > > > handler模块的编译和使用

handler模块的编译和使用

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

handler模块的编译和使用

模块的功能开发完了之后,模块的使用还需要编译才能够执行,下面我们来看下模块的编译和使用。

config文件的编写

对于开发一个模块,我们是需要把这个模块的C代码组织到一个目录里,同时需要编写一个config文件。这个config文件的内容就是告诉nginx的编译脚本,该如何进行编译。我们来看一下hello handler module的config文件的内容,然后再做解释。

ngx_addon_name=ngx_http_hello_moduleHTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"

其实文件很简单,几乎不需要做什么解释。大家一看都懂了。唯一需要说明的是,如果这个模块的实现有多个源文件,那么都在NGX_ADDON_SRCS这个变量里,依次写进去就可以。

编译

对于模块的编译,nginx并不像apache一样,提供了单独的编译工具,可以在没有apache源代码的情况下来单独编译一个模块的代码。nginx必须去到nginx的源代码目录里,通过configure指令的参数,来进行编译。下面看一下hello module的configure指令:

./configure –prefix=/usr/local/nginx-1.3.1 –add-module=/home/jizhao/open_source/book_module

我写的这个示例模块的代码和config文件都放在/home/jizhao/open_source/book_module这个目录下。所以一切都很明了,也没什么好说的了。

使用

使用一个模块需要根据这个模块定义的配置指令来做。比如我们这个简单的hello handler module的使用就很简单。在我的测试服务器的配置文件里,就是在http里面的默认的server里面加入如下的配置:

location /test {

hello_string jizhao;

hello_counter on;

}

当我们访问这个地址的时候, lynx http://127.0.0.1/test的时候,就可以看到返回的结果。

jizhao Visited Times:1

当然你访问多次,这个次数是会增加的。

更多handler模块示例分析

http access module

该模块的代码位于src/http/modules/ngx_http_access_module.c中。该模块的作用是提供对于特定host的客户端的访问控制。可以限定特定host的客户端对于服务端全部,或者某个server,或者是某个location的访问。 该模块的实现非常简单,总共也就只有几个函数。

static ngx_int_t ngx_http_access_handler(ngx_http_request_t *r);

static ngx_int_t ngx_http_access_inet(ngx_http_request_t *r,

ngx_http_access_loc_conf_t *alcf, in_addr_t addr);

#if (NGX_HAVE_INET6)

static ngx_int_t ngx_http_access_inet6(ngx_http_request_t *r,

ngx_http_access_loc_conf_t *alcf, u_char *p);

#endif

static ngx_int_t ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny);

static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,

void *conf);

static void *ngx_http_access_create_loc_conf(ngx_conf_t *cf);

static char *ngx_http_access_merge_loc_conf(ngx_conf_t *cf,

void *parent, void *child);

static ngx_int_t ngx_http_access_init(ngx_conf_t *cf);

对于与配置相关的几个函数都不需要做解释了,需要提一下的是函数ngx_http_access_init,该函数在实现上把本模块挂载到了NGX_HTTP_ACCESS_PHASE阶段的handler上,从而使自己的被调用时机发生在了NGX_HTTP_CONTENT_PHASE等阶段前。因为进行客户端地址的限制检查,根本不需要等到这么后面。

另外看一下这个模块的主处理函数ngx_http_access_handler。这个函数的逻辑也非常简单,主要是根据客户端地址的类型,来分别选择ipv4类型的处理函数ngx_http_access_inet还是ipv6类型的处理函数ngx_http_access_inet6。

而这个两个处理函数内部也非常简单,就是循环检查每个规则,检查是否有匹配的规则,如果有就返回匹配的结果,如果都没有匹配,就默认拒绝。

http static module

从某种程度上来说,此模块可以算的上是“最正宗的”,“最古老”的content handler。因为本模块的作用就是读取磁盘上的静态文件,并把文件内容作为产生的输出。在Web技术发展的早期,只有静态页面,没有服务端脚本来动态生成HTML的时候。恐怕开发个Web服务器的时候,第一个要开发就是这样一个content handler。

http static module的代码位于src/http/modules/ngx_http_static_module.c中,总共只有两百多行近三百行。可以说是非常短小。

我们首先来看一下该模块的模块上下文的定义。

ngx_http_module_t ngx_http_static_module_ctx = {

NULL, /* preconfiguration */

ngx_http_static_init, /* postconfiguration */

NULL, /* create main configuration */

NULL, /* init main configuration */

NULL, /* create server configuration */

NULL, /* merge server configuration */

NULL, /* create location configuration */

NULL /* merge location configuration */

};

是非常的简洁吧,连任何与配置相关的函数都没有。对了,因为该模块没有提供任何配置指令。大家想想也就知道了,这个模块做的事情实在是太简单了,也确实没什么好配置的。唯一需要调用的函数是一个ngx_http_static_init函数。好了,来看一下这个函数都干了写什么。

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

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

注册时间:2019-12-18

  • 博文量
    492
  • 访问量
    12009