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的成员
conf 和
offset要做的事了.
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;
}
分享到:
相关推荐
在命令行中运行`npm install <module-name>`或`yarn add <module-name>`。如果项目使用了`package.json`文件,确认模块名在`dependencies`或`devDependencies`中。 3. 清理npm缓存: 有时,npm的缓存可能导致模块...
OpenResty itself has been relying on automated testing to remain high quality over the ...the heart of these test suites is usually the Test::Nginx test scaffold module developed by the OpenResty team.
Deploying and Maintaining Production Instances, shows us how to prepare a server for production prime time, explaining what configuration should be taken care of and how to configure an Nginx reverse...
模板可能已经包含了一些开发和测试工具,如Jest和Enzyme用于单元测试,ESLint和Prettier用于代码规范和格式化,以及热模块替换(Hot Module Replacement,HMR)以加速开发过程。 ### 七、部署与性能优化 1. **部署*...
- **SELinux Overview**: Overview of Security-Enhanced Linux, a security module for Linux that implements mandatory access controls. - **Policy Configuration**: Explanation of SELinux policies and how ...
该存储库提供了一个起始模板,该模板由用于API Component Bundle和配置为对应用程序使用cwa-nuxt-module应用程序组成。 此设置将包括通过使用bash脚本文件将CI与GitLab集成,以便更轻松地在不同CI工具之间进行切换...
例如,GStreamer、Nginx RTMP Module或FFmpeg都可以作为RTSP服务器。这里以GStreamer为例,它是一个强大的多媒体处理框架,支持RTSP服务器功能。首先,确保安装了GStreamer并配置好RTSP服务器。 接下来,我们需要在...
- **前端业务模块源码(Business Module Frontend Source)**:使用Artifactory等仓库管理前端业务模块的构建产物。 - **文档站点(Doc Site)**:自动生成文档,方便团队成员查阅。 通过这一系列的技术革新和流程优化...
2. **组件(Components)**:组件是Angular中最基本的构建块,代表页面的一部分,有自己的视图和控制器逻辑。 3. **服务(Services)**:"angular-hello-addon"可能包含自定义服务,用于处理数据获取、共享状态或...
首先,创建一个多页面应用通常是为了处理不同的业务模块或者需要独立的URL结构。在 Vue CLI 3.0 中,我们不再像单页面应用那样只有一个入口点,而是为每个页面创建一个独立的入口。 **一、初始化项目** 使用 `vue ...