>  기사  >  백엔드 개발  >  [nginx 소스코드 분석] 구성 분석 1

[nginx 소스코드 분석] 구성 분석 1

WBOY
WBOY원래의
2016-08-08 09:24:441342검색

전체 구성 분석은 주로 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
}

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.