开发一个Nginx模块hello - Go语言中文社区

开发一个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  
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weiqubo/article/details/103713224
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 20:06:11
  • 阅读 ( 1386 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢