nginx 학습 노트 5 (nginx 의 이벤트 모듈 정의)

7346 단어 nginx 학습
Liux 백 스테이지 서버 개발 분야 에서 epoll 의 이름 은 일찍이 들 은 바 가 있다.라 는 책 은 9 장 - 사건 모듈 에서 epoll 과 관련 된 시스템 호출 이 nginx 의 프레임 에 어떻게 포함 되 는 지 상세 하 게 설명 했다.
다음은 nginx 프레임 워 크 에서 이벤트 처리 와 관련 된 모듈 을 설명 합 니 다.
1. ngxevents_module
ngx_events_module 은 핵심 모듈 중의 하나 이다.그동안 핵심 모듈 의 뜻 을 잘 몰 랐 는데, 지금 생각해 보면 이벤트 모듈 의 핵심 모듈 은 이벤트 와 관련 된 첫 번 째 모듈 이 어야 한다.이 모듈 은 실제 사건 업 무 를 처리 하지 않 고 기본 적 인 초기 화 작업 을 할 것 이다.ngx_events_module 의 정 의 는 다음 과 같다.
ngx_module_t  ngx_events_module = {
    NGX_MODULE_V1,
    &ngx_events_module_ctx,                /* module context */
    ngx_events_commands,                   /* module directives */
    NGX_CORE_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};

static ngx_command_t  ngx_events_commands[] = {

    { ngx_string("events"),
      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
      ngx_events_block,
      0,
      0,
      NULL },

      ngx_null_command
};


static ngx_core_module_t  ngx_events_module_ctx = {
    ngx_string("events"),
    NULL,
    NULL
};

상기 프로그램 에서 볼 수 있 듯 이 이 모듈 에서 하 는 일 은 매우 제한 되 어 있 습 니 다. ngxevents_module_ctx 의 initconf 와 createconf 방법 은 모두 비어 있다.그리고 ngxevents_block 에 서 는 다른 이벤트 모듈 을 호출 하여 이벤트 의 설정 을 분석 하고 다른 이벤트 모듈 각자 의 방법 으로 설정 항목 구조 체 를 구축 하고 채 웁 니 다.부분 핵심 코드 는 다음 과 같 습 니 다.
//conf ngx_conf_handler  conf = confp[ngx_modules[i]->ctx_index];   conf    ngx_cycle_s->conf_ctx[],
    //   conf     ngx_cycle_s  conf_ctx  ,    ngx_cycle_s  conf_ctx[ngx_events_module=>index]   ctx
    *(void **) conf = ctx;

    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;
            }
        }
    }

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

    rv = ngx_conf_parse(cf, NULL);//   cf      ctx NGX_EVENT_MODULE  create_conf     event{}   

    *cf = pcf; //   event{}   ,  

    if (rv != NGX_CONF_OK) {
        return rv;
    }

    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;
            }
        }
    }

2. ngxevent_core_모듈 이벤트 모듈
ngx_event_core_module 은 이벤트 모듈 에서 첫 번 째 순서 입 니 다.이 모듈 은 이벤트 의 많은 설정 항목 에 응답 하고 초기 화 작업 을 완료 하여 뒤의 실제 이벤트 처리 모듈 을 준비 합 니 다.이 모듈 의 정 의 는 다음 과 같다.
여기 ngxevent_process_init 함 수 는 실제로 많은 일 을 했 습 니 다. 이 함 수 는 하위 프로 세 스 를 만 들 때 호출 됩 니 다.구체 적 으로 책 설명 을 참조 하 다.
3. ngxepoll_모듈 모듈
이벤트 의 use 설정 항목 이 epoll 을 선택 하면 뒤에서 ngx 에 대응 합 니 다.epoll_module 모듈 의 실행.이 모듈 의 정 의 는 다음 과 같다.
//     ngx_event_core_commands ngx_http_core_commands ngx_stream_commands ngx_http_core_commands ngx_core_commands  ngx_mail_commands
static ngx_command_t  ngx_event_core_commands[] = {
    //  worker              
    //      ,     worker      TCP     ,     connections          ,   9.3.3         
    { ngx_string("worker_connections"),
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
      ngx_event_connections,
      0,
      0,
      NULL },

    //      。 use [kqueue | rtsig | epoll | dev/poll | select | poll | eventport] linux      select poll epoll   
    //freebsd  kqueue,LINUX   
    //                   
    { ngx_string("use"),
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
      ngx_event_use,
      0,
      0,
      NULL },
    //        TCP   ,                TCP         
    //        available  。  epoll        ,               ,  accept          
    { ngx_string("multi_accept"),
      NGX_EVENT_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      0,
      offsetof(ngx_event_conf_t, multi_accept),
      NULL },

    //accept_mutex on|off    accept   ,     worker           、      worker           TCP  
    //      ,      TCP     , worker          。
    { ngx_string("accept_mutex"),
      NGX_EVENT_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      0,
      offsetof(ngx_event_conf_t, accept_mutex),
      NULL },
    //accept_mutex_delay time,     accpt_mutex on, worker              accept ,  accept      ,      
    //    ,    time      。
    //  accept_mutex      ,  accept_mutex_delay             
    { ngx_string("accept_mutex_delay"),
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_msec_slot,
      0,
      offsetof(ngx_event_conf_t, accept_mutex_delay),
      NULL },
    //debug_connection 1.2.2.2     IP       ,  debug    。       error_log    
    //       IP TCP    debug       
    { ngx_string("debug_connection"),
      NGX_EVENT_CONF|NGX_CONF_TAKE1,
      ngx_event_debug_connection,
      0,
      0,
      NULL },

      ngx_null_command
};

//ngx_event_core_module       create_conf   init_conf  ,           TCP       ,
//      ngx_event_actions_t    
ngx_event_module_t  ngx_event_core_module_ctx = {
    &event_core_name,
    ngx_event_core_create_conf,            /* create configuration */
    ngx_event_core_init_conf,              /* init configuration */

    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};

/*
Nginx      (   9 )         、              ,  :ngx_epoll_module、ngx_kqueue_module、
ngx_poll_module、ngx_select_module、ngx_devpoll_module、ngx_eventport_module、ngx_aio_module、ngx_rtsig_module
   Windows ngx_select_module  。 ngx_event_core_module         ,     9      1   Nginx         。
*/
ngx_module_t  ngx_event_core_module = {
    NGX_MODULE_V1,
    &ngx_event_core_module_ctx,            /* module context */
    ngx_event_core_commands,               /* module directives */
    NGX_EVENT_MODULE,                      /* module type */
    NULL,                                  /* init master */
    ngx_event_module_init,                 /* init module */ //          
    ngx_event_process_init,                /* init process */ //             ngx_worker_process_init
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
ngx_epoll_init,  ngx_epoll_addevent,  ngx_epoll-process_이벤트 중 대응 하 는 epollcreate,epoll_ctl, epoll_wait 이 epoll 의 시스템 호출 함수 입 니 다.
다음은 ngxepoll_process_이벤트 구현 프로그램:
4. 567913. 본 모듈 은 사건 의 배포 만 책임 지고 구체 적 인 업무 논리 처 리 는 각 읽 기와 쓰기 사건 에 대응 하 는 handler 방법 에 있다 는 것 을 알 수 있다.

좋은 웹페이지 즐겨찾기