`
奔跑的羚羊
  • 浏览: 576837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nginx模块开发入门(一) 快速编写一个模块

 
阅读更多
1.首先按照nginx
参考http://running.iteye.com/blog/326873

2.创建新模块目录
#mkdir ngx_module_echo


3.创建编译相关文件(config)
#vim ngx_module_echo/config


其内容为:
ngx_addon_name=ngx_module_echo
HTTP_MODULES="$HTTP_MODULES ngx_module_echo"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_module_echo.c"
CORE_LIBS="$CORE_LIBS "
#CORE_LIBS="$CORE_LIBS -lm"


ngx_addon_name一般设置为模块名称
HTTP_MODULES保持所有的HTTP模块名称,以空格符相连。用法有点类似于linux中得path,先给出之前的$HTTP_MODULES,然后在加上新增的MODULES
NGX_ADDON_SRCS指定新增模块的源代码,注意:如果使用了$ngx_addon_dir,它等价于在configure执行时--add-module=PATH中的PATH参数

4.创建源文件ngx_module_echo.c
#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;

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_module_t  ngx_module_echo = {
    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_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);
}
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;
    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;
}



5.编译nginx
./configure --prefix=/usr/local/nginx --with-pcre=/root/pcre-8.33/ --with-http_stub_status_module  --with-http_realip_module  --add-module=/root/ngx_module_echo/ --with-debug
make
make install


6.修改nginx.conf
worker_processes  1;
daemon off;
master_process  off;
error_log  /tmp/error.log debug;
pid /tmp/nginx_demo.pid;
events {
    worker_connections  1024;
}
http {
    include         mime.types;
    sendfile        on;
    keepalive_timeout  65;
    tcp_nodelay        on;
    server {
        listen   8100;
        server_name  localhost;

        access_log  /tmp/access.log;
        error_log  /tmp/error.log debug;

        location /hello {
            echo "Hi,this is a demo module";
        }
    }
}



7.测试
#/usr/local/nginx/sbin/nginx -t
called:ngx_echo_create_loc_conf
called:ngx_echo_create_loc_conf
called:ngx_echo_create_loc_conf
called:ngx_echo_readconf
called:ngx_echo_merge_loc_conf
called:ngx_echo_merge_loc_conf
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful


8.运行
测试没有问题以后,我们就可以开始运行了
#/usr/local/nginx/sbin/nginx

然后通过浏览器进行访问
http://localhost:8100/hello
显示
Hi,this is a demo module
好了,大功告成,nginx模块版的hello world就到这里了;
分享到:
评论

相关推荐

    Nginx开发从入门到精通pdf高清带目录

    《Nginx开发从入门到精通》是一本深入解析Nginx技术的书籍,适合对Web服务器技术感兴趣的初学者和进阶者。Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于互联网领域的网站部署和负载均衡。本书旨在帮助读者...

    Nginx开发从入门到精通

    《Nginx开发从入门到精通》不仅是一本关于Nginx模块开发的手册,还深入探讨了Nginx的工作原理和技术细节。对于希望深入了解Nginx内部机制的开发者来说,这本书是非常有价值的资源。无论是对于初学者还是有一定经验的...

    Nginx开发从入门到精通.pdf

    自发布以来,由于其出色的性能、稳定性、丰富的模块支持和灵活性,成为了全球范围内开发者和...通过对模块开发和原理的剖析,读者可以掌握如何构建自己的Nginx模块,以及如何通过调整配置来提升Nginx的性能和稳定性。

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

    《深入理解Nginx模块开发与架构解析》这本书是针对Nginx web服务器进行深入学习和技术探索的专业指南。Nginx作为一个高性能、反向代理、负载均衡的HTTP和反向代理服务器,因其高效的性能和灵活的配置,在互联网行业...

    nginx开发从入门到精通

    从给定文件中可以看出,这是一本关于nginx开发的书籍,内容涵盖了nginx模块开发、原理解析以及架构详解等多个方面。下面将详细介绍这些知识点。 首先,nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3...

    nginx开发从入门到精通pdf版

    2. **C语言基础**:讲解如何使用C语言来编写Nginx模块,包括内存管理、字符串操作等基础技巧。 3. **模块开发实例**:提供实际的模块开发案例,如自定义日志模块、过滤器模块或HTTP模块,帮助读者理解模块开发的过程...

    cpp-Nginx开发从入门到精通

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

    Nginx开发从入门到精通.pdf.docx

    本书不仅涵盖了Nginx的基础知识,还深入探讨了其高级特性和模块开发技巧。 #### 二、Nginx概述 1. **历史沿革**: - Nginx最初由俄罗斯程序员Igor Sysoev在2002年开始开发。 - 由于其设计上的优势,尤其是在高...

    Nginx从入门到精通

    #### 二、Nginx模块开发篇 - **初探Nginx架构**:Nginx采用了一个异步事件驱动的架构模型,该模型使得Nginx能够高效地处理大量的并发连接。 - **Nginx基础概念**: - **Master-Worker模式**:一个主进程负责监听...

    Nginx开发_nginx_源码

    1. **模块开发**:Nginx模块开发涉及创建新的HTTP、TCP或UDP处理器,以及与Nginx内核的交互。这包括解析配置文件中的模块指令,处理网络请求,以及与其他模块通信。 2. **事件处理**:Nginx的事件处理模型是基于...

    nginx从入门到精通PDF

    《Nginx从入门到精通》是一套针对网络运维与开发者的重要参考资料,涵盖了Nginx的基础知识、配置技巧以及高级应用。Nginx以其高性能、稳定性以及强大的反向代理和负载均衡能力,广泛应用于各类互联网服务中。本...

    nginx学习电子书

    3. **Nginx模块开发:** 书中深入探讨了Nginx模块的开发过程,包括模块结构、API接口的使用、模块编译和测试等。通过学习,开发者可以扩展Nginx的功能,实现自定义的日志记录、动态内容生成等。 4. **Nginx+Lua...

    nginx+lua入门

    3. **Nginx Development Kit (NDK)**:NDK 是一个用于开发 Nginx 模块的工具集,对于集成 Lua 功能是必要的。 4. **Lua 相关模块**:lua-nginx-module 和 headers-more-nginx-module 是常用的 Nginx Lua 模块,前者...

    ecshop二次开发的简单快速入门教程

    "ecshop_dwt_lbi_详解"可能是ECSHOP的一个主题或模板的名称,DWT可能指的是Dreamweaver Template(Dreamweaver模板),LBI可能是Layout Block Item(布局区块项)的缩写。这个文件名暗示教程可能会讲解如何定制...

    Python-Flask入门教程使用Python和Flask开发你的第一个Web程序

    **Python-Flask入门教程:使用Python和Flask开发你的第一个Web程序** Flask是一个轻量级的Python Web开发框架,它以其简洁、灵活的特性深受开发者喜爱。本教程将引导你逐步学习如何使用Flask构建一个基本的Web应用...

    基于javascript处理nginx请求过程详解

    总体而言,本文是对如何在Nginx中通过JavaScript处理HTTP请求的一个入门级指南,重点介绍了Nginx和njs模块的安装流程、编写JavaScript脚本、以及如何在Nginx配置中使用NJS模块。这对于想要扩展Nginx功能的开发者来说...

Global site tag (gtag.js) - Google Analytics