nginx 명령 해석

8946 단어
한 동안 nginx 를 읽 었 는데 중간 에 도 구덩이 가 많 습 니 다. 자신 이 읽 은 것 을 쓰 는 것 도 필기 라 고 할 수 있 습 니 다.
명령 해석
    - nginx        ngx_conf_s                ngx_command_s    。       ngx_commands;

ngx_command_s
struct ngx_command_s {
    ngx_str_t             name;//command   
    ngx_uint_t            type;//command           
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); //    
    ngx_uint_t            conf;//                      
    ngx_uint_t            offset;//     offset
    void                 *post;//                          ,            
};

설명 하 다.
       command           ,                   
  • name: 명령 의 이름 이자 설정 파일 에 적 힌 명령 입 니 다. ngxconf_s 읽 기 완료 후 이 걸 로 정확 한 명령 리 셋 함수 찾기
  • type: 이것 은 명령 의 유형 과 인 자 를 받 아들 이 는 개수 입 니 다.(위 치 는 어느 괄호 아래 에 있 는 매개 변수 개수 가 뒤에 몇 개의 값 이 있 는 지)
  • set: 리 셋 함수 cf: 바로 해상도 기 입 니 다. cmd 현재 명령, conf 현재 cmd 에 필요 한 설정 (conf 의 획득 은 현재 명령 의 형식 과 밀접 한 관 계 를 가지 고 있 습 니 다. 뒤에 있 습 니 다)
  • conf: 현재 설정 항목 에 저 장 된 메모리 위치 입 니 다. nginx 규칙 에서 현재 cmd 의 conf 는 그 가 포함 하 는 모듈 에 저장 되 어 있 기 때문에 하나의 설정 에 작은 항목 이 많 을 때 2 차 오프셋 을 허용 합 니 다.
  • offset: 일반적으로 nginx 내 장 된 읽 기 함 수 를 사용 할 때 사용 되 며, 정보 저장 위치 로 직접 찾 습 니 다
  • post: 일반적으로 사용자 정의 함수 에서 사용 합 니 다. 예 를 들 어 함수 포인 터 를 저장 하여 오래된 명령 에 대해 경고 합 니 다
  • #define ngx_null_command { ngx_null_string, 0, NULL, 0, 0, NULL } command
    type :
    1. NGX_DIRECT_CONF , core
    2. NGX_MAIN_CONF , main( core ),
    3. NGX_ANY_CONF
    4. NGX_CONF_BLOCK {}
    5. NGX_EVENT_CONF
    6. NGX_CONF_NOARGS ,NGX_CONF_MAX_ARGS NGX_CONF_TAKE1 .... NGX_CONF_TAKE7 。 (NGX_CONF_TAKE1|NGX_CONF_TAKE7)

    ngx_conf_s

    struct ngx_conf_s {
        char                 *name;
        ngx_array_t          *args;//         
        ngx_cycle_t          *cycle;
        ngx_pool_t           *pool;
        ngx_pool_t           *temp_pool;
        ngx_conf_file_t      *conf_file;//  
        ngx_log_t            *log;
        void                 *ctx;//    ctx  
        ngx_uint_t            module_type;//     
        ngx_uint_t            cmd_type;//       
        ngx_conf_handler_pt   handler;
        char                 *handler_conf;
    };
    

    1. cycle
         for (i = 0; ngx_modules[i]; i++) {
            if (ngx_modules[i]->type != NGX_CORE_MODULE) {//core module
                continue;
            }
            module = ngx_modules[i]->ctx; //     
            if (module->create_conf) {
                rv = module->create_conf(cycle);
                if (rv == NULL) {
                    ngx_destroy_pool(pool);
                    return NULL;
                }
                cycle->conf_ctx[ngx_modules[i]->index] = rv;//  core_module     
            }
        }
    
        conf.ctx = cycle->conf_ctx;
        conf.cycle = cycle;
        conf.pool = pool;
        conf.log = log;
        conf.module_type = NGX_CORE_MODULE;
        conf.cmd_type = NGX_MAIN_CONF;
    

    main nginx ngx_core_module create_conf , core , core main_conf

    1. static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf) , args
    2. NGX_CONF_BLOCK_START , handler handler , static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last) .

    static ngx_int_t
    ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)//config   
    {
        char           *rv;
        void           *conf, **confp;
        ngx_uint_t      i, found;
        ngx_str_t      *name;
        ngx_command_t  *cmd;
    
        name = cf->args->elts;//args              
    
        found = 0;//    
    
        for (i = 0; ngx_modules[i]; i++) {//  nginx          
    
            cmd = ngx_modules[i]->commands;//  model command
            if (cmd == NULL) {
                continue;
            }
    
            for ( /* void */ ; cmd->name.len; cmd++) {
    
                if (name->len != cmd->name.len) {
                    continue;
                }
    
                if (ngx_strcmp(name->data, cmd->name.data) != 0) {
                    continue;
                }
    
                found = 1;//           
    
                if (ngx_modules[i]->type != NGX_CONF_MODULE
                    && ngx_modules[i]->type != cf->module_type)//       
                {
                    continue;
                }
    
                /* is the directive's location right ? */
    
                if (!(cmd->type & cf->cmd_type)) { //          
                    continue;
                }
    
                if (!(cmd->type & NGX_CONF_BLOCK) && last != NGX_OK) {
                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                      "directive \"%s\" is not terminated by \";\"",
                                      name->data);
                    return NGX_ERROR;
                }//        
    
                if ((cmd->type & NGX_CONF_BLOCK) && last != NGX_CONF_BLOCK_START) {
                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                       "directive \"%s\" has no opening \"{\"",
                                       name->data);
                    return NGX_ERROR;
                }
    
                /* is the directive's argument count right ? */
    
                if (!(cmd->type & NGX_CONF_ANY)) {//       
    
                    if (cmd->type & NGX_CONF_FLAG) {
    
                        if (cf->args->nelts != 2) {
                            goto invalid;
                        }
    
                    } else if (cmd->type & NGX_CONF_1MORE) {
    
                        if (cf->args->nelts < 2) {
                            goto invalid;
                        }
    
                    } else if (cmd->type & NGX_CONF_2MORE) {
    
                        if (cf->args->nelts < 3) {
                            goto invalid;
                        }
    
                    } else if (cf->args->nelts > NGX_CONF_MAX_ARGS) {
    
                        goto invalid;
    
                    } else if (!(cmd->type & argument_number[cf->args->nelts - 1]))
                    {
                        goto invalid;
                    }
                }
    
                /* set up the directive's configuration context */
    
                conf = NULL;
    //module->index            module->ctx_index            
                if (cmd->type & NGX_DIRECT_CONF) {//       
                    conf = ((void **) cf->ctx)[ngx_modules[i]->index];//    
    
                } else if (cmd->type & NGX_MAIN_CONF) {
                    
                    conf = &(((void **) cf->ctx)[ngx_modules[i]->index]);//   
    /*
        core_moudle          block  ,          ,                ,               ,                      ,        
    */
    
                } else if (cf->ctx) {//               
                    confp = *(void **) ((char *) cf->ctx + cmd->conf);
       /*
           :ngx_event_moudle  
        ctx = ngx_pcalloc(cf->pool, sizeof(void *));
       *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
        cf->ctx = ctx;
        cf->module_type = NGX_EVENT_MODULE;
        cf->cmd_type = NGX_EVENT_CONF;
           cmd->conf =0;
         ctx *           ngx_event_max_module       void *                conf
      */
                    if (confp) {//          
                        conf = confp[ngx_modules[i]->ctx_index];//         
                    }
                }
    
                rv = cmd->set(cf, cmd, conf);//       
    
                if (rv == NGX_CONF_OK) {
                    return NGX_OK;
                }
    
                if (rv == NGX_CONF_ERROR) {
                    return NGX_ERROR;
                }
    
                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                   "\"%s\" directive %s", name->data, rv);
    
                return NGX_ERROR;
            }
        }
    
        if (found) {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                               "\"%s\" directive is not allowed here", name->data);
    
            return NGX_ERROR;
        }
    
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "unknown directive \"%s\"", name->data);
    
        return NGX_ERROR;
    
    invalid:
    
        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "invalid number of arguments in \"%s\" directive",
                           name->data);
    
        return NGX_ERROR;
    }
    

    block ngx_conf_parse , 。

    좋은 웹페이지 즐겨찾기