`
张立军
  • 浏览: 35410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Nginx模块开发 研究1

阅读更多

不同的模块流程不同这是一个直接从从配置中读取信息,并返回给客户端的例子。

 

 

#include <ngx_config.h>

#include <ngx_core.h>

#include <ngx_http.h>

 

static char* ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static void* ngx_echo_create_loc_conf(ngx_conf_t *cf);

static char* ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);

 

typedef struct {

    ngx_str_t ecdata;

    ngx_flag_t           enable;

} ngx_echo_loc_conf_t;

 

// 读取配置文件内容 echo -> ecdata

// 1、ngx_echo_readconf是程序第一步

static ngx_command_t  ngx_echo_commands[] = {

    { ngx_string("echo"),

      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,

      ngx_echo_readconf,

      NGX_HTTP_LOC_CONF_OFFSET,

      offsetof(ngx_echo_loc_conf_t, ecdata),

      NULL },

      ngx_null_command

};

 

 

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

};

 

// 定义模块 ngx_http_hi_module 就是模块的名字

ngx_module_t  ngx_http_hi_module = {

    NGX_MODULE_V1,

    &ngx_echo_module_ctx, /* module context */

    ngx_echo_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

};

 

// 主要的功能在这里

static ngx_int_t

ngx_echo_handler(ngx_http_request_t *r)

{

    printf("called:ngx_echo_handler\n");

    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_http_hi_module); // 这个和上面是对应的。

 

    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); // 交给过滤器

}

static char *

ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

    printf("called:ngx_echo_readconf\n");

    ngx_http_core_loc_conf_t  *clcf;

 

    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

    clcf->handler = ngx_echo_handler; // 2、ngx_echo_handler是程序第二步

    ngx_conf_set_str_slot(cf,cmd,conf);

    return NGX_CONF_OK;

}

 

 

static void *

ngx_echo_create_loc_conf(ngx_conf_t *cf)

{

    printf("called:ngx_echo_create_loc_conf\n");

    ngx_echo_loc_conf_t  *conf;

 

    conf = ngx_pcalloc(cf->pool, sizeof(ngx_echo_loc_conf_t));

    if (conf == NULL) {

        return NGX_CONF_ERROR;

    }

 

    conf->ecdata.len=0;

    conf->ecdata.data=NULL;

    conf->enable = NGX_CONF_UNSET;

    return conf;

}

static char *

ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)

{

    printf("called:ngx_echo_merge_loc_conf\n");

    ngx_echo_loc_conf_t *prev = parent;

    ngx_echo_loc_conf_t *conf = child;

 

    ngx_conf_merge_str_value(conf->ecdata, prev->ecdata, 10);

    ngx_conf_merge_value(conf->enable, prev->enable, 0);

/**

    if(conf->enable)

        ngx_echo_init(conf);

        */

    return NGX_CONF_OK;

    return NGX_CONF_OK;

}


0
0
分享到:
评论

相关推荐

    Nginx模块开发与架构解析

    通过阅读《Nginx模块开发与架构解析》这本书,无论是对Nginx有初步了解还是希望深入研究的开发者,都能从中受益匪浅,掌握Nginx的高级特性,提升自己在Web服务器领域的能力。如果你对Nginx的模块开发、架构设计、...

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

    总之,《深入理解Nginx模块开发与架构解析》第二版是一本全面、深入的技术书籍,对于那些希望优化Web服务性能、从事Nginx二次开发或者对服务器架构有深入研究的Java开发者来说,是一份宝贵的参考资料。通过阅读此书...

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

    《深入理解Nginx模块开发与架构解析第2版》是一本专为IT专业人士准备的深度学习教程,尤其适合那些想要深入研究Nginx服务器及其模块开发的工程师。这本书全面覆盖了Nginx的核心概念、架构设计以及模块开发技术,旨在...

    nginx模块开发指南(中文)

    ### Nginx模块开发指南(中文) #### 非常不错的Nginx源码分析文档 欢迎参考:[http://blog.csdn.net/yankai0219/article/details/8005721](http://blog.csdn.net/yankai0219/article/details/8005721),此文档...

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

    总的来说,《深入理解Nginx模块开发与架构解析》第二版是一本全面、实用的Nginx指南,不仅适合初学者了解Nginx的基础知识,也适合经验丰富的开发者深入研究和优化Nginx的性能。通过这本书的学习,读者可以掌握Nginx...

    深入理解Nginx模块开发与架构解析(第二版)

    《深入理解Nginx模块开发与架构解析(第二版)》是一本专为对Nginx有深入研究和技术追求的IT专业人士编写的书籍。Nginx作为一款轻量级、高性能的Web服务器,广泛应用于互联网服务,其核心在于其独特的事件驱动、异步...

    《深入理解Nginx:模块开发与架构解析》陶辉PDF

    这本书全面地介绍了Nginx的核心原理、模块开发以及系统架构,对于想要深入研究Nginx技术的IT从业者来说,是一本不可多得的参考资料。 Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,因其高效的性能和丰富...

    Go-一个用于设置Consul服务后端的nginx模块

    6. **Nginx模块开发**:理解Nginx的模块化体系结构是关键。这个模块可能实现了Nginx的HTTP上下文处理函数,以处理与Consul的交互。 7. **构建和部署**:在实际应用中,需要了解如何编译这个模块,将其整合到Nginx...

    nginx源码学习资料

    本资料包包含了《Nginx模块开发指南》和《深入理解Nginx》等资源,旨在帮助初学者逐步探索Nginx的设计思想和内部机制。 **1. Nginx的设计理念** Nginx采用事件驱动的异步非阻塞模型,这种模型使得它在处理大量并发...

    Nginx模块源码 mod_strip

    为了更好地理解和使用`mod_strip`,我们需要熟悉C语言(Nginx的开发语言)和Nginx模块开发接口,同时了解HTML解析的基本原理。通过阅读源码,我们可以了解到如何编写Nginx模块,以及如何在HTTP响应中进行内容操作,...

    cpp-Nginx开发从入门到精通

    本书旨在满足广大开发者和运维人员对Nginx模块开发及内部工作原理的学习需求。 Nginx是一款高性能的反向代理服务器,其事件驱动的非阻塞I/O模型使得它在处理高并发请求时表现出色。在深入讲解Nginx开发之前,我们...

    Ruby-ngxruby是嵌入ruby脚本的Nginx模块

    1. **安装与配置**:首先,你需要在已安装的Nginx环境中编译并安装ngx_ruby模块。这通常需要下载ngx_ruby源码,将其与Nginx源码一起编译,并在Nginx配置文件中启用该模块。 2. **Ruby环境**:确保系统中已经安装了...

    Nginx服务器中的模块编写及相关内核源码初探

    对于想要深入学习Nginx模块开发的开发者来说,掌握以下几个知识点是非常重要的: - Nginx模块架构和模块编程接口(MAI) - Nginx配置解析机制,包括如何定义新的配置指令 - Nginx事件驱动架构和网络IO模型 - 如何在...

    cpp-nginxmongodbrest一个mongodbREST客户端写成一个Nginx模块

    2. **Nginx模块开发**:理解Nginx的工作原理和模块结构,包括如何处理HTTP请求、响应,以及如何注册模块到Nginx的事件模型中。 3. **MongoDB C++驱动程序**:开发者需要使用MongoDB提供的C++驱动程序来与数据库通信...

    nginx 源码 解析 资料大全

    Emiller的Nginx模块开发指南.docx Nginx(en).pdf nginx@taobao.pdf nginx_internals.pdf nginx核心讲解(0.2).doc nginx核心讲解(0.4).doc Nginx模块开发指南中文版.txt nginx与lighttpd+实现分析比较.pdf Nginx源...

Global site tag (gtag.js) - Google Analytics