nginx 소스 학습 노트 (3) - 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 모듈 에 필터 함수 등 을 추가 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Exception in thread main java.lang. NoClassDefFoundError 오류 해결 방법즉,/home/hadoop/jarfile) 시스템은 Hello World 패키지 아래의class라는 클래스 파일을 실행하고 있다고 오인하여 시스템의 CLASSPATH 아래 (일반적으로 현재 디렉터리를 포함) Hell...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.