Nginx 소스 코드 분석 - 모듈 모듈 분석 실행 nginx. conf 프로필 프로 세 스 분석 1

24208 단어
nginx 서버 를 구축 할 때 주요 설정 파일 nginx. conf 는 서버 직원 들 이 자주 사용 하 는 파일 로 서버 매개 변 수 를 설정 합 니 다.그러면 nginx 는 모듈 모듈 모듈 을 골조 로 하 는 디자인 에서 모듈 모듈 모듈 을 어떻게 활용 하여 nginx. conf 설정 파일 의 명령 을 분석 하고 실행 합 니까?원본 코드 를 탐구 하기 전에 nginx 의 모듈 module 에 대해 기본 적 인 인식 을 가 져 야 합 니 다. Nginx 소스 코드 분석 - 모듈 모듈 에 대한 기본 인식 )또한 nginx 에서 자주 사용 하 는 일부 구조 에 대해 기본 적 인 이 해 를 가 져 야 한다. 예 를 들 어 메모리 풀 관리 와 관련 된 함수, ngx string 의 기본 구조 등 (상세 한 내용 은 앞의 박문 참조) 이다. 그렇지 않 으 면 코드 를 볼 때 그 뜻 을 명확 하 게 알 수 없 을 것 이다. 본 고 는 해석 하고 집행 하 는 절 차 를 연구 하 는 데 중심 을 두 어야 한다.
1. main 함수 부터 말 합 니 다.
Nginx 의 main 함 수 는 nginx. c 파일 에 있 습 니 다.
    ngx_max_module = 0;
    for (i = 0; ngx_modules[i]; i++) {
        ngx_modules[i]->index = ngx_max_module++;
    }

  cycle = ngx_init_cycle(&init_cycle);

여기 ngx modules ( Nginx 소스 코드 분석 - 모듈 모듈 에 대한 기본 인식 소개서색인 번 호 를 진행 하고 모듈 의 총 수 를 계산 한 ngx max module 입 니 다. 그 다음 에 cycle 을 초기 화하 여 ngx init cycle 로 넘 어 갑 니 다. cycle 이라는 변 수 는 nginx 의 핵심 변수 입 니 다. 모듈 체 제 는 모두 이 를 중심 으로 진행 되 었 고 그 안의 매개 변 수 는 복잡 하 게 관련 된 내용 보다 매우 많 습 니 다. 본 고 는 상세 하 게 토론 하지 않 았 습 니 다. 이 를 모듈 체제 로 볼 수 있 습 니 다.핵심 자원 창고
2, ngx init cycle 함수
이 함 수 는 파일 ngx cycle. c 에서 (43 줄) 입 니 다. 이 함 수 는 nginx 초기 화 에서 가장 중요 한 함수 중 하나 입 니 다. 이 함 수 는 cycle 변수 와 관련 된 초기 화 작업 과 관련 되 어 있 습 니 다. 188 줄 을 보 았 습 니 다.
 cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));

각 모듈 의 설정 정 보 를 저장 하기 위해 ngx max module 포인터 공간 을 가 져 왔 습 니 다. cycle 변수의 필드 conf ctx 이름 에서 알 수 있 듯 이 ctx 는 context 컨 텍스트 의 줄 임 말 입 니 다. 다음은 다음 단락 을 보 겠 습 니 다.
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;
        }
    }

모듈 에 NGX CORE MODULE 류 에 속 하 는 모듈 을 가 져 오고 설정 정 보 를 만 들 려 면 해당 하 는 설정 정 보 를 만 들 고 주 소 를 이전에 만 든 cycle - > conf ctx 주소 공간 에 저장 하여 핵심 모듈 설정 파일 의 생 성 과정 을 완성 하면 이 초기 작업 이 기본적으로 완 료 됩 니 다.
    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;

#if 0
    log->log_level = NGX_LOG_DEBUG_ALL;
#endif

    if (ngx_conf_param(&conf) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

앞의 conf 의 할당 부분 은 conf 를 초기 화 하 는 데 필요 한 것 이 아 닙 니 다. 여기 서 분석 한 것 은 모두 핵심 모듈 에 대한 것 입 니 다. 만 든 프로필 도 핵심 모듈 일 뿐 입 니 다. 관건 적 인 함수 가 나타 나 기 시 작 했 습 니 다. ngx conf param (& conf) 은 conf 에 필요 한 인자 (없 으 면 비어 있 을 수 있 습 니 다) 를 conf 에 저장 합 니 다. ngx conf parse (& conf, & cycle - > conf file)프로필 분석!
3. 함수 ngx conf parse 명령 해석 함수, 핵심 함수!
char *
ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename)
{
    char             *rv;
    ngx_fd_t          fd;
    ngx_int_t         rc;
    ngx_buf_t         buf;
    ngx_conf_file_t  *prev, conf_file;
    enum {
        parse_file = 0,
        parse_block,
        parse_param
    } type;
/*
   ,
*/
#if (NGX_SUPPRESS_WARN) fd = NGX_INVALID_FILE; prev = NULL; #endif /*
  filename nginx.conf
*/
    if (filename) {

        /*        */
        fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);
          ...
     /*
       cf->conf_file
    */ prev
= cf->conf_file;
    /*
       cf->conf_file
   */
cf
->conf_file = &conf_file; /*
         ,conf_file ,
      */

      ...   
     /*
         parse_file , 。
      */
type
= parse_file;
      /*
         else , nginx.conf
      */ }
else if (cf->conf_file->file.fd != NGX_INVALID_FILE) { type = parse_block; } else { type = parse_param; }   /*
     , , 。
  */
for ( ;; ) {
    /*  
       nginx.conf ,
ngx_conf_read_token
    */
rc
= ngx_conf_read_token(cf); /* * ngx_conf_read_token() may return * * NGX_ERROR there is error * NGX_OK the token terminated by ";" was found * NGX_CONF_BLOCK_START the token terminated by "{" was found * NGX_CONF_BLOCK_DONE the "}" was found * NGX_CONF_FILE_DONE the configuration file is done */
     /*
       , done
      */
if (rc == NGX_ERROR) { goto done; }
      /*
         “}” , done , failed
      */
if (rc == NGX_CONF_BLOCK_DONE) { if (type != parse_block) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"}\""); goto failed; } goto done; }
    /*
       , done 。
    */
if (rc == NGX_CONF_FILE_DONE) { if (type == parse_block) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected end of file, expecting \"}\""); goto failed; } goto done; }
      /*
         “{" , failed
      */
if (rc == NGX_CONF_BLOCK_START) { if (type == parse_param) { ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "block directives are not supported " "in -g option"); goto failed; } } /*
       , , , NGX_OK :worker_processes
       NGX_CONF_BLOCK_START { , :events、http 。
      rc == NGX_OK || rc == NGX_CONF_BLOCK_START
       */
if (cf->handler) { /*
        
* the custom handler, i.e., that is used in the http's * "types { ... }" directive */
rv = (*cf->handler)(cf, NULL, cf->handler_conf); if (rv == NGX_CONF_OK) { continue; } if (rv == NGX_CONF_ERROR) { goto failed; } ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, rv); goto failed; }     /*
       ngx_conf_handler
    */
rc
= ngx_conf_handler(cf, rc); if (rc == NGX_ERROR) { goto failed; } } failed: rc = NGX_ERROR; done:    /*
     , 。
    */   ...

    /*
      
    */
cf
->conf_file = prev; } if (rc == NGX_ERROR) { return NGX_CONF_ERROR; } return NGX_CONF_OK; }

상기 코드 에 서 는 관건 적 인 함 수 를 빨간색 으로 표시 하 는 것 외 에 함수 에서 문맥 을 저장 하고 복원 하 는 곳 에 빨간색 표 시 를 했 습 니 다. nginx 소스 코드 에서 이런 메커니즘 을 자주 사용 하기 때문에 이러한 쓰기 방법 을 기억 할 수 있 습 니 다.
4. 함수 ngx conf handler 명령 처리 함수, 관건 함수!
static ngx_int_t
ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)
{
     ...
    
for (i = 0; ngx_modules[i]; i++) { /* module*/ if (ngx_modules[i]->type != NGX_CONF_MODULE && ngx_modules[i]->type != cf->module_type) { continue; }      /*
        
      */
cmd
= ngx_modules[i]->commands; if (cmd == NULL) { continue; } for ( /* void */ ; cmd->name.len; cmd++) {         /*
           ,
        */
if (name->len != cmd->name.len) { continue; } if (ngx_strcmp(name->data, cmd->name.data) != 0) { continue; } /* */ if (!(cmd->type & cf->cmd_type)) { if (cmd->type & NGX_CONF_MULTI) { multi = 1; continue; } goto not_allowed; }
        ...

      /* */ if (!(cmd->type & NGX_CONF_ANY)) { if (cmd->type & NGX_CONF_FLAG) { if (cf->args->nelts != 2) { goto invalid; } } else if (cmd->type & NGX_CONF_1MORE) {
         }
          ...
} /*

         , cf_ctx , cycle->conf_ctx
        */ 
        conf
= NULL;
        
if (cmd->type & NGX_DIRECT_CONF) { conf = ((void **) cf->ctx)[ngx_modules[i]->index]; }
          ...
       /*
         !!
        */ rv
= cmd->set(cf, cmd, conf);

        /*
실행 에 성공 하면 성공 으로 돌아 갑 니 다.
        */
        if (rv == NGX_CONF_OK) {           return NGX_OK;          }
        /*
           , 。 , 。
        */ ...
} } ... }

여기에 쓰 기 는 시간 이 좀 늦 었 습 니 다. 요약 해 보 겠 습 니 다. 코드 발췌 소 개 를 통 해 전체 ngix. conf 해석 절 차 를 개괄적 으로 보 여 주 었 습 니 다. 그 중 일 부 는 2 급 모듈 의 명령 이 어떻게 실행 되 었 는 지 명확 하지 않 을 수 있 습 니 다. (바로 이벤트 {...}, http {...} 괄호 안의 명령 이 어떻게 실행 되 었 는 지)비 핵심 모듈 은 ngix. conf 라 는 프로필 을 분석 하 는 데 어떻게 가입 하 는 지 등 내용 을 다음 분석 에서 쓰 십시오. 안녕 히 주 무 세 요!

좋은 웹페이지 즐겨찾기