`
cloudtech
  • 浏览: 4607017 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

nginx module开发中module的调用链

 
阅读更多

1.首先在nginx启动时,读取在编译时add-module指定的目录下的配置文件中指定的moudle name对应ngx_http_module_t变量。

如在ngx_module_test模块的目录下的配置文件为:

ngx_addon_name=ngx_module_test

HTTP_MODULES="$HTTP_MODULES ngx_module_test"

NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_module_test.c"

则nginx启动时处理add-module时会先找ngx_module_test.c中变量名为ngx_module_test的ngx_module_t结构。

2.根据ngx_module_t结构->ngx_command_t结构->初始化函数指针找到初始化函数进行初始化。

所以ngx_module_test.c至少需要有如下亦是定义:

a.ngx_module_tngx_module_test.定义模块入口和需要的参数:

ngx_module_t ngx_module_test = {
NGX_MODULE_V1,
&ngx_test_module_ctx, /* module context */
ngx_test_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
};

b.ngx_http_module_t ngx_test_module_ctx用于将nginx环境传递给handler

static ngx_http_module_t ngx_test_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */

NULL, /* create main configuration */
NULL, /* init main configuration */

NULL, /* create server configuration */
NULL, /* merge server configuration */

ngx_test_create_loc_conf, /* create location configuration */
ngx_test_merge_loc_conf /* merge location configuration */
};


c.用来初始化和注册handler的ngx_command_t ngx_test_commands数组,可以同时加载多个:

static ngx_command_t ngx_test_commands[] = {
{ ngx_string("test"),
NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
ngx_test_init,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_test_loc_conf_t, ecdata),
NULL},
ngx_null_command
};


d.char * ngx_test_init,处理初始化和注册handler的函数指针

static char * ngx_test_init(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {
ngx_http_core_loc_conf_t *clcf;
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);


clcf->handler = ngx_test_handler; //在这里注册我们的handler,同时传入相关的上下文
ngx_conf_set_str_slot(cf, cmd, conf);
return NGX_CONF_OK;
}


e.主要的处理逻辑 static ngx_int_t ngx_test_handler(ngx_http_request_t *r)








分享到:
评论

相关推荐

    lua-nginx-module完全指南.docx

    只能在这些配置指令的上下文中运行的用户Lua代码中调用下面描述的Nginx Lua API。 该API以两个标准软件包ngx和ndk提供接口给Lua。这些软件包在ngx_lua是默认全局生效,并且始终在ngx_lua指令中可用。 文中介绍指令67...

    JDK1.6使用BouncyCastle第三方jar支持TSL1.2通过Nginx转发多个HTTPS接口请求

    应用从DMZ迁移到内网后,就不能连接外网了,必须通过代理服务器才能调用第三方接口。使用Nginx作为代理服务器,HTTP的接口代理没有问题,HTPPS的接口代理Java后台总是报错,主要是因为项目使用的JDK1.6,不支持TLS...

    nginx_upstream_module:Tarantool NginX上游模块(REST,JSON API,websockets,负载平衡)

    可通过JSON-RPC或REST调用的Tarantool方法。 具有弹性配置的负载平衡。 备份和容错。 低开销。 进一步了解: 局限性 在Tar​​antool支持带外答复之前,不支持WebSocket。 此模块不支持从2.4.0开始的Tarantool...

    详解nginx basic auth配置踩坑记

    本篇文章主要介绍了详解nginx basic auth配置踩坑记,nginx的basic auth配置由ngx_http_auth_basic_module模块提供,对HTTP Basic Authentication协议进行了支持,感兴趣的小伙伴们可以参考一下

    ngx_xqw_backtrace_module.zip

    当nginx收到异常信号SIGINT退出时,会将此时的函数调用堆栈输出到日志文件中,方便调试。

    PHP框架DoitPHP v3.0 正式版

    简而言之:DoitPHP运行高效,易学易用,易于扩展。换而言之:DoitPHP运行高效而不失...四、集成了JQUERY及THICKBOX、TABS、JQUERY FORM、LAZYLOAD等JQUERY插件,使前端页面开发中实现AJAX LOADING图片加载效果、灯箱效

    nServer-v2.1023[FTP + MYSQL + HTTP + PHP(FCGI)]

    - 更新Nginx1.2.4集成nginx_concat_module模块,多文件合并功能 2012年10月22日 - 更新PHP版本为5.4.8和5.3.18 - 更新MySQL版本为5.5.28 - 加入php-xdebug支持,版本2.2.1 2012年10月15日 - 修正php5.2启动错误 ...

    Nginx学习笔记之事件驱动框架处理流程

    ngx_event_core_module模块的ngx_event_process_init方法对事件模块做了一些初始化。其中包括将“请求连接”这样一个读事件对应的处理方法(handler)设置为ngx_event_accept函数,并将此事件添加到epoll模块中。当...

    fastdfs文件 系统 所需要 的jaar包

    fastdfs-nginx-module_v1.16.tar.gz FastDFS_v5.05.tar.gz libfastcommon-1.0.7.tar.gz nginx-1.8.1.tar.gz

    python负载均衡的简单实现方法

    提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能。...我们想调用module_b模块中的接口,module_b服务在10.10.10.115服务器上

    疯狂的java讲义源码-middleware-practice:分布式中间件实战

    疯狂的java讲义 源码 分布式中间件实战 项目目录 ...module(提供其他中间件调用) model module(数据操作) server module(核心业务处理,路由处理) 其中api module中的pom.xml 导入依赖 <groupId>or

    开涛高可用高并发-亿级流量核心技术

    20.3.8 Nginx+Lua逻辑开发 401 21 使用OpenResty开发商品详情页 405 21.1 技术选型 407 21.2 核心流程 408 21.3 项目搭建 408 21.4 数据存储实现 410 21.4.1 商品基本信息SSDB集群配置 410 21.4.2 商品介绍SSDB集群...

    serleena-frontend

    必须可以通过Web服务器(例如Apache或Nginx)访问前端,这是系统能够正确执行REST调用所必需的系统要求。 使用伪造的后端 伪造的后端位于utils文件夹中。 要启动它: cd utils node fake-backend.js 它在端口3000上...

    python入门到高级全栈工程师培训 第3期 附课件代码

    11 在子类中调用父类方法 12 super调用父类的方法 13 选择系统作业讲解 第26章 01 学生自主复习 02 分享列表 03 多态 04 封装 05 面向对象概念总结 06 反射 07 反射及动态导入模块 08 类的内置attr属性 09 类内置...

    网络架构师148讲视频课程

    │ 具体调用.pdf │ 分发调度.pdf │ 整体介绍.pdf │ 模板管理.pdf │ 生成代理.pdf │ 生成输出.pdf │ 自定义外部主题.pdf │ 配置管理.pdf │ ├─x-gen-projects │ └─project │ ├─.metadata │ │ │ ....

    maven的优缺点 项目

    将tomcat做很多个备份(10个),为了nginx转发;前台:访问比较大,管理员访问量比较小; 问题: 每次升级,10个tomcat都升级一次 后台的升级频繁要比前台频繁;升级10次,9次改的是后台的代码,只有一次是前台的代码 ...

Global site tag (gtag.js) - Google Analytics