Nginx 소스 코드 분석 - Nginx 시작 초기 화 과정 (1)
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 함수.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.