nginx 编写简单HTTP模块以及nginx http handler的hello world示例编写

编写nginx http handler模块以便开发自己模块,本文提供hello编写到编译的详细步骤 , 文章最后提供整个示例代码

编写http handler模块的几个组成部分讲解:

1、ngx_command_t

示例:

static ngx_command_t  ngx_http_mytest_commands[] =
{
    {
        ngx_string("mytest"),
        NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LMT_CONF | NGX_CONF_NOARGS,
        ngx_http_mytest,
        NGX_HTTP_LOC_CONF_OFFSET,
        0,
        NULL
    },

    ngx_null_command
};

在nginx.conf 中编写的配置项 mytest 来说, nginx 首先会遍历所有的模块(modules),而对于每个模块, 会遍历他所对应的ngx_command_t 数组, 试图找到关于我们的配置项mytest 的解析方式。
command中用于处理配置项参数的set 方法,函数名格式写法ngx_http_xxxxx,如下所示:

static char *
ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_core_loc_conf_t  *clcf;

    //首先找到mytest配置项所属的配置块,clcf貌似是location块内的数据
//结构,其实不然,它可以是main、srv或者loc级别配置项,也就是说在每个
//http{}和server{}内也都有一个ngx_http_core_loc_conf_t结构体
    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

    //http框架在处理用户请求进行到NGX_HTTP_CONTENT_PHASE阶段时,如果
//请求的主机域名、URI与mytest配置项所在的配置块相匹配,就将调用我们
//实现的ngx_http_mytest_handler方法处理这个请求
    clcf->handler = ngx_http_mytest_handler;

    return NGX_CONF_OK;
}

关于ngx_http_conf_get_module_loc_conf 的定义可以参考: http://lxr.nginx.org/source/src/http/ngx_http_config.h#0065 本质: 就是设置ngx_http_mytest_handler, 匹配项被选中的时候, 应该如何解析。

ngx_command_t的定义,位于src/core/ngx_conf_file.h中。

struct ngx_command_s {
    ngx_str_t             name;
    ngx_uint_t            type;
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
    ngx_uint_t            conf;
    ngx_uint_t            offset;
    void                 *post;
};

name: 配置指令的名称。

type: 该配置的类型,其实更准确一点说,是该配置指令属性的集合。nginx提供了很多预定义的属性值(一些宏定义),通过逻辑或运算符可组合在一起,形成对这个配置指令的详细的说明。下面列出可在这里使用的预定义属性值及说明。

  • NGX_CONF_NOARGS:配置指令不接受任何参数。

  • NGX_CONF_TAKE1:配置指令接受1个参数。

  • NGX_CONF_TAKE2:配置指令接受2个参数。

  • NGX_CONF_TAKE3:配置指令接受3个参数。

  • NGX_CONF_TAKE4:配置指令接受4个参数。

  • NGX_CONF_TAKE5:配置指令接受5个参数。

  • NGX_CONF_TAKE6:配置指令接受6个参数。

  • NGX_CONF_TAKE7:配置指令接受7个参数。

可以组合多个属性,比如一个指令即可以不填参数,也可以接受1个或者2个参数。那么就是NGX_CONF_NOARGS|NGX_CONF_TAKE1|NGX_CONF_TAKE2。如果写上面三个属性在一起,你觉得麻烦,那么没有关系,nginx提供了一些定义,使用起来更简洁。

  • NGX_CONF_TAKE12:配置指令接受1个或者2个参数。

  • NGX_CONF_TAKE13:配置指令接受1个或者3个参数。

  • NGX_CONF_TAKE23:配置指令接受2个或者3个参数。

  • NGX_CONF_TAKE123:配置指令接受1个或者2个或者3参数。

  • NGX_CONF_TAKE1234:配置指令接受1个或者2个或者3个或者4个参数。

  • NGX_CONF_1MORE:配置指令接受至少一个参数。

  • NGX_CONF_2MORE:配置指令接受至少两个参数。

  • NGX_CONF_MULTI: 配置指令可以接受多个参数,即个数不定。

  • NGX_CONF_BLOCK:配置指令可以接受的值是一个配置信息块。也就是一对大括号括起来的内容。里面可以再包括很多的配置指令。比如常见的server指令就是这个属性的。

  • NGX_CONF_FLAG:配置指令可以接受的值是”on”或者”off”,最终会被转成bool值。

  • NGX_CONF_ANY:配置指令可以接受的任意的参数值。一个或者多个,或者”on”或者”off”,或者是配置块。 最后要说明的是,无论如何,nginx的配置指令的参数个数不可以超过NGX_CONF_MAX_ARGS个。目前这个值被定义为8,也就是不能超过8个参数值。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值