nginx 학습 노트 4 (nginx 시작 할 때의 master 와 worker 프로 세 스)
3964 단어 nginx 학습
1. main 함수 마지막 에 설정 방식 에 따라 nginx 의 시작 형식 (단일 프로 세 스 또는 다 중 프로 세 스) 을 결정 합 니 다.
if (ngx_process == NGX_PROCESS_SINGLE) {
ngx_single_process_cycle(cycle);
} else {
ngx_master_process_cycle(cycle);
}
2. ngx 에서master_process_cycle 에서 먼저 신호 설정 관련 프로그램 을 완성 합 니 다.
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGINT);
sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"sigprocmask() failed");
}
sigemptyset(&set);
이 코드 는 일부 신 호 를 막 았 습 니 다. 이런 방식 을 통 해 뒤에 워 커 서브 프로 세 스 를 생 성 하 는 등 프로그램 이 신호 중단 의 영향 을 받 지 않도록 할 수 있 습 니 다.3.ngx_master_process_cycle 에서 fork 를 이용 하여 woker 서브 프로 세 스 를 생 성 합 니 다.
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
-------》
ngx_spawn_process(cycle, ngx_worker_process_cycle,
(void *) (intptr_t) i, "worker process", type);
--------》
pid = fork();
switch (pid) {
case -1:
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"fork() failed while spawning \"%s\"", name);
ngx_close_channel(ngx_processes[s].channel, cycle->log);
return NGX_INVALID_PID;
case 0:
ngx_pid = ngx_getpid();
proc(cycle, data);
break;
default:
break;
}
fork () 에서 나 온 하위 프로 세 스 는 proc (cycle, data) 를 호출 한 다음 해당 하 는 ngxworker_process_cycle 에서 사 순환 에 들어가다.주 프로 세 스 는 switch 에서 뛰 어 나 와 후속 작업 을 수행 합 니 다.4. 메 인 프로 세 스 가 발생 할 수 있 는 여러 가지 신호 에 대응 하기 위해 사 순환 에 들 어 갑 니 다.
for ( ;; ) {
if (delay) {
if (ngx_sigalrm) {
sigio = 0;
delay *= 2;
ngx_sigalrm = 0;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"termination cycle: %M", delay);
itv.it_interval.tv_sec = 0;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = delay / 1000;
itv.it_value.tv_usec = (delay % 1000 ) * 1000;
if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"setitimer() failed");
}
}
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend");
sigsuspend(&set);
ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"wake up, sigio %i", sigio);
if (ngx_reap) {
ngx_reap = 0;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");
live = ngx_reap_children(cycle);
}
............
물론 메 인 프로 세 스 는 상기 프로그램 을 반복 적 으로 실행 하 는 것 이 아니 라 siguspend 호출 을 통 해 master 프로 세 스 를 휴면 시 킨 다음 에 master 프로 세 스 가 신 호 를 받 고 다시 활성화 되 기 를 기다 리 는 것 입 니 다.여기 서 신 호 를 처리 하 는 방식 은 참고 할 만하 다. siguspend 방식 을 이용 하면 CPU 의 작업 효율 을 높 일 수 있다.nginx siguspend nginx siguspend 분석 참조http://weakyon.com/2015/05/14/learning-of-sigsuspend.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Nginx 업로드 파일 크기 제한 (온라인 문제)최근 에 새로운 시스템 이 출시 되 었 는데 어제 사용자 가 문 제 를 반 영 했 습 니 다. 파일 이 99% 에 올 라 간 후에 움 직 이지 않 아서 파일 을 올 릴 수 없습니다. 처음에 브 라 우 저 호환성 문제...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.