首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

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

2013-10-22 
nginx模块开发入门(一) 快速编写一个模块1.首先按照nginx参考http://running.iteye.com/blog/3268732.创建

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_echoHTTP_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_tngx_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-debugmakemake 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 -tcalled:ngx_echo_create_loc_confcalled:ngx_echo_create_loc_confcalled:ngx_echo_create_loc_confcalled:ngx_echo_readconfcalled:ngx_echo_merge_loc_confcalled:ngx_echo_merge_loc_confnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: 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就到这里了;

热点排行