关于Nginx Http模块开发的文章非常少,只有Emiler的那篇关于Http模块的文章,但是那篇文章里面,并没有说到事件型的模块如何进行开发。而且文章里面提到的内容实在是让人有点意犹未尽。因此,对于Http事件型模块的开发进行了一些总结,与大家分享。但是,无论如何,要进行Nginx模块开发,最好的方法还是找到相似性较大的模块的代码进行参考,多试多看。

 
通常,一个Http模块均是有以下的几个部分组成:
 
1.模块配置结构体:(configure structure)
     负责存储配置项的内容,每一条配置项,均会生成一个配置结构体,可以方便模块进行配置的预处理,存储相应的结构休内容,大致结构如下:
 
typedef struct {
/**
     * your configuration struct members
     */
} ngx_http_<your module>_conf_t;
 
2.模块指令( Module Directives ) 
 
static ngx_command_t ngx_<your module>_commands[] = {
      { ngx_string("test"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
<your read conf function>,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
...
ngx_null_command
};
结构体如下:
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;
};

3.模块上下文(The Module Context)
这个结构体主要定义了一系列的回调函数,在不同的时期进行回调
typedef struct {
     ngx_int_t   (*preconfiguration)(ngx_conf_t *cf);
ngx_int_t (*postconfiguration)(ngx_conf_t *cf); void *(*create_main_conf)(ngx_conf_t *cf);
char *(*init_main_conf)(ngx_conf_t *cf, void *conf); void *(*create_srv_conf)(ngx_conf_t *cf);
char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf); void *(*create_loc_conf)(ngx_conf_t *cf);
char *(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;

进行阶段handler的开发,则需要在postconfiguration的时期将handler插入相应的阶段。

 
4.定义模块结构体
 
ngx_module_t ngx_http_<module name>_module = {
      NGX_MODULE_V1, &ngx_http_<module name>_module_ctx, /* module context */
  ngx_http_<module name>_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 };
完成这一步之后,基本上一个模块的基础已经形成。
 
 
5.插入阶段回调函数
     为了在Http处理的阶段中加入相应的处理函数,需要在postconfigure的回调函数中进行相应的handler插入。
     以下是在http_access的模块中的代码:
static ngx_int_t
ngx_http_access_init(ngx_conf_t *cf)
{
    ngx_http_handler_pt        *h;
    ngx_http_core_main_conf_t  *cmcf;

cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);

h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }

*h = ngx_http_access_handler;

return NGX_OK;
}

 
而ngx_http_access_handler就是在NGX_HTTP_ACCESS_PHASE中插入的handler。
 
HTTP在处理的过程中,总共有如下若干个阶段:
 
typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,

NGX_HTTP_SERVER_REWRITE_PHASE,

NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,
    NGX_HTTP_POST_REWRITE_PHASE,

NGX_HTTP_PREACCESS_PHASE,

NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,

NGX_HTTP_TRY_FILES_PHASE,
    NGX_HTTP_CONTENT_PHASE,

NGX_HTTP_LOG_PHASE
} ngx_http_phases;

 
如果觉得phases不够用,可以在nginx的代码中进行加入自己的阶段。
 
这种处理方法,可以在Nginx作为proxy转发之前,加入自己的handler进行一些处理,相当的实用。
 
不同阶段的处理方法不同,具体的方法可以参考ngx_http_core_module.c中的相应checker函数。

Nginx Http模块开发的更多相关文章

  1. nginx http模块开发入门

    导语 本文对nginx http模块开发需要掌握的一些关键点进行了提炼,同时以开发一个简单的日志模块进行讲解,让nginx的初学者也能看完之后做到心里有谱.本文只是一个用作入门的概述. 目录 背景 主 ...

  2. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  3. 《深入理解Nginx:模块开发与架构解析》读书笔记

    1.nginx的特点:快.扩展性强.可靠性强.内存低消耗.支持高并发.热部署.开源免费 2.nginx由master进程来管理多个(CPU数)worker进程 3.配置按功能分,有4类: 1)用于调试 ...

  4. 《深入理解Nginx:模块开发与架构解析》(一)

    第1章 研究 Nginx 前的准备工作 1.1 Nginx 是什么 Web 服务器的基本功能:基于 REST 架构风格,以统一资源描述符(URI)或者统一资源定位符(URL),作为沟通依据,通过 HT ...

  5. 读书笔记之深入理解Nginx:模块开发与结构解析

    前言 我现在看书一般都是看自己能看懂的地方,看不懂就先略过,回头再看,下面就写自己看得懂的地方吧,并且把自己的理解也放到里面. 第一部分 Nginx能帮我们做什么 编译安装各个命令解释 configu ...

  6. nginx模块开发篇 (阿里著作)

    背景介绍 nginx历史 使用简介 nginx特点介绍 nginx平台初探(100%) 初探nginx架构(100%) nginx基础概念(100%) connection request 基本数据结 ...

  7. 【转】Nginx模块开发入门

    转自: http://kb.cnblogs.com/page/98352/ 结论:对Nginx模块开发入门做了一个helloworld的示例,简单易懂.也有一定的深度.值得一看. Nginx模块开发入 ...

  8. Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  9. [转] Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

随机推荐

  1. 【转】Redis安装整理(window平台和Linux平台)

    原文连接:http://zheng12tian.iteye.com/blog/1471726 原文作者:zheng12tian 转载注明以上信息! window平台Redis安装 redis wind ...

  2. TeXLive安装过程

    Linux系统下TeXLive2016安装教程:http://www.linuxidc.com/Linux/2016-08/133913.htm 安装完成后,在当前用户的 ~/.bashrc 中加入如 ...

  3. BZOJ 1101 Zap(莫比乌斯反演)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1101 给定a,b,d,求有多少gcd(x,y)==d(1<=x<=a&& ...

  4. WPF MultiBinding后台绑定动态属性 属性改变不调用Convert的问题

    一开始的写法: MultiBinding mb = new MultiBinding(); Binding b1 = new Binding(); b1.ElementName = "tex ...

  5. java实现文件编码监测

    java实现文件编码监测 最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的.尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题.于是作此笔记希望日后提醒自己以及帮助又需要的人. ...

  6. 转:SVN Eclipse插件Subclipse安装和配置

    一.安装Subclipse subclipse项目地址:http://subclipse.tigris.org/. 安装Subclipse的最好方法是使用Eclipse Update Manager. ...

  7. Path Sum 解答

    Question Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...

  8. hdu 3874 Necklace(bit树+事先对查询区间右端点排序)

    Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful v ...

  9. 使用Canvas实现动画效果 | DKlogs -- 设计 | 生活

    使用Canvas实现动画效果 | DKlogs -- 设计 | 生活 使用Canvas实现动画效果

  10. EasyUI DataGrid定制默认属性名称

    EasyUI DataGrid绑定服务器返回Json数据的解决方案 1. 服务器返回的数据对象格式,及初始化返回值 public class RequestResult { private int c ...