nginx 소스 학습 노트 (3) - nginx 정수 - 모듈

다음은 진정한 'nginx 여행' 을 시작 합 니 다. 숨 을 죽 이 세 요!
먼저 착안점 을 잘 찾 아 보 세 요. nginx 에 대한 착안점 은 바로 ngx 입 니 다.module_t 구조, 그의 성명 은 src / core / ngxconf_file. h 중 (내 버 전 nginx - 1.0.13)
#define NGX_MODULE_V1          0, 0, 0, 0, 0, 0, 1
#define NGX_MODULE_V1_PADDING  0, 0, 0, 0, 0, 0, 0, 0

struct ngx_module_s {
    ngx_uint_t            ctx_index;
    ngx_uint_t            index;

    ngx_uint_t            spare0;
    ngx_uint_t            spare1;
    ngx_uint_t            spare2;
    ngx_uint_t            spare3;

    ngx_uint_t            version;

    void                 *ctx;
    ngx_command_t        *commands;
    ngx_uint_t            type;

    ngx_int_t           (*init_master)(ngx_log_t *log);

    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);

    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);
    void                (*exit_thread)(ngx_cycle_t *cycle);
    void                (*exit_process)(ngx_cycle_t *cycle);

    void                (*exit_master)(ngx_cycle_t *cycle);

    uintptr_t             spare_hook0;
    uintptr_t             spare_hook1;
    uintptr_t             spare_hook2;
    uintptr_t             spare_hook3;
    uintptr_t             spare_hook4;
    uintptr_t             spare_hook5;
    uintptr_t             spare_hook6;
    uintptr_t             spare_hook7;
};

index: 하나의 모듈 카운터 입 니 다. 각 모듈 에 따라 ngxmodules [] 배열 의 성명 순 서 는 0 부터 각 모듈 에 값 을 부여 합 니 다.
성명 순 서 는 파일 obbs / ngx 에 있 습 니 다.modules. c 중
ngx_module_t *ngx_modules[] = {
    &ngx_core_module,
    &ngx_errlog_module,
    &ngx_conf_module,
    &ngx_events_module,
    &ngx_event_core_module,
    &ngx_epoll_module,
    &ngx_http_module,
    &ngx_http_core_module,
    &ngx_http_log_module,

src / core / nginx. c 에서 순서 할당 코드 를 찾 을 수 있 습 니 다.
ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) {
    ngx_modules[i]->index = ngx_max_module++;
}

ctx_index 는 분 류 된 모듈 카운터 로 nginx 모듈 은 네 가지 로 나 눌 수 있 습 니 다. core, event, http 와 mail 은 각 모듈 마다 각자 의 기술, ctxindex 는 각 모듈 이 소속 그룹 에 있 는 기술 입 니 다. 코드 는 다음 과 같 습 니 다.
src/event/ngx_event.c
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++;
}

src/http/ngx_http.c
ngx_http_max_module = 0;
for (m = 0; ngx_modules[m]; m++) {
    if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
        continue;
    }

    ngx_modules[m]->ctx_index = ngx_http_max_module++;
}

src/mail/ngx_mail.c
ngx_mail_max_module = 0;
for (m = 0; ngx_modules[m]; m++) {
    if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
        continue;
    }

    ngx_modules[m]->ctx_index = ngx_mail_max_module++;
}

ctx 는 모듈 의 상하 문 으로 서로 다른 종류의 모듈 은 서로 다른 상하 문 이 있 기 때문에 네 가지 구조 체 를 실현 했다.(이곳 은 매우 중요 하 다)
commands 는 모듈 의 명령 집합 입 니 다.모든 명령 은 원본 코드 에 하나의 ngx 가 대응 합 니 다.command_t 구조 변수,
static ngx_command_t  ngx_core_commands[] = {

    { ngx_string("daemon"),
      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      0,
      offsetof(ngx_core_conf_t, daemon),
      NULL },.....     

type 은 모듈 의 종류 입 니 다. 앞에서 언급 한 core 이벤트 http 와 mail 을 구분 하 는 데 사 용 됩 니 다.
init_master、 init_module、init_process、init_thread、exit_thread、exit_process、 exit_master 는 함수 포인터 로 모듈 이 실현 하 는 사용자 정의 리 셋 함수 입 니 다. 이 리 셋 함 수 는 각각 master 초기 화, 모듈 초기 화, 작업 프로 세 스 초기 화, 스 레 드 초기 화, 스 레 드 종료, 작업 프로 세 스 종료 와 master 종료 시 호출 됩 니 다. 모듈 이 이 시기 에 처리 해 야 한다 면 해당 하 는 함 수 를 실현 할 수 있 습 니 다.대응 하 는 함수 포인터 에 값 을 부여 하여 반전 함수 인 터 페 이 스 를 등록 합 니 다.
나머지 는 잠시 알려 지지 않 았 다.
다음은 ngxmodule_t 의 ctx 구성원, 이 구성원 의 의 미 는 각 모듈 의 문맥 입 니 다. 이른바 문맥, 즉 이 모듈 이 무엇 을 할 수 있 는 지 앞의 분석 을 통 해 nginx 는 모든 모듈 을 네 가지 유형 (core / event / http / mail) 으로 나 누 었 습 니 다. 이에 대응 하 는 nginx 도 모델 의 문맥 이 네 가지 라 고 생각 하고 각각 네 개의 구조 체 로 표시 합 니 다. ngxcore_module_t、ngx_event_module_t、ngx_http_module_t、 ngx_mail_module_t。즉, 하나의 모듈 이 core 분류 에 속한다 면 그 문맥 은 ngx 이다.core_module_t 구조의 변수, 기타 유추.이 네 개의 구조 체 는 ngx 와 유사 하 다module_t. 또한 일부 함수 포인터 의 집합 이기 도 합 니 다. 각 모듈 은 자신 이 속 한 분류 에 따라 일부 조작 함 수 를 사용자 정의 합 니 다. 이러한 조작 함 수 를 분류 구조 체 중의 함수 포인터 로 할당 하면 리 턴 함수 인 터 페 이 스 를 등록 하여 더욱 세밀 한 기능 을 실현 할 수 있 습 니 다. 예 를 들 어 이벤트 모듈 에 이벤트 처리 함 수 를 추가 할 수 있 습 니 다.http 모듈 에 필터 함수 등 을 추가 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기