`
doyoueat
  • 浏览: 14641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx 模块组成

阅读更多
编写模块,需要实现下面5个部分
  • 定义 ngx_module_t 模块结构体
  • 定义commands
  • 定义cxn
  • 实现commands里对应的实现函数
  • 实现handler函数 (command实现函数依赖handler函数)  (这个才是真正干活的)


说明各个函数部分的意义

  • commands
  • eg:
    static ngx_command_t  ngx_echo_commands[] = {
    {
            ngx_string("echo"),  //指令名称
            NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, //指令适合出现位置 和 参数个数设置
            ngx_echo_readconf,            //指令的回调函数.这个函数通常来替换核心模块的配置,指定自己的handler
            NGX_HTTP_LOC_CONF_OFFSET,    //将数据保存在loc conf部分
            offsetof(ngx_echo_loc_conf_t, ecdata), //接收的参数保存在结构体位置
            NULL  //一般为空
    },
    ngx_null_command  //command结束标识
    };
    

    nginx提供了几个默认的转换函数:
    ngx_conf_set_flag_slot:把“on”和“off”转成1和0
    ngx_conf_set_str_slot:把字符串格式化为以ngx_str_t类型
    ngx_conf_set_num_slot:解析数字并转换为一个整型
    ngx_conf_set_size_slot:解析表示大小的值(“8k”,“1m”等)并格式化成size_t格式

  • commands实现函数 (command的回调函数)
    • 这个函数一般是将配置文件中相关指令的参数转化成需要的格式并存入配置结构体
    • 这个函数还将修改了核心模块配置(也就是这个location的配置),将其handler替换为我们编写的handler。
    • 这样就屏蔽了此location的默认handler,使用ngx_http_echo_handler产生HTTP响应。

    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;                                                 
    }/*}}}*/                                                                
    

  • context
  • 这个机构主要是定义各个hook函数
    static ngx_http_module_t  ngx_echo_module_ctx = {
        NULL,           /* preconfiguration 读入配置前调用*/      ??? 全局配置读取前?
        NULL,           /* postconfiguration 读入配置后调用*/     ??? 全局配置读取后?
        NULL,          /* create main configuration 创建全局部分配置时调用*/
        NULL,          /* init main configuration 初始化全局部分配置时调用*/
        NULL,          /* create server configuration 创建虚拟主机部分时调用*/
        NULL,          /* merge server configuration 与全局部分配置合并时调用*/
        ngx_echo_create_loc_conf,  /* create location configuration  创建位置部分的配置时调用*/
        ngx_echo_merge_loc_conf   /* merge location configuration    与主机部分配置合并时调用*/
    };
    


    create_loc_conf用于初始化一个配置结构体,如为配置结构体分配内存等工作;
    merge_loc_conf用于将其父block的配置信息合并到此结构体中,也就是实现配置的继承。

  • handler
  • 该函数的职责:
    • 读入模块配置
    • 处理功能业务
    • 产生HTTP header
    • 产生HTTP body

    handler会接收一个ngx_http_request_t指针类型的参数,这个参数指向一个ngx_http_request_t结构体,此结构体存储了这次HTTP请求的一些信息
    static ngx_int_t ngx_echo_handler(ngx_http_request_t *r)                                         
    {                                                                                                
        ngx_int_t     rc;                                                                            
        ngx_buf_t    *b;                                                                             
        ngx_chain_t   out;                                                                           
        ngx_echo_loc_conf_t  *cglcf;                                                                 
        cglcf = ngx_http_get_module_loc_conf(r, ngx_module_echo);                                    
        if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {                                           
            return NGX_HTTP_NOT_ALLOWED;                                                             
        }                                                                                            
        if (r->headers_in.if_modified_since) {                                                       
            return NGX_HTTP_NOT_MODIFIED;                                                            
        }                                                                                            
        r->headers_out.content_type.len = sizeof("text/html") - 1;                                   
        r->headers_out.content_type.data = (u_char *) "text/html";                                   
        r->headers_out.status = NGX_HTTP_OK;                                                         
        r->headers_out.content_length_n = cglcf->ecdata.len;                                         
        if (r->method == NGX_HTTP_HEAD) {                                                            
            rc = ngx_http_send_header(r);                                                            
            if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {                                  
                return rc;                                                                           
            }                                                                                        
        } 
        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));                                                 
        if (b == NULL) {                                                                             
            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");
            return NGX_HTTP_INTERNAL_SERVER_ERROR;                                                   
        } 
         out.buf = b;  
        out.next = NULL;                                                                             
        b->pos = cglcf->ecdata.data;                                                                 
        b->last = cglcf->ecdata.data+(cglcf->ecdata.len);                                            
        b->memory = 1;                                                                               
        b->last_buf = 1;                                                                             
        rc = ngx_http_send_header(r);                                                                
        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {                                      
            return rc;                                                                               
        }                                                                                            
        return ngx_http_output_filter(r, &out);                                                      
    }                                                                                                
    

  •   ngx-module_t
  • 组合Nginx Module
    ngx_module_t  ngx_http_circle_gif_module = {                
        NGX_MODULE_V1,                                          
        &ngx_http_circle_gif_module_ctx, /* module context */   
        ngx_http_circle_gif_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                                   
    };                                                          
    

    分享到:
    评论

    相关推荐

      nginx模块开发指南

      这个指南覆盖了nginx模块开发的方方面面,包括预备知识、模块任务委派、模块组成以及如何处理HTTP请求等关键环节。开发者通过学习这些内容,可以有效地提升nginx模块开发的能力,并将其应用到具体的Web服务器优化和...

      补充:Nginx之模块处理流程

      Nginx是一个高性能的Web服务器和反向代理服务器,其内部设计采用了模块化的架构,这使得Nginx具有高度灵活性和可扩展性。模块化设计是Nginx的核心特点,它将复杂的系统分解为几个独立的功能组件,每个组件专注于一个...

      深入理解Nginx 模块开发与架构解析-完美排版

      《深入理解Nginx模块开发与架构解析》是一本针对Nginx技术的深度解析书籍,专注于探讨Nginx的内部机制、模块开发以及整体架构。Nginx是一款高性能的Web服务器,因其反向代理、负载均衡和静态文件处理能力而广受欢迎...

      Emiller的Nginx模块开发心得(doc)

      3. **Nginx模块的组成** - **配置结构体**:每个模块都有自己的配置结构体,用于存储配置指令的值。 - **指令**:模块通过指令接收配置信息,这些指令可以在配置文件中被用户定义。 - **上下文**:模块可以存在于...

      Emiller的Nginx模块开发文档(chn)

      3. Nginx模块的组成: - **配置结构体**:模块通常有自己的配置结构体,用于存储配置指令的值。 - **指令**:模块提供配置指令,允许用户在配置文件中设定模块的行为。 - **上下文**:包括创建和合并配置结构体的...

      nginx模块开发指南中文版

      Nginx模块的组成 - **模块的配置结构体**:模块配置是通过结构体实现的,这些结构体在编译时被初始化,并在运行时供模块使用。每个模块都有自己的配置结构体,用于存储模块特定的配置参数。 - **模块的指令**:...

      Nginx模块开发心得

      本文档基于Emiller的《Nginx模块开发指南》进行了翻译和解读,旨在详细介绍Nginx模块的开发方法,包括模块的基本组成、开发流程以及高级主题等。 #### 二、Nginx模块的基础知识 **2.1 模块的配置结构体** Nginx...

      深入理解Nginx模块开发与架构解析 中文版

      ### 深入理解Nginx模块开发与架构解析 #### Nginx简介 Nginx是一款高性能的HTTP和反向代理服务器,以其稳定性、丰富的功能集、简单的配置方式和低资源消耗而闻名。它最初由Igor Sysoev编写,自2004年发布以来,...

      Emiller的Nginx模块开发指南

      Nginx模块通常由以下几个部分组成: 2.1. **模块的配置结构体** - 每个模块都必须定义一个配置结构体,用于存储该模块的配置信息。 - 这些配置信息通常是在配置文件中定义的,并在启动时通过解析配置文件填充到...

      深入理解Nginx模块开发与架构解析

      《深入理解Nginx模块开发与架构解析》这本书聚焦于Nginx的内核机制、模块开发以及整体架构,旨在帮助读者深入掌握Nginx的工作原理和扩展能力。Nginx是一款高性能的Web服务器和反向代理服务器,因其高效的并发处理...

      nginx模块开发指南(中文)

      Nginx模块的组成 #### 2.1 模块的配置结构体 每个模块都需要定义一个配置结构体,用以存储模块的配置信息。这些配置信息通常来源于Nginx的配置文件,并在启动时被解析到相应的结构体中。 **示例**:对于一个简单...

      Nginx模块源码 mod_strip

      Nginx的工作模式主要由一系列模块组成,包括核心模块、基础模块和第三方模块。`mod_strip`就属于第三方模块,它扩展了Nginx的功能,允许我们在HTTP响应中进行自定义的文本处理。 源码分析通常涉及以下几个步骤: 1...

      深入理解Nginx模块开发与架构解析第2版LinuxUnix技术丛书.pdf

      《深入理解Nginx模块开发与架构解析》第二版是一本专为Linux和Unix系统设计的技术丛书中关于Nginx的深度指南。这本书全面涵盖了Nginx的核心概念、内部架构以及模块开发,对于想要深入了解Nginx工作原理、优化性能或...

      nginx源码学习资料

      《Nginx模块开发指南》会详细讲解如何编写Nginx模块,包括模块的基本结构、如何处理请求、如何与内核交互等。通过学习,你可以了解到如何创建自定义日志模块、URL重写模块,甚至是自定义负载均衡策略。 **6. 深入...

      添加了http_image_filter_module模块的Nginx

      在Nginx中,模块是其核心功能的组成部分,它们提供了丰富的扩展功能。本文将详细介绍`http_image_filter_module`模块及其在Nginx 1.15.9(Windows 64位)中的应用。 `http_image_filter_module`模块是Nginx内置的一...

      带完整详细目录:Nginx高性能Web服务器详解+深入理解Nginx:模块开发与架构解析(第2版)陶辉著

      - 模块结构:了解Nginx模块的组成和工作流程,包括handler、filter、log等模块类型。 - 编程接口:学习如何使用C语言编写Nginx模块,实现自定义功能。 8. **Nginx与其它服务集成** - 与PHP/FastCGI的配合:配置...

      nginx电子书

      《深入理解Nginx模块开发与架构解析》是针对Nginx Web服务器的一本专业书籍,旨在帮助读者深入了解Nginx的工作原理、架构设计以及如何进行模块开发。这本书的两个PDF版本,即“深入理解Nginx模块开发与架构解析第2版...

    Global site tag (gtag.js) - Google Analytics