Nginx 소스 코드 분석 - Nginx 시작 초기 화 과정 (1)

24490 단어
Nginx 의 시작 초기 화 는 src / core / nginx. c 의 main 함수 에서 이 루어 집 니 다. 물론 main 함 수 는 전체 Nginx 의 입구 입 니 다. 시작 초기 화 작업 을 수행 하 는 것 외 에 모든 기능 모듈 의 입구 입 니 다.Nginx 초기 화 작업 은 주로 ngx 유형 을 중심 으로 합 니 다.cycle_t 형식의 전역 변수 (cycle) 가 펼 쳐 집 니 다.다음은 main 함수 가 Nginx 의 시작 과정 을 위해 어떤 초기 화 를 했 는 지 구체 적 으로 살 펴 보 겠 습 니 다.(아래 코드 세그먼트 는 모두 main 함수 에서 순서대로 추출 한 것 으로 원본 코드 를 대조 하여 읽 으 면 더욱 쉽게 이해 할 수 있 습 니 다)
main 함수 가 하 는 첫 번 째 일 은 매개 변수 옵션 을 처리 하 는 것 입 니 다. 일반적인 Linux 프로그램 과 똑 같 습 니 다. 다음 과 같 습 니 다.

   
   
   
   
if (ngx_get_options(argc, argv) != NGX_OK) { 
return 1; 
}

Nginx 는 이 함수 로 매개 변수 옵션 을 분석 하여 해당 하 는 동작 을 취 합 니 다. 예 를 들 어 디 스 플레이 버 전, 테스트 설정 등 기능 입 니 다.사실 이 함 수 는 리 눅 스 가 제공 하 는 getopt () 만큼 강하 지 않 지만 크로스 플랫폼 의 목적 을 달성 할 수 있 습 니 다.
ngx_time_init(); 
#if (NGX_PCRE) 
ngx_regex_init(); 
#endif 
ngx_pid = ngx_getpid(); 
log = ngx_log_init(ngx_prefix); 
if (log == NULL) { return 1; } 

위 몇 줄 코드 의 기능 은 이름 과 같이 시간 과 로그 등에 서 Nginx 의 초기 화 작업 을 수행 합 니 다.
if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK){ return 1; }

명령 행 인 자 를 ngx 에 저장 합 니 다.os_argv、ngx_argc 및 ngxargv 이 몇 개의 전역 변수 중.이것 은 백업 저장 소 라 고 할 수 있 습 니 다. 나중에 master 프로 세 스 가 열 코드 를 교체 하 는 데 편리 합 니 다.
if (ngx_os_init(log) != NGX_OK) { return 1; }

메모리 페이지 크기, 시스템 제한 자원 등 운영 체제 의 일부 정 보 를 가 져 옵 니 다.모든 이 자원 들 은 대응 하 는 전역 변수 에 저장 되 기 때문에 후속 접근 이 편리 할 것 입 니 다.
if (ngx_crc32_table_init() != NGX_OK) { return 1; }

순환 중복 검 사 를 하 는 표를 초기 화 하면 후속 적 인 순환 중복 검 사 는 효율 적 인 검사 표 법 을 사용 할 것 임 을 알 수 있다.crc 알고리즘 은 여기 서 분석 을 하지 않 고 인터넷 에 관련 자료 가 쌓 여 있 으 며 관심 이 있 는 학생 들 은 알 수 있 습 니 다.
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { return 1; }

환경 변수 NGINX 를 통 해 socket 계승 완료, 계 승 된 socket 은 initcycle 의 listening 배열 에서NGINX 환경 변수 에서 모든 socket 중간 은 콜론 이나 분점 으로 분리 합 니 다.계승 완료 및 전역 변수 ngx 설정inherited 는 1 입 니 다.
ngx_max_module = 0; 
for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]->index = ngx_max_module++; }

어!!!이 순환 중인 ngxmodules 배열 이 정의 되 지 않 은 것 같은 데 화성 에서 온 것 일 까요?물론 그 이름 과 같이 이것 은 모든 모듈 의 정 보 를 저장 하 는 것 입 니 다. 자신 이 개발 한 모듈 을 포함 하여 이 배열 에 넣 습 니 다. 이 신비 한 배열 은 자동 으로 컴 파일 할 때 생 성 된 것 입 니 다. obbs / ngx 에 있 습 니 다.modules. c 파일 중.이 순환 의 목적 은 모든 모듈 에 색인 번 호 를 매 겨 나중에 접근 할 수 있 도록 하 는 것 이다.동시에 ngxmax_module 은 모든 모듈 에 대해 점 수 를 한 번 진행 하여 도대체 몇 개의 모듈 이 있 는 지 확인 하 였 다.신비 수조 ngxmodules 의 생김새 는 대략 다음 과 같다.
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_openssl_module,
	&ngx_http_module, 
	。。。 
};
cycle = ngx_init_cycle(&init_cycle);

전역 변수 cycle 에 많은 것 을 초기 화 합 니 다. Nginx 시작 초기 화의 핵심 입 니 다.ngx_init_cycle 함수 의 과정 이 비교적 많 습 니 다. 블 로그 에서 단계별 분석 을 내 려 놓 습 니 다.
if (ngx_init_signals(cycle->log) != NGX_OK) { return 1; }

신호 처리 프로그램 을 등록 하고 등록 해 야 할 신호 와 해당 하 는 신호 처리 함수 가 하나의 유형 에 놓 여 있 습 니 다. ngxsignal_t 의 배열 signals 에서그룹 정 의 는 src / os / unix / ngxprocess. c 중.ngx_signal_t 구조 유형 은 신호 값, 신호 이름, 신호 대응 동작 이름과 신호 처리 함 수 를 정의 합 니 다.
if (!ngx_inherited && ccf->daemon) { 
 if (ngx_daemon(cycle->log) != NGX_OK) { return 1; } 
 ngx_daemonized = 1; 
}

ngx_daemon 은 데 몬 을 실현 하 는 함수 일 것 입 니 다. 여 기 는 쓸데없는 말 이 없습니다. server 프로그램 을 써 야 할 것 이 있 으 면 이 코드 를 직접 복사 하여 데 몬 을 실현 할 수 있 습 니 다.
if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) { return 1; }

Nginx 를 해 본 사람 은 모두 알 고 있 습 니 다. Nginx 가 시 작 된 후에 프로 세 스 id 를 기록 하 는 파일 이 있 습 니 다. 이 파일 에는 pid 가 있 습 니 다.원래 이 pid 는 이곳 에 기록 되 어 있 었 다.ngx 보기create_pidfile 함수 에서 이러한 코드 를 볼 수 있 습 니 다.
if (ngx process > NGX PROCESS MASTER) {return NGX OK;}, 이 코드 는 master 프로 세 스 가 아 닐 때 이러한 pid 파일 을 만 들 지 않 는 다 는 것 을 설명 합 니 다.
if (ngx_process == NGX_PROCESS_SINGLE) { ngx_single_process_cycle(cycle); } 
else { ngx_master_process_cycle(cycle); }

이 쯤 에서 Nginx 의 시작 초기 화 과정 을 거의 마 쳤 습 니 다. 곧 프로 세 스 와 관련 된 작업 을 시작 할 것 입 니 다. 여기 서 가장 중요 한 ngxmaster_process_cycle 이 과정 은 이 과정 에서 master - worker 모드 의 프로 세 스 모델 을 실 현 했 고 환경 에서 Nginx 를 생 성 하 는 데 자주 사용 되 는 모델 이기 도 합 니 다.초기 화 작업 이 아 닌 이상 후속 분석 으로 남 겨 두 자.
상기 모든 과정 은 main 함수 에서 이 루어 졌 으 며, 다음 분석 ngxinit_cycle 함수.

좋은 웹페이지 즐겨찾기