전체 구성 분석은 주로 ngx_init_cycle(&init_cycle) 함수를 통해 처리됩니다.
ngx_init_cycle(&init_cycle)
ngx_time_update()//시간 업데이트, 메인 함수에서도 언급됨
/* * 通过加锁和解锁,来更新如下时间 ngx_cached_time = tp; ngx_cached_http_time.data = p0; ngx_cached_err_log_time.data = p1; ngx_cached_http_log_time.data = p2; ngx_cached_http_log_iso8601.data = p3; */
log = old_cycle- > ;log;//오류 로그 객체
pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE,log);//16k 메모리 풀을 할당합니다. 첫 번째 노드는 약 16k입니다. 의 이 노드는 4095개입니다
cycle->pool = pool; cycle->log = log; cycle->new_log.log_level = NGX_LOG_ERR; cycle->conf_prefix; //设置配置文件dir cycle->prefix; //设置运行环境dir cycle->conf_file; //设置配置文件绝对路径 cycle->conf_param; //保存参数 cycle->pathes; //路径数组 cycle->open_files; //分配打开的文件描述符,其中这个结构是一 个链表,每个链表节点都有一个n个size的 cycle->shared_memory; //分配n个共享内存节点,这个是一个list, 每个节点都存在n个ngx_shm_zone_t结构,通过next指向链表后面的节点。 cycle->listening; //listening数组 cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module*sizeof(void*));
ngx_max_module 컨텍스트 포인터를 사이클에 할당
먼저 핵심 모듈의 컨텍스트 구조를 생성하고 해당 사이클에 저장합니다.-> ;conf_ctx 구조의
핵심 모듈은 다음과 같습니다.
NGX_CORE_MODULE index Ngx_core_module 0 Ngx_errlog_module 1 Ngx_reg_module 6 Ngx_events_module 3 Ngx_http_module 7핵심 코드
for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->type != NGX_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; } }
nginx는 먼저 NGX_CORE_MODULE을 생성하여 후속 모듈 컨텍스트를 생성할 수 있는 기반을 마련합니다. 즉,
NGX_CORE_MODULE은 다음과 같이 다른 모듈의 기반이 됩니다.
그 중 Ngx_errlog_module, ngx_events_module, ngx_http_module 모듈에는 실제 사용자의 conf를 기반으로 동적으로 생성되는 create_conf
메소드가 없습니다.
conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t)); if (conf.args == NULL) { ngx_destroy_pool(pool); return NULL; } conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); if (conf.temp_pool == NULL) { ngx_destroy_pool(pool); return NULL; } 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;
구성 파일의 사용자 구성 키와 값을 저장하는 데 사용되는 conf용 매개변수를 생성합니다. 동시에 temp_pool, conf-에
스토리지 풀을 생성합니다. >ctx는 Cycle->conf_ctx를 가리키고, 주기 저장, 풀, 로그, 모듈 유형 및 명령 유형 설정,
기본 구성 파일 변수 구문 분석을 시작합니다.
구성 파일을 파싱하는 과정은 주로 ngx_conf_parse에 의한 간접 재귀 호출로 주로 메인 범위, 이벤트 범위, http 범위, 서버 범위, 위치 범위로 나누어 분석을 진행합니다. args 배열에 저장됩니다. cf->handler에 값이 있는 것으로 확인되면 콜백 처리(일반적으로mine.types 파일 처리)를 위해 cf->handler를 호출합니다. cf->handler가 비어 있으면 ngx_conf_handler를 호출하여 cmd를 탐색합니다. 각 모듈에 와서 명령을 찾고 cmd가 키인 경우 명령의 set 콜백 메소드를 호출하십시오. 값 변수 설정은 해당 모듈 변수 설정 후 ngx_conf_read_token을 호출합니다. http, event, location 등의 블록 키인 경우 해당 콜백 함수(cmd->set)가 먼저 컨텍스트 구조 변수를 생성한 후 간접적으로 물론 재귀적 ngx_conf_parse는 다른 컨텍스트를 설정합니다.
위에 내용의 측면을 포함하여 [nginx 소스코드 분석] 구성 분석 1을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.
enum{ parse_file = 0, //解析文件,比如nginx.conf 还有include文件 parse_block, //解析块,比如http{}块 parse_param //解析参数 比如deamon off }