`
奔跑的羚羊
  • 浏览: 576235 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx模块开发入门(三)-2 Components of an Nginx Module

 
阅读更多
2. Components of an Nginx Module
2.Nginx模块的组成
我说过,Nginx模块的构建是很灵活的。这一节讲描述的东西会经常出现。它可以帮助你理解模块,也可以作为开发模块的手册。

提示:本节讨论的module源文件:http://www.evanmiller.org/nginx/ngx_http_circle_gif_module.c.txt

2.1. 模块配置Struct(s)

    模块的配置struct有三种,分别是main,server和location。绝大多数模块仅需要一个location配置。
名称约定如下:ngx_http_<module name>_(main|srv|loc)_conf_t. 例子:
typedef struct {
    u_int   max_radius;
    u_int   min_radius;
    u_int   step_radius;
    unsigned char** circle_templates;
    size_t* circle_sizes;
    ngx_flag_t           enable;
} ngx_http_circle_gif_loc_conf_t;


    注意到上面展示了Nginx的一些特殊类型:(ngx_uint_t 和 ngx_flag_t); 这些只是基本类型的别名而已。(如果想知道具体是什么的别名,可以参考 core/ngx_config.h ). 这些类型用在配置结构体中的情形很多。

2.2. 模块指令(Module Directives)

    模块的指令是定义在一个叫做ngx_command_t的静态数组中的。下面举个我自己写的小模块中的例子,来告诉你模块指令是如何声明的:
static ngx_command_t  ngx_http_circle_gif_commands[] = {
    { ngx_string("circle_gif"),
      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
      ngx_http_circle_gif,
      NGX_HTTP_LOC_CONF_OFFSET,
      0,
      NULL },

    { ngx_string("circle_gif_min_radius"),
      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_num_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_circle_gif_loc_conf_t, min_radius),
      NULL },
      ...
      ngx_null_command
};


下面是结构体ngx_command_t(静态数组里的每一个元素)的定义 , 你可以在 core/ngx_conf_file.h找到它:
struct ngx_command_t {
    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;
};

结构体成员是多了点,不过各司其职,都有用处。

    1)结构体成员 name 是指令的字符串(顾名思义就是指令名称),不能包含空格. 它的类型是ngx_str_t, 通常都是以像(e.g.) ngx_str("proxy_pass")这样的方式来实例化. 注意: ngx_str_t包含一个存放字符串内容的data字段,和一个存放字符串长度的len字段。Nginx广泛地使用这个类型来存放字符串。

    2)结构体成员type是标识的集合,表明这个指令在哪里出现是合法的、指令的参数有几个。应用中,标识一般是下面多个值的BIT或:
    * NGX_HTTP_MAIN_CONF: 指令出现在main配置部分是合法的
    * NGX_HTTP_SRV_CONF: 指令在server配置部分出现是合法的 config
    * NGX_HTTP_LOC_CONF: 指令在location配置部分出现是合法的
    * NGX_HTTP_UPS_CONF: 指令在upstream配置部分出现是合法的

    * NGX_CONF_NOARGS: 指令没有参数
    * NGX_CONF_TAKE1: 指令读入1个参数
    * NGX_CONF_TAKE2: 指令读入2个参数
    * ...
    * NGX_CONF_TAKE7: 指令读入7个参数

    * NGX_CONF_FLAG: 指令读入1个布尔型数据 ("on" or "off")
    * NGX_CONF_1MORE: 指令至少读入1个参数
    * NGX_CONF_2MORE: 指令至少读入2个参数
    这里还有很多其他的选项:core/ngx_conf_file.h.

    3)结构体成员 set 是一个函数指针,它指向的函数用来进行模块配置;这个设定函数一般用来将配置文件中的参数传递给程序,并保存在配置结构体中。设定函数有三个入参:
   *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
   1. 指向结构体 ngx_conf_t 的指针, 这个结构体里包含需要传递给指令的参数
   2. 指向结构体 ngx_command_t 的指针
   3. 指向模块自定义配置结构体的指针

   设定函数会在遇到指令时执行,Nginx提供了多个函数用来保存特定类型的数据,这些函数包含有:

    * ngx_conf_set_flag_slot: 将 "on" or "off" 转换成 1 or 0
    * ngx_conf_set_str_slot: 将字符串保存为 ngx_str_t
    * ngx_conf_set_num_slot: 解析一个数字并保存为int
    * ngx_conf_set_size_slot: 解析一个数据大小(如:"8k", "1m") 并保存为size_t

    当然还有其他的,在core/ngx_conf_file.h中很容易查到。如果你觉得现有这些内置的函数还不能满足你,当然也可以传入自己的函数引用。

    这些内置函数是如何知道把数据存放在哪里的呢?这就是接下来两个结构体ngx_command_t的成员 confoffset要做的事了.
   
   4)conf 告诉Nginx把数据存在模块的哪个配置中,是main配置、server 配置, 还是 location 配置 ?(通过 NGX_HTTP_MAIN_CONF_OFFSET, NGX_HTTP_SRV_CONF_OFFSET, 或者 NGX_HTTP_LOC_CONF_OFFSET).

   5)offset 确定到底是保存在结构体的哪个位置。

   6)最后, post指向模块在读配置的时候需要的一些零碎变量。一般它是NULL。

    ngx_command_t数组以ngx_null_command 为终结符(就好像字符串以'\0'为终结符一样).

   本例中,对应的实现为:
static char *
ngx_http_circle_gif(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    ngx_http_core_loc_conf_t  *clcf;
    ngx_http_circle_gif_loc_conf_t *cglcf = conf;

    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    clcf->handler = ngx_http_circle_gif_handler;

    cglcf->enable = 1;

    return NGX_CONF_OK;
}
分享到:
评论

相关推荐

    nginx-sticky-module-1.25.zip

    ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=../nginx-sticky-module-1.25 --without-http_ssi_module --without-http_autoindex_module --without-http_fastcgi_module --with-...

    添加nginx-http-flv-module模块并重新编译后的nginx(windows版)

    本资源提供的是一款针对Windows平台的Nginx,其中已经集成了`nginx-http-flv-module`模块,这个模块主要用于支持HTTP实时流(HTTP Live Streaming, HLS)和Flash视频流(Flash Video, FLV)。现在我们将深入探讨这一...

    nginx + nginx-http-flv-module-1.2.9

    nginx-http-flv-module 是由 nginx 开发社区创建的一个第三方模块,用于在 Nginx 上实现 HTTP 直播(HTTP Live Streaming,HLS)和FLV格式的视频流。FLV(Flash Video)是 Adobe Flash 平台广泛使用的视频格式,...

    nginx上传下载之nginx-upload-module-2.3.0

    ./configure --add-module=../nginx-upload-module-2.3.0 \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-pcre make sudo make install ``` 这里的 `--with-http_ssl_module` 参数表示启用 ...

    nginx-rtmp模块源码包nginx-rtmp-module-master

    **三、Nginx-RTMP 模块功能** 1. **直播**:Nginx-RTMP 可以接收来自各种 RTMP 发布工具(如 OBS Studio、FFmpeg)的直播流,并将其分发到多个客户端。 2. **点播**:支持存储和重放已发布的流,实现点播功能。 3. *...

    nginx-http-flv-module(windows版)

    --&gt; nginx-http-module-v1.2.10 --&gt; nginx-1.21.6 ======================== 在网上查找半天都只有教程,没有可免费下载的版本,深知没有积分遍地找资源的痛苦,无奈之下只好自己按照教程一步一个坑编译出来的,供...

    nginx-http-flv-module-1.2.10(包含nginx-rtmp-module)

    而nginx-rtmp-module则是一个额外的Nginx模块,它增加了对Real-Time Messaging Protocol (RTMP)的支持,使Nginx能够作为RTMP服务器接收并分发直播流。 1. **HTTP FLV 模块详解** HTTP FLV模块使得Nginx可以处理FLV...

    nginx-module-vts-0.1.18.tar.gz

    解压之后安装如下:mv nginx-module-vts-0.1.18 /usr/local/ yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel cd /usr/local/nginx/nginx-1.13.7 ./configure --add-module=/...

    windows平台nginx编译nginx-http-flv-module

    在给定的压缩包文件中,"使用必看.txt"可能包含了编译和使用过程中的注意事项,而"nginx-rtmp.zip"可能是包含了RTMP模块的源代码,这在搭建流媒体服务器时也会用到,因为HTTP FLV Module通常与RTMP模块结合使用,为...

    nginx-sticky-module-ng-1.2.6.tar.gz

    在 `nginx-sticky-module-ng-1.2.6` 压缩包中,通常包含以下组件: 1. `src`: 这是源代码目录,包含了模块的核心代码,如 `ngx_http_sticky_module.c`,它是实现会话保持功能的主要源文件。 2. `config`: 配置脚本...

    win环境使用nginx的nginx-http-flv-module.zip

    在windows 7 64位 环境下使用nginx的nginx-http-flv-module搭建flv视频流播放所有的安装包,参考:https://blog.csdn.net/qq_33071429/article/details/102628008

    集成了nginx-http-flv-module 1.2.9模块的64位nginx-1.21.4程序

    `nginx-http-flv-module`是Nginx的一个第三方模块,由张洪君开发,用于处理FLV格式的流媒体数据。通过这个模块,Nginx可以支持RTMP协议,实现实时流媒体的推拉流,为Flash Player和其他支持RTMP的客户端提供服务。...

    nginx-http-flv-module(nginx1.19.3&amp;http-flv-module1.2.7&amp;windows)

    1、nginx-http-flv-module(windows可执行程序,含http-flv-module:1.2.7,nginx 1.19.3) 2、不要放置于中文路径下,否则无法启动 3、说明文档,请下载查看。

    nginx-http-flv-module(linux & nginx1.19.3 & http-flv-module1.2.7).zip.zip

    1、最新版 nginx-http-flv-module(linux可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动 4、sbin/nginx -c conf/nginx.conf

    nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip

    Sticky是nginx的一个模块,它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,默认标识名为route (a)客户端首次发起访问请求,nginx接收后,发现...

    nginx-http-flv-module-master

    【Nginx-HTTP-FLV-Module-Master】是一个专为Nginx服务器设计的扩展模块,旨在增强其对HTTP FLV(Flash Video)流的支持,并且特别强调了对h265视频编码格式的兼容性。这个模块使得Nginx能够作为一个高效的流媒体...

    nginx-module-vts.tar.gz

    Nginx-Module-VTS是Nginx的一个增强模块,主要功能是提供详细的Web服务器访问统计和性能监控。Prometheus是一款流行的开源监控和警报工具,广泛用于收集和分析各种系统的指标。在本场景中,Nginx-Module-VTS与...

    (修复bug模块)nginx-http-flv-module-master 支持flv模块直播

    【标题】:“(修复bug模块)nginx-http-flv-module-master 支持flv模块直播” 指的是一个专门针对Nginx服务器的扩展模块,该模块允许Nginx支持流媒体服务,特别是针对FLV(Flash Video)格式的实时流媒体。...

    nginx-http-flv-module(windows & nginx1.19.3 & http-flv-module1.2.7).zip

    1、最新版 nginx-http-flv-module(windows可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动

    nginx-1.19.3_nginx-http-flv-module.rar

    `nginx-http-flv-module`是Nginx的一个第三方模块,它扩展了Nginx处理FLV流的能力。FLV是一种流行的视频格式,常用于在线视频服务,尤其是与Adobe Flash Player兼容的平台。通过这个模块,Nginx可以接收并分发FLV流...

Global site tag (gtag.js) - Google Analytics