nginx 이벤트 모듈 분석 (1)

3280 단어 nginx
nginx ngx_events_모듈 모듈 분석
    ngx_events_module 모듈 은 핵심 모듈 중 하나 로 다른 모든 이벤트 모듈 의 프 록 시 모듈 입 니 다.nginx 는 시작 할 때 이벤트 모듈 과 만 접촉 하고 이벤트 모듈 에서 다른 이벤트 모듈 을 불 러 옵 니 다.이렇게 하 는 장점 중 하 나 는 새로운 이벤트 모듈 을 추가 하여 추가 설정 항목 을 처리 할 때 기 존 이벤트 모듈 코드 는 변경 할 필요 가 없다 는 것 이다.이벤트 모듈 기능 은 매우 간단 합 니 다. 이벤트 설정 항목 만 처리 합 니 다 (ngx events block 함수 로 처리 합 니 다).ngx_events_block 함 수 는 세 가지 일 을 합 니 다. 하 나 는 다른 이벤트 모듈 에 설정 항목 구 조 를 저장 하 는 포인터 배열 을 만 들 고 다른 이벤트 모듈 의 create 를 호출 합 니 다.conf 함수.2. ngx 호출conf_parse 함수 가 이벤트 설정 블록 내의 설정 항목 을 분석 합 니 다.3. 다른 이벤트 모듈 의 init 호출conf 함수.
ngx_events_block 함수 분석
 
static char *
ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
    char                 *rv;
    void               ***ctx;
    ngx_uint_t            i;
    ngx_conf_t            pcf;
    ngx_event_module_t   *m;

    if (*(void **) conf) {
        return "is duplicate";
    }

    /* count the number of the event modules and set up their indices */
	
    /***        ,  ctx_index    ***/
    ngx_event_max_module = 0;
    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
            continue;
        }

        ngx_modules[i]->ctx_index = ngx_event_max_module++;
    }

    ctx = ngx_pcalloc(cf->pool, sizeof(void *));
    if (ctx == NULL) {
        return NGX_CONF_ERROR;
    }

    /***                    ***/
    *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
    if (*ctx == NULL) {
        return NGX_CONF_ERROR;
    }

    *(void **) conf = ctx;

    /***         create_conf  ***/
    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
            continue;
        }

        m = ngx_modules[i]->ctx;

        if (m->create_conf) {
            (*ctx)[ngx_modules[i]->ctx_index] = m->create_conf(cf->cycle);
            if ((*ctx)[ngx_modules[i]->ctx_index] == NULL) {
                return NGX_CONF_ERROR;
            }
        }
    }

    /***    events         ***/
    pcf = *cf;
    /***   events{}      ,         ctx    ***/
    cf->ctx = ctx;
    cf->module_type = NGX_EVENT_MODULE;
    cf->cmd_type = NGX_EVENT_CONF;

    /***    events {}     ***/
    rv = ngx_conf_parse(cf, NULL);

    /***      ***/
    *cf = pcf;

    if (rv != NGX_CONF_OK)
        return rv;

    /***         init_conf  ***/
    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
            continue;
        }

        m = ngx_modules[i]->ctx;

        if (m->init_conf) {
            rv = m->init_conf(cf->cycle, (*ctx)[ngx_modules[i]->ctx_index]);
            if (rv != NGX_CONF_OK) {
                return rv;
            }
        }
    }

    return NGX_CONF_OK;
}

 
 

좋은 웹페이지 즐겨찾기