zoukankan      html  css  js  c++  java
  • Nginx学习——http配置项解析编程


    http配置项解析编程


     


    配置config


    ngx_addon_name=ngx_http_mytest_module


    HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"


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


    nginx_http_mytest_module.c中定义mytest模块,使用预设方法解析test_flagtest_str,test_num配置项,使用自己定义配置项处理方法解析mytest项。


    <pre class="cpp" name="code">#include <ngx_config.h>
    #include <ngx_core.h>
    #include <ngx_http.h>
    
    //create a structure
    typedef struct{
            ngx_str_t my_str;
            ngx_int_t my_num;
            ngx_flag_t my_flag;
            ngx_str_t mytest_str;
            ngx_int_t mytest_num;
    } ngx_http_mytest_conf_t;
    
    
    
    static char* ngx_conf_set_mytest(ngx_conf_t* cf, ngx_command_t* cmd, void* conf);
    static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t* r);
    
    static void* ngx_http_mytest_create_loc_conf(ngx_conf_t* cf);
    static char* ngx_http_mytest_merge_loc_conf(ngx_conf_t* cf, void* parent, void* child);
    
    //set the resolution of configuration items
    static ngx_command_t ngx_http_mytest_commands[] = {
            {
                    //test_flag configuration item          
                    ngx_string("test_flag"),
                    NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
                    ngx_conf_set_flag_slot,
                    NGX_HTTP_LOC_CONF_OFFSET,
                    offsetof(ngx_http_mytest_conf_t, my_flag),
                    NULL
            },
            {
                    //test_str configuration item
                    ngx_string("test_str"),
                    NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
                    ngx_conf_set_str_slot,
                    NGX_HTTP_LOC_CONF_OFFSET,
                    offsetof(ngx_http_mytest_conf_t, my_str),
                    NULL
            },
            {
                    //test_num configuration item
                    ngx_string("test_num"),
                    NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
                    ngx_conf_set_num_slot,
                    NGX_HTTP_LOC_CONF_OFFSET,
                    offsetof(ngx_http_mytest_conf_t, my_num),
                    NULL
            },
            {
                    //mytest configuration item
                    ngx_string("mytest"),
                    NGX_HTTP_LOC_CONF | NGX_CONF_TAKE2,
                    ngx_conf_set_mytest,
                    NGX_HTTP_LOC_CONF_OFFSET,
                    0,
                    NULL
            },
    
            ngx_null_command
    };
    static ngx_http_module_t ngx_http_mytest_module_ctx = {
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            ngx_http_mytest_create_loc_conf,        //create location configuration
            ngx_http_mytest_merge_loc_conf          //merge the loc configurations
    };
    
    ngx_module_t ngx_http_mytest_module = {
            NGX_MODULE_V1,
            &ngx_http_mytest_module_ctx,
            ngx_http_mytest_commands,
            NGX_HTTP_MODULE,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NGX_MODULE_V1_PADDING
    };
    
    static char* ngx_conf_set_mytest(ngx_conf_t* cf, ngx_command_t* cmd, void* conf)
    {
            ngx_http_mytest_conf_t* mycf = conf;
    
            ngx_str_t* value = cf->args->elts;
    
            mycf->mytest_num = ngx_atoi(value[2].data, value[2].len);
    
            mycf->mytest_str = value[1];
            ngx_http_core_loc_conf_t* clcf;
            clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
            clcf->handler = ngx_http_mytest_handler;
    
            return NGX_CONF_OK;
    }
    
    static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t* r)
    {
            //we response 'GET' and 'HEAD' requests only
            if(!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD | NGX_HTTP_POST)))
            {
                    return NGX_HTTP_NOT_ALLOWED;
            }
            //discard request body, since we don't need it here
            ngx_int_t rc = ngx_http_discard_request_body(r);
            if(rc != NGX_OK){
                    return rc;
            }
    
            ngx_http_mytest_conf_t* my_conf;
            my_conf = ngx_http_get_module_loc_conf(r, ngx_http_mytest_module);
    
            ngx_str_t type = ngx_string("text/plain");
    
            u_char nginx_str_mytest[1024] = {0};
            ngx_sprintf(nginx_str_mytest,"test_str=%s,test_flag=%i,test_num=%i,mytest_str=%s,mytest_num=%i",my_conf->my_str.data,my_conf->my_flag,my_conf->my_num,my_conf->mytest_str.data,my_conf->mytest_num);
    
            r->headers_out.status = NGX_HTTP_OK;
            r->headers_out.content_length_n = ngx_strlen(nginx_str_mytest);
            r->headers_out.content_type = type;
    
            rc = ngx_http_send_header(r);
            if(rc == NGX_ERROR || rc>NGX_OK || r->header_only)
            {
                    return rc;
            }
    
            ngx_buf_t* b;
            b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
            if(b == NULL)
            {
                    return NGX_HTTP_INTERNAL_SERVER_ERROR;
            }
            b->pos = nginx_str_mytest;
            b->last = nginx_str_mytest + ngx_strlen(nginx_str_mytest);
            b->memory = 1;
            b->last_buf = 1;
    
            ngx_chain_t out;
            out.buf = b;
            out.next = NULL;
    
            return ngx_http_output_filter(r, &out);
    }
    
    static void* ngx_http_mytest_create_loc_conf(ngx_conf_t* cf)
    {
            ngx_http_mytest_conf_t* conf;
            conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_mytest_conf_t));
            if(NULL == conf){
                    return NGX_CONF_ERROR;
            }
    
            conf->my_str.len = 0;
            conf->my_str.data = NULL;
            conf->my_num = NGX_CONF_UNSET;
            conf->my_flag = NGX_CONF_UNSET;
            return conf;
    }
    
    static char* ngx_http_mytest_merge_loc_conf(ngx_conf_t* cf, void* parent, void* child)
    {
            ngx_http_mytest_conf_t* prev = parent;
            ngx_http_mytest_conf_t* conf = child;
            ngx_conf_merge_str_value(conf->my_str, prev->my_str,"");
    
            return NGX_CONF_OK;
    }
    

    
    

    
    


    ngx.confhttp以下默认server中增加例如以下配置项


    location /test{


                   test_flag on;


                   test_str "helloworld";


                   test_num 88;


                   mytest"hello" 88;


            }


    启动nginx


    ./configure --add-module=/home/chen123/nginx/exp3


    make


    make install


    sudo /usr/local/nginx/sbin/nginx


     


    结果例如以下



     


  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5162154.html
Copyright © 2011-2022 走看看