声明:请在文章页面明显位置给出原文连接 http://www.cnblogs.com/paulweihan/p/4654173.html,否则保留追究法律责任的权利。

近期查了非常多资料。入门的样例都是ngx_http_hello(or mytest)_module.

最主要是參考http://tengine.taobao.org/book/chapter_03.html#config 站点以及

《深入理解Nginx模块发开与架构解析》一书。但感觉讲的都不够清楚。书上讲的太复杂,側重结构体解析,以下贴出我的理解,欢迎大家谈论。联系方式:rwhsysu@163.com 。

(读本日志,希望你首先对于Nginx有个基本了解。其次,手头有一份Nginx源代码,一份gx_http_hello(or mytest)_module.c源代码)

本文不涉及hello模块文件夹下的config文件以及编译时加入的add-module指令,注重对于模块源代码的结构的理解,用于理清作者本人和您的思路。

对于上面站点上和书上强调的非常清楚的各个结构的定义,本文不做赘述。(太占篇幅-_-|||),參考资料里面讲的非常详细非常清楚,本文着重描写叙述自己的理解。如有对结构定义疑问。请读者自行參考上面提到的书以及站点

对于ngx_http_hello(or mytest)_module内定义的数据结构与函数的理解见下图:

上面图里包含了我对这个入门模块的结构的理解,解释例如以下:

实现一个handler的步骤:

  1. 编写模块基本结构。包含模块的定义,模块上下文结构,模块的配置结构等。
  2. 假设有loc_conf,须要定义自己loc_conf结构,以及conf结构创建。赋值函数。

  3. 实现handler的挂载函数。依据模块的需求选择正确的挂载方式。
  4. 编写handler处理函数。

    模块的功能主要通过这个函数来完毕。

这些结构域函数之间的包含关系见上面的图。

以下说说我个人对这些模块和函数的理解。

Num 1:模块定义结构

ngx_module_t ngx_http_hello_module;

对于开发一个模块来说。我们都须要定义一个ngx_module_t类型的变量来说明这个模块本身的信息。从某种意义上来说。这是这个模块最重要的一个信息,它告诉了nginx这个模块的一些信息,上面定义的配置信息。还有模块上下文信息。都是通过这个结构来告诉nginx系统的,也就是载入模块的上层代码,都须要通过定义的这个结构。来获取这些信息。

这个模块中最主要要定义的就是CTX上下文结构与commands配置结构数组。

Num 2:上下文结构

ngx_http_module_t ngx_http_hello_module_ctx;

这是一个ngx_http_module_t类型的静态变量。

这个变量实际上是提供一组回调函数指针,这些函数有在创建存储配置信息的对象的函数,也有在创建前和创建后会调用的函数。这些函数都将被nginx在合适的时间进行调用。

这个样例中,该结构最重要的是

  • 调用了一个handler挂载函数ngx_http_hello_init
  • 调用了一个loc_conf创建函数ngx_http_hello_create_loc_conf

Num 3:模块的配置结构

ngx_command_t ngx_http_hello_commands[];

在我的理解里,这个数组实现的功能是将我们在nginx.conf文件里定义的配置读取并存储进loc_conf结构中。conf结构已经在上下文结构中被创建。

Num 4:loc_conf与其创建赋值函数

本样例中,定义了一个结构体:

typedef struct
{
ngx_str_t hello_string;
ngx_int_t hello_counter;
}ngx_http_hello_loc_conf_t;

该结构体储存了本模块的配置变量。通过上下文结构中的调用的ngx_http_hello_create_loc_conf函数创建。通过配置结构中的ngx_http_hello_string以及ngx_http_hello_counter函数赋值。

(详细实现代码不贴了,请读者自行查询hello模块源代码)

Num 5:handler 挂载函数

ngx_int_t ngx_http_hello_init

该函数在上下文结构中被调用,决定了handler函数详细在11个PHASE中的哪个PHASE被调用。关于PHASE定义以及函数详细实现參看站点以及hello模块源代码。

Num 6:handler函数

static ngx_int_t
ngx_http_hello_handler(ngx_http_request_t *r)
{
}

关于这个函数,没什么好说的,他实现了对于整个request的处理,依据loc_conf的不同,处理方式也不同。

待续:上面仅仅介绍了hello模块涉及的数据结构以及函数的关系以及其相关功能,理清了hello模块是怎样工作的:详细体如今,在哪些结构中调用了哪些函数。

对于基本的两个数据结构ngx_conf_t ngx_http_request_t是怎样传递和实现的并未解释。同一时候,并未联系上nginx的main函数进行总体的分析。

希望对你有帮助,欢迎讨论。

Nginx_handler模块发开(hello模块结构解析)的更多相关文章

  1. Stitching模块中对特征提取的封装解析(以ORB特性为例)

    titching模块中对特征提取的封装解析(以ORB特性为例)     OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程.在这个过程 ...

  2. abp vnext2.0之核心组件模块加载系统源码解析与简单应用

    abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...

  3. 谈谈.net模块依赖关系及程序结构

    技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...

  4. Python【yagmail】模块发邮件

    #步骤一:import yagmail #步骤二:实例化一个发邮件的对象username = '553637138@qq.com' #邮箱账号pwd='sa2008' #授权码mail = yagma ...

  5. 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...

  6. VMWare虚拟机提示:锁定文件失败,打不开磁盘...模块"Disk"启动失败的解决办法

    我出现该问题的原因: 昨天电脑一下子卡死,于是我就重启了电脑,重启之后我没有打开VMware虚拟机,结果第二天一上班打开VMware就发现出现了“锁定文件失败,打不开磁盘......模块"D ...

  7. VMWare虚拟机提示:另一个程序已锁定文件的一部分,打不开磁盘...模块"Disk"启动失败的解决办法

    重启了电脑之后,打开VMware就发现出现了“锁定文件失败,打不开磁盘......模块"Disk"启动失败.”这些文字 为什么会出现这种问题: 这是因为虚拟机在运行的时候,会锁定文 ...

  8. Day5 模块及Python常用模块

    模块概述 定义:模块,用一砣代码实现了某类功能的代码集合. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,提供了代码的重用性.在Python中,一个.py文件就称之为一个模块(Mod ...

  9. Day6 模块及Python常用模块

    模块概述 定义:模块,用一砣代码实现了某类功能的代码集合. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,提供了代码的重用性.在Python中,一个.py文件就称之为一个模块(Mod ...

随机推荐

  1. [转]Linux文件和目录操作命令

    转自:http://www.linuxdiyf.com/bbs/thread-416176-1-1.html 一.文件操作命令1.1 查看文件 Linux下查看文件的命令有很多,下面列出的几个是几乎所 ...

  2. IDEA14 Ultimate Edition注册码

    分享几个license: (1) key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangweivalue:97493-G3A4 ...

  3. Ubuntu 16.04 Mxnet CPU 版本安装

    在安装前配置好更新源,基本要求就是速度越快越好: 1.安装Python   apt-get install python 2.安装Git    apt-get install git 3.安装依赖包  ...

  4. 简易nagios安装出现的问题及解决方法

    安装时候所遇到的问题: A 安装PHP的时候报错xml2-config未找到 安装PHP的时候报错:未找到包libxml2 解决方法:安装libxml2包即可,libxml2是php的依赖包,从而需要 ...

  5. mapreduce编程模型你知道多少?

    上次新霸哥给大家介绍了一些hadoop的相关知识,发现大家对hadoop有了一定的了解,但是还有很多的朋友对mapreduce很模糊,下面新霸哥将带你共同学习mapreduce编程模型. mapred ...

  6. sql统计重复数据

    sql代码如下: 统计重复的数据 select MingCheng from tabShouFeiGongShi group by MingCheng having count(MingCheng) ...

  7. dom 左右两侧得广告(兼容IE FF)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 串口 COM口 USB-TTL RS-232 RS-485 不同标准 区别 释疑

    http://blog.sina.com.cn/s/blog_6566538d0100r7p8.html Point (所有要点都在这,请仔细阅读): 1.串口.COM口是指的物理接口形式(硬件).而 ...

  9. Java反射机制(取得类的结构)

    通过反射得到一个类中的完整的结构,就要使用java.lang.reflect包中的以下几个类:   Constructor:表示类中的构造方法 Field:表示类中的属性 Method:表示类中的方法 ...

  10. Samsung Galaxy S II GT-I9100 指令全集 部分指令请慎用

    英文版 谷歌翻译 Obtain/Change Device Information *#06# (Display IMEI number) *#1234# (Display current firmw ...