ngin Finding Everything About Nginx Here

开发NGINX入门级hello world模块

发表于 2015-06-25 阅读数 3107

本文将以最简单的方式教你如何创建nginx模块,我们以hello world为例,实现访问 http://192.168.1.20/hello时,页面上将出现 hello world 


0、命名规范:

以hello world为例,我们将创建一个名为 hello 的模块

  目录名称为: nginx-http-hello-module

  文件名称为:ngx_http_hello_module.c

  模块名称:    ngx_http_hello_module

1、创建一个目录:

> mkdir /tmp/nginx-http-hello-module
> cd /tmp/nginx-http-hello-module

2、添加模块文件:
> vi ngx_http_hello_module.c 

/*

 * Copyright (C) nglua.com

 */


#include <ngx_config.h>

#include <ngx_core.h>

#include <ngx_http.h>


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



static ngx_command_t ngx_http_hello_commands[] = {

    { ngx_string("hello"),

      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,

      ngx_http_hello,

      0,

      0,

      NULL },


    ngx_null_command

};



static ngx_http_module_t ngx_http_hello_module_ctx = {

    NULL,                              /* preconfiguration */

    NULL,                              /* postconfiguration */


    NULL,                              /* create main configuration */

    NULL,                              /* init main configuration */


    NULL,                              /* create server configuration */

    NULL,                              /* merge server configuration */


    NULL,                              /* create location configuration */

    NULL                               /* merge location configuration */

};



ngx_module_t ngx_http_hello_module = {

    NGX_MODULE_V1,

    &ngx_http_hello_module_ctx,        /* module context */

    ngx_http_hello_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 u_char ngx_hello_string[] = "hello world";



static ngx_int_t

ngx_http_hello_handler(ngx_http_request_t *r)

{

    ngx_int_t    rc;

    ngx_buf_t   *b;

    ngx_chain_t  out;


    r->headers_out.content_type_len = sizeof("text/html") - 1;

    r->headers_out.content_type.len = sizeof("text/html") - 1;

    r->headers_out.content_type.data = (u_char *) "text/html";


    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

    if (b == NULL) {

            return NGX_HTTP_INTERNAL_SERVER_ERROR;

    }


    out.buf = b;

    out.next = NULL;


    b->pos = ngx_hello_string;

    b->last = ngx_hello_string + sizeof(ngx_hello_string) - 1;

    b->memory = 1;

    b->last_buf = 1;


    r->headers_out.status = NGX_HTTP_OK;

    r->headers_out.content_length_n = sizeof(ngx_hello_string) - 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_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

    ngx_http_core_loc_conf_t *clcf;


    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

    clcf->handler = ngx_http_hello_handler;


    return NGX_CONF_OK;

}

3、添加模块配置文件

> vi config

ngx_addon_name=ngx_http_hello_module 

HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module" 

NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"


4、将模块编进nginx源码(不限版本)

> cd /xxx/nginx-1.8.0

> ./configure --add-module=/tmp/nginx-http-hello-module

输出包含如下信息,表示成功 

configuring additional modules 

adding module in /tmp/nginx-http-hello-module

 +  was configured 


5、编辑nginx配置文件

> vi /usr/local/nginx/conf/nginx.conf

worker_processes 4; 

daemon  off; 

events { 

    worker_connections 1024; 



http { 

     server { 

            其它忽略,增下以下粗体内容

            location /hello { 

                    hello;             

            } 

     } 


6、启动nginx

> /usr/local/nginx/sbin/nginx


7、客户端访问

访问 http://192.168.1.20/hello 

页面出现 hello world 


8、祝贺顺利完成您的第一个nginx模块

模块下载:nginx-http-hello-module.tar.gz

推荐阅读:nginx源码分析之模块化