开发一个Nginx模块hello

Posted 工程师WWW

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发一个Nginx模块hello相关的知识,希望对你有一定的参考价值。

开发一个nginx模块

 

用C语言写一个ngx_http_hello_module.c的文件

 

C代码 

 

  1. /* 
     * ngx_http_hello_module.c 
     * 
     *  Created on: Apr 25, 2015 
     *      Author: lizhenbin 
     */  
    #include <ngx_config.h>  
    #include <ngx_core.h>  
    #include <ngx_http.h>  
      
    // 当nginx的配置选项中,出现hello,会调用该方法  
    static char *ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);  
      
    // 定义hello模块的处理函数  
    static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r);  
      
    // 定义一个ngx_command_t数组,并设置在出现hello配置后的  
    // 解析方法ngx_http_hello来作为入口  
    static ngx_command_t ngx_http_hello_commands[] =   
              
                    ngx_string("hello"),  
                    NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,  
                    ngx_http_hello,  
                    NGX_HTTP_LOC_CONF_OFFSET,  
                    0,  
                    NULL  
            ,  
            ngx_null_command  
    ;  
      
    // 不设置在HTTP初始化完成的,则不需要设置回调函数  
    static ngx_http_module_t ngx_http_hello_module_ctx =   
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL  
    ;  
      
    // 定义http的hello模块  
    ngx_module_t ngx_http_hello_module =   
            NGX_MODULE_V1,  
            &ngx_http_hello_module_ctx,  
            ngx_http_hello_commands,  
            NGX_HTTP_MODULE,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NGX_MODULE_V1_PADDING  
    ;  
      
    static char *ngx_http_hello(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)   
        ngx_http_core_loc_conf_t *clcf;  
      
        // 先找到hello配置项所属的配置项  
        clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);  
      
        // HTTP请求到NGX_HTTP_CONTENT_PHASE阶段时,如果遇到hell配置项所在的配置模块相匹配  
        // 则调用ngx_http_hello_handler函数  
        clcf->handler = ngx_http_hello_handler;  
      
        return NGX_CONF_OK;  
    ;  
      
    static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r)   
      
        // 必须是GET或者HEAD方法,否则返回504  
        if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)))   
            return NGX_HTTP_NOT_ALLOWED;  
          
      
        // 丢弃请求中的包体  
        ngx_int_t rc = ngx_http_discard_request_body(r);  
        if (rc != NGX_OK)   
            return rc;  
          
      
        // 设置返回值  
        ngx_str_t type = ngx_string("text/plain");  
        ngx_str_t response = ngx_string("hello world, this is my first http module.");  
        r->headers_out.status = NGX_HTTP_OK;  
        r->headers_out.content_length_n = response.len;  
        r->headers_out.content_type = type;  
      
        // 发送HTTP头部  
        rc = ngx_http_send_header(r);  
        // 发送出现错误,处理  
        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only)   
            return rc;  
          
      
        // 构建ngx_buf_t结构体,准备发送包体  
        ngx_buf_t *b;  
        b = ngx_create_temp_buf(r->pool, response.len);  
        if (b == NULL)   
            // 500错误  
            return NGX_HTTP_INTERNAL_SERVER_ERROR;  
          
      
        // 将内容复制到ngx_buf_t中  
        ngx_memcpy(b->pos, response.data, response.len);  
      
        // 设置last指针  
        b->last = b->pos + response.len;  
        // 声明是最后一块缓冲区  
        b->last_buf = 1;  
      
        // 构造发送时的ngx_chain_t结构体  
        ngx_chain_t out;  
        out.buf = b;  
        out.next = NULL;  
      
        return ngx_http_output_filter(r, &out);  
    ;  
      

然后,建立一个config文件,文件和上述的.c文件在同一个目录下面

 

 

C代码 

 

  1. ngx_addon_name=ngx_http_hello_module  
  2. HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"  
  3. NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"  

最后,运行三个在linux切换到root下,执行三个命令

C代码 

 

  1. ./configure --prefix=/usr/nginx/ --add-module=/home/lizhenbin/workspace/nginx-1.7.12/src/module  
  2. make  
  3. make install  

  

最后到/usr/nginx/conf下配置一个location

C代码 

 

  1. /usr/nginx/conf  
  2.   
  3. vim nginx.conf  
  4.   
  5. location /hello   
  6.               hello;  
  7.            
  8.   
  9. /usr/nginx/sbin  
  10. ./nginx  

 

记得把linux的iptables关掉,nginx默认使用80端口

最后输入,IP地址访问即可

C代码 

 

  1. http://127.0.0.1/hello  

以上是关于开发一个Nginx模块hello的主要内容,如果未能解决你的问题,请参考以下文章

nginx http模块开发入门

nginx hello模块代码

1. nginx添加自定义http模块(简单)

nginx 安装第三方模块(lua)并热升级

用 node.js 创建第一个Hello World

在nginx中开发一个HTTP模块