nginx 시작 기 에 어떤 일 을 했 습 니까?
7875 단어 nginx
이것 은 master 프로 세 스 가 하나 있 고 여러 worker 프로 세 스 와 관련 이 있 습 니 다.그럼, 우선 main 함 수 를 찾 아야 합 니 다. src / core / nginx. c 파일 에 있 습 니 다.소스 코드 에 대해 서 는 소스 코드 의 디 렉 터 리 구 조 를 간단하게 살 펴 보 자.
nginx 는 주로 다음 디 렉 터 리 가 있 습 니 다.
src / core, 이 디 렉 터 리 는 LIST, 레 드 블랙 트 리, nginx 문자열 과 같은 기본 적 인 데이터 구 조 를 저장 하고 ngx 와 같은 논리 구 조 를 관통 합 니 다.cycle_s、ngx_connection_s 등, 그리고 일부 바 텀 작업 에 대한 패키지, 예 를 들 어 log, 파일 작업, 공유 메모리, 메모리 풀 등 이 있 습 니 다. 마지막 으로 nginx. c 라 는 main 시작 함수 가 있 습 니 다.
src / event, 이 디 렉 터 리 에 추상 적 인 이벤트 와 관련 된 구조 와 갈고리 함 수 를 저장 합 니 다.nginx 는 이벤트 구동 처리 프로 세 스 입 니 다. 사건 은 당연히 전체 시스템 의 핵심 입 니 다. 여기 서 가장 핵심 적 인 ngx 를 정의 합 니 다.event_s 구조.
src / event / modules 디 렉 터 리 는 epoll, kqueue, poll, ao, select 등 구체 적 인 이벤트 구동 방식 을 저장 합 니 다.event_actions_t 구조 체 의 갈 고 리 는 nginx 에 걸 려 있다.nginx 가 시 작 될 때 설정 에 따라 어떤 실현 방식 을 사용 할 지 결정 합 니 다.
src / os / unix 에는 유 닉 스 시스템 의 많은 함수 호출 유 닉 스 가 저장 되 어 있 습 니 다.
src / http 디 렉 터 리 는 http module 에 저 장 됩 니 다. 이 module 은 http 요청 을 처리 합 니 다. 프로 토 콜 의 해석 과 backend server 에 접근 하 는 코드 를 포함 합 니 다.
src / http / module 디 렉 터 리 는 http module 형식의 특정한 용도 의 module 을 저장 합 니 다. 예 를 들 어 gzip 처리 암호 화, 이미지 압축 등 입 니 다.
초보 적 으로 알 고 나 서 main 함수 로 돌아 가서 우리 가 관심 있 는 일 을 순서대로 보 세 요.그것 은 먼저 ngx 를 집행 했다.time_init, 왜 시간 을 초기 화 합 니까?nginx 는 매우 주도면밀 하 게 고려 하고 있 습 니 다. 시스템 시간 gettimeofday 는 시스템 호출 입 니 다. 이것 은 Liux 커 널 에 중단 을 보 내야 하고 커 널 은 프로 세 스 간 전환 을 통 해 이 호출 을 처리 해 야 한 다 는 것 을 의미 합 니 다.이것 은 원 가 를 소홀히 해 서 는 안 되 는 함수 다.nginx 는 시간 함 수 를 봉인 합 니 다. 이렇게 해서 우리 가 처리 시간 이 필요 할 때마다 gettime of day 를 호출 하 는 것 이 아니 라 nginx 자체 캐 시 시간 입 니 다. 이렇게 하면 시스템 호출 을 대량으로 줄 이 고 현재 시간 을 취 하 는 것 은 누구나 좋아 하 는 일 입 니 다.
그렇다면 nginx 는 어떻게 자신의 시 계 를 유지 합 니까?어떻게 사용자 가 얻 은 현재 시간 이 의미 가 있다 는 것 을 보증 합 니까?nginx 디자이너 의 출발점 은 nginx 는 사건 구동 체제 로 사건 이 발생 할 때 바로 epoll 이다.wait 가 돌아 올 때 gettime of day 를 가 져 와 자신의 시간 을 업데이트 한 다음 각 이벤트 에 대응 하 는 처리 함 수 를 호출 합 니 다.이 함수 들 은 모두 자신 이 막 히 지 않 는 다 는 것 을 보증 합 니 다. 즉, 밀리초 급 의 처리 능력 입 니 다. 따라서 모든 사건 처리 함수 에서 얻 은 시간 은 이전 epoll 입 니 다.wait 가 막 돌 아 왔 을 때 얻 은 시간 은 몇 밀리초 느 려 도 상관없다.관건 은 모든 함수 가 막힘 이 없 으 므 로 신속하게 제어 권 을 nginx 에 돌려 주어 야 한 다 는 것 이다. 이것 은 기본 적 인 설계 원칙 이다.
main 함수 초기 화 시간 후 가장 핵심 적 인 데이터 구조 ngxcycle, 그 다음 에는 워 커 프로 세 스 든 master 프로 세 스 든 둘 러 싼 것 입 니 다.다음은, 우 리 는 ngx 에 관심 을 가 져 야 합 니 다.init_cycle 이 함수, 시작 과정 에서 대량의 작업 이 여기 서 이 루어 졌 습 니 다. 코드 는 열 리 지 않 습 니 다. 이 함 수 는 800 줄 이 고 매우 크 며 관건 도 볼 수 있 습 니 다.ngx_init_cycle 에서 하 는 첫 번 째 일 은 모든 nginx module 의 create 를 호출 하 는 것 입 니 다.conf 방법.자, 이제 야 다음 nginx module 이 무엇 인지 자세히 보 겠 습 니 다.
nginx 추상 화 ngxmodule_s 구 조 는 각 module, 각 module 이 흥 행 하 는 사건 을 처리 하 는 데 사용 된다.nginx 에는 모두 몇 개의 module 이 코드 에 쓰 여 있 는 것 이자 유연 하 게 설정 할 수 있 는 것 입 니 다. 하하, nginx 식 게임 방법 입 니 다.돌 이 켜 보면 nginx 소스 패 키 지 를 다운로드 한 후에 도 configure 작업 을 수행 해 야 합 니 다. 이 명령 은 Makefile 과 ngx 를 생 성 합 니 다.modules 파일, Makefile 은 어떤 module 소스 파일 을 컴 파일 할 지 결정 하고 생 성 된 ngxmodules. c 파일 은 컴 파일 된 실행 파일 이 어떤 module 을 사용 할 지 결정 합 니 다.ngx_modules. c 에 배열 ngx 생 성modules, 이것 은 전체 nginx 프로젝트 에서 사용 하 는 전역 변수 입 니 다. 그 형식 은 다음 과 같 습 니 다.
ngx_module_t *ngx_modules[] = {
&ngx_core_module,
&ngx_errlog_module,
&ngx_conf_module,
... ...
}
configure 를 통 해 생 성 된 전역 변 수 는 매우 중요 합 니 다. 요청 이 어떤 module 로 처 리 될 수 있 는 지 알 수 있 습 니 다.
다음 글, ngxinit_cycle 은 ngxmodules 배열 은 모든 module 의 create 를 호출 합 니 다.conf 방법 (각 module 은 이 방법 을 실현 할 지 여 부 를 결정 할 권리 가 있 습 니 다. 실현 되 지 않 으 면 당연히 호출 되 지 않 습 니 다).그리고 프로필 을 처리 하기 시 작 했 습 니 다. 여기 서 ngx 에 중점 을 두 어야 합 니 다.conf_parse 함수, 그 안에 ngx 가 호출 되 었 기 때 문 입 니 다.conf_handler 방법, ngxconf_handler 방법 은 각 모듈 에서 자신 이 실현 한 set 갈고리 함 수 를 호출 하여 각 모듈 이 자신 이 관심 있 는 설정 항목 을 처리 하도록 합 니 다.그래서 만약 에 ngix. conf 에 모듈 이 원 하 는 것 을 설정 하지 않 았 다 면 이 모듈 은 컴 파일 되 었 지만 계속 실행 되 지 않 았 을 것 입 니 다.여기 서 우 리 는 module 의 구 조 를 좀 봐 야 겠 다. 늘 말 만 해 서 는 안 된다.
struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;
... ...
void *ctx;
ngx_command_t *commands;
ngx_uint_t type;
ngx_int_t (*init_master)(ngx_log_t *log);
ngx_int_t (*init_module)(ngx_cycle_t *cycle);
ngx_int_t (*init_process)(ngx_cycle_t *cycle);
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
void (*exit_thread)(ngx_cycle_t *cycle);
void (*exit_process)(ngx_cycle_t *cycle);
void (*exit_master)(ngx_cycle_t *cycle);
... ...
};
ctx_index 는 우리 가 정의 하 는 module 이 문맥 배열 에서 의 번 호 를 나타 내 는데 index 는 ngx 에 있 음 을 나타 낸다.modules 라 는 배열 의 번호 입 니 다.
ctx 이 지침 은 module 의 컨 텍스트 를 가리 키 며 type 은 이 module 의 유형 (module 은 분류 되 어 있 으 며, 각 type 은 여러 module 이 있 을 수 있 습 니 다) 을 표시 합 니 다. 아래 8 개의 갈고리 함 수 는 해당 하 는 사건 이 발생 할 때 이 방법 을 호출 합 니 다 (물론 module 도 실현 되 지 않 을 수 있 습 니 다).commands 는 이 module 에 속 하 는 command 구 조 를 가리 키 고 있 습 니 다. 예 를 들 어 http module 은 자신의 command 를 이렇게 정의 합 니 다.
static ngx_command_t ngx_http_commands[] = {
{ ngx_string("http"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_http_block,
0,
0,
NULL },
ngx_null_command
};
우리 다시 보 자 ngxcommand_s 의 정의:
struct ngx_command_s {
ngx_str_t name;
ngx_uint_t type;
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
};
그래서 윗글 에서 말 했 듯 이, ngxconf_handler 방법 은 각 module 에서 스스로 실현 하 는 set 갈고리 함 수 를 호출 합 니 다. http module (기본 값) 을 컴 파일 하면 ngxconf_handler 방법 에서 위의 ngx 호출http_block 함수.이 ngxhttp_block 함 수 는 설정 파일 을 읽 고 http 포트 를 감청 할 지 결정 하기 때문에 이 정 보 를 전달 하 는 ngxconf_t 포인터 ngxcycle 이라는 핵심 변수.
ngx_event_core_module 도 핵심 module 입 니 다. 앞서 말 한 것 은 epoll, select, poll 또는 kquue 로 IO 다 중 재 활용 을 실현 하 는 것 입 니까? 바로 이 module 로 해결 한 것 입 니 다.
계속 아래로.ngx_init_cycle 함 수 는 모든 module 에서 실 현 된 init 를 호출 합 니 다.conf 갈고리 함수.그 후에 지금까지 nginx 프로 세 스 가 드디어 감청 포트 를 시작 합 니 다.이 일 은 매우 중요 합 니 다. 방금 각 module 의 set 갈고리 방법 을 호출 했 습 니 다. 예 를 들 어 http module 의 ngxhttp_block 방법, 이 방법 들 은 이미 ngxcycle 의 listening 배열 은 감청 이 필요 한 포트 에 끼 워 넣 었 다.왜 지금부터 들 어 요?아직 fork 에서 워 커 서브 프로 세 스 가 나 오지 않 았 기 때 문 입 니 다.Liux 시스템 에서 fork 에서 나 온 하위 프로 세 스 는 부모 프로 세 스 의 주소 공간 을 공유 하기 때문에 모든 worker 프로 세 스 에서 해 야 할 일 은 ngxinit_싸 이 클 에서 하 세 요.감청 핸들 은 모든 nginx worker 가 공유 하여 사용 합 니 다.
지정 한 포트 를 감청 한 후 모든 module 에서 실 현 된 init 를 호출 합 니 다.module 갈고리 함수.이제 프로 세 스 간 통신 을 준비 해 야 합 니 다.하나의 master, 여러 개의 worker, 이 프로 세 스 들 은 어떤 방식 으로 통신 합 니까?여 기 는 펼 치지 않 겠 습 니 다. 다음 에 다시 자세히 말씀 드 리 겠 습 니 다.그것들 도 공유 메모 리 를 통 해 데 이 터 를 교환 하 는데, 이때 공유 메모 리 를 초기 화하 기 시작한다.드디어, ngxinit_cycle 실행 완료, 한숨 돌리 기?
이 어 main 함수 가 신 호 량 을 초기 화 하려 면 프로 세 스 간 동기 화 는 신 호 량 을 통 해 이 루어 집 니 다.그리고 pidfile 을 만 듭 니 다. 이 파일 은 시작 이 끝 난 후에 nginx 명령 행 을 통 해 nginx 프로 세 스 에 신 호 량 을 보 내 제어 하 는 데 사 용 됩 니 다.main 함수 의 마지막, ngx 실행 시작master_process_cycle 함수 입 니 다. 이 함 수 는 master 프로 세 스 가 해 야 할 일 을 합 니 다.그것 은 먼저 ngx 를 호출 합 니 다.start_worker_processes 에서 worker 를 시작 합 니 다. 설정 파일 에 설 정 된 worker 수량 에 따라 fork 에서 여러 개의 하위 프로 세 스 를 실행 하고 모든 하위 프로 세 스 는 ngx 를 실행 합 니 다.worker_process_cycle 함수, 이것 은 순환 함수 입 니 다. 진정한 사용자 요청 을 처리 하기 시작 합 니 다.
ngx_master_process_cycle 함수 재 호출 ngxstart_cache_manager_processes 가 cache 의 관리 프로 세 스 를 시작 합 니 다. 이것 은 지면 에 한 정 됩 니 다. 다음 에 시간 이 있 으 면 다시 이야기 하 겠 습 니 다.마지막, ngxmaster_process_cycle 은 사 순환 에 들 어가 신 호 량 이 전 달 된 명령 을 받 고 모든 워 커 의 운행 상 태 를 감시 하기 시작 합 니 다. 워 커 가 비정상적 으로 죽 으 면 다시 끌 어 올 립 니 다.
마지막 으로 말씀 드 리 지만 저 는 nginx - 0.7.65 버 전 을 예 로 들 어 위 에 열 거 된 소스 코드 파일 은 모두 이 버 전 을 대상 으로 합 니 다.물론 내 가 말 한 이것들 은 모두 핵심 함수 인 데 사실은 1. x 버 전과 그 차이 가 매우 작다.
nginx 의 시작 과정 을 잘 알 고 어떤 일 을 했 는 지 알 면 worker 프로 세 스 가 사용자 의 요 구 를 어떻게 처리 하 는 지 연구 할 수 있 습 니 다.다음 에 얘 기 하 자.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.